Dacă doreați să vă creați propria aplicație Android pentru a vă conecta la un serviciu Python, prin Bluetooth, pentru a controla un Raspberry Pi, tocmai ați găsit toate resursele necesare. Știu că există o mulțime de aplicații care controlează un Raspberry Pi. Cele mai multe dintre ele se conectează prin SSH, iar unele dintre ele utilizează Bluetooth. Cu toate acestea, găsirea unui tutorial care acoperă tot nu e chiar așa de ușor. Probabil că puteți să vă documentați pe cont propriu așa cum am făcut și eu dar nu vă garantez că o să găsiți toate informațiile în același loc.
Motivație
Scopul meu este de a împărtăși cunoștințele pe care le-am adunat și de a vă oferi un cod sursă de bază care vă pune pe calea cea bună. Vă voi învăța cum să scrieți un serviciu ușor de extins scris în Python și o aplicație Android pentru a vă conecta la el. Toată comunicarea se va întâmpla prin Bluetooth, eliminând astfel necesitatea unei conexiuni WiFi.
De asemenea, acest articol este locul perfect pentru a vă iniția în programarea Bluetooth folosind Python . De asemenea, puteți obține o privire de bază despre dezvoltarea aplicațiilor în Xamarin, deoarece aplicația Android este scrisă pe această platformă.
Întregul cod sursă este disponibil pe contul meu GitHub la https://github.com/levifuksz/raspibt
De ce aveți nevoie
Pentru a dezvolta serviciul Python și aplicația Android, sunt necesare anumite abilități de bază în proramare. Am încercat să păstrez codul ușor de urmărit și bine documentat, dar un pic de experiență întotdeauna ajută. Pentru partea de serviciu Python puteți utiliza editorul dvs. preferat pentru a scrie codul. Cu toate acestea, pentru aplicația Android veți avea nevoie de ceva mai mult de atât.
În primul rând, aveți nevoie de Visual Studio . Puteți descărca gratuit versiunea comunitară 2017 de pe site-ul Microsoft. Iată link-ul către pagina de descărcare:
https://www.visualstudio.com/
Asigurați-vă că, atunci când instalați Visual Studio 2017, instalați de asemenea platforma Xamarin așa cum se vede în imaginea de mai jos.
Platforma Xamarin poate fi instalată de asemenea separat. Acest lucru este util când aveți deja instalat Visual Studio 2017 sau aveți o versiune mai veche. Găsiți platforma la:
https://www.xamarin.com/platform
Configurări la nivel de Raspberry Pi
Porniți un terminal și începeți prin actualizarea pachetelor de pe Raspbian
sudo apt-get update && sudo apt-get upgrade
Serviciul Python utilizează extensia Pybluez și o puteți găsi la.
https://karulis.github.io/pybluez/
Pybluez necesită două pachete software suplimentare. Acestea sunt Biblioteca de Dezvoltare Python și Biblioteca de Dezvoltare Bluetooth. Puteți să le obțineți pe amândouă utilizând:
sudo apt-get install python-dev libbluetooth-dev
Puteți instala Pybluez folosind PIP, sistemul de gestionare a pachetelor Python, așa că doar tastați:
sudo pip install pybluez
Pentru ca serviciul Python Bluetooth să funcționeze, va trebui să încărcăm profilul de port serial. Acest profil poate să fie folosit doar în cazul în care serviciul Bluetooth funcționează în mod compatibilitate. Începeți prin editarea parametrilor de pornire a serviciului Bluetooth în fișierul său de configurare:
sudo nano /etc/systemd/system/dbus-org.bluez.service
Doar adăugați un -C după bluetoothd. Linia ar trebui să arate ca și cea de mai jos:
ExecStart=/usr/lib/bluetooth/bluetoothd -C
Acum reîncărcați configurația serviciului și reporniți serviciul Bluetooth cu următoarele două comenzi:
sudo systemctl daemon-reload sudo systemctl restart dbus-org.bluez.service
În cele din urmă, puteți încărca profilul de port serial prin comanda:
sudo sdptool add SP
În cazul în care totul e în regulă trebuie să vedeți mesajul Serial Port service registered care vă spune că operațiunea a avut succes.
Serviciul Python
Codul sursă pentru acest serviciu se găsește la raspibtsrv.py.
Logarea mesajelor
Primele linii configurează logarea mesajelor din script. Deoarece intenția noastră este să rulăm acest script ca și un serviciu, toate mesajele la consolă trebuie să fie scrise în fișiere. Cea mai simplă modalitate prin care putem realiza acest lucru este redirecționarea fluxurilor standard de ieșire și de eroare. Codul din funcția setup_logging începând cu linia 22 face exact acest lucru. Această funcționalitate a fost inspirată de articolul pe care la scris Stephen C. Phillips la
Getting a Python script to run in the background (as a service) on boot
Toate mesajele sunt salvate în „/var/log/raspibtsrv.log” în mod implicit. Calea poate fi modificată cu ajutorul unui parametru de script. Fișierele de jurnal se rotesc la miezul nopții și se păstrează doar ultimele trei. Se adaugă, de asemenea, data și ora precum și nivelul de severitate pentru fiecare mesaj. Simțiți-vă liber să schimbați acest cod în funcție de preferințe.
Configurări Bluetooth
Magia din script se întâmplă în funcția main începând cu linia 70. Primele câteva linii creează un nou socket Bluetooth folosind protocolul RFCOM și îl leagă de primul adaptor și port disponibil.
# Create a new server socket using RFCOMM protocol server_sock = BluetoothSocket(RFCOMM) # Bind to any port server_sock.bind(("", PORT_ANY)) # Start listening server_sock.listen(1)
Deoarece mai multe „servere” Bluetooth pot rula pe un singur adaptor, este nevoie să ne identificăm serviciul folosind ceva unic. Acest lucru se întâmplă pe liniile 80 și 83. Aici este publicat un UUID, astfel încât orice client care cunoaște acest UUID se poate conecta. Aceeași valoare pentru UUID-ul de serviciu este utilizată în aplicația Android. Prin urmare, dacă decideți să o modificați, vă rog să o faceți în ambele locuri.
# The service UUID to advertise uuid = "7be1fcb3-5776-42fb-91fd-2ee7b5bbb86d" # Start advertising the service advertise_service(server_sock, "RaspiBtSrv", service_id=uuid, service_classes=[uuid, SERIAL_PORT_CLASS], profiles=[SERIAL_PORT_PROFILE])
Citirea comenzilor
Următorul pas este primirea comenzilor de la client. Pentru fiecare comandă se execută ceva specific și apoi se răspunde cu un mesaj. Lista comenzilor acceptate de script este declarată pe linia 90. Există, de asemenea, o comandă specială, „getop”, care returnează toate comenzile suportate. Simțiți-vă liber să adăugați mai multe comenzi în funcție de nevoi. Pe baza a ceea ce scriptul primește pe linia 105 acționează începând de la linia 112. Aici puteți adăuga propria logică de tratare a comenzilor adăugate eventual de către voi.
# Read the data sent by the client data = client_sock.recv(1024) if len(data) == 0: break print "Received [%s]" % data # Handle the request if data == "getop": response = "op:%s" % ",".join(operations) elif data == "ping": response = "msg:Pong" elif data == "example": response = "msg:This is an example" # Insert more here else: response = "msg:Not supported" client_sock.send(response) print "Sent back [%s]" % response
Pornirea serviciului la pornirea sistemului de operare
Următoarea parte a tutorialului presupune că scriptul Python este plasat într-un fișier numit raspibtsrv.py în directorul /home/pi/raspibtsrv/.
Vrem să controlam un Raspberry Pi prin Bluetooth fără alte interacțiuni. Prin urmare, scriptul nostru Python care conține serviciul Bluetooth trebuie să pornească la pornirea sistemului. Cel mai bun mod prin care putem realiza acest lucru este crearea unui fișier unitate pentru systemd. Acest fișier unitate se va încărca la pornirea sistemului și va executa scriptul nostru Python.
Începeți prin marcarea scriptului Python ca executabil
sudo chmod +x /home/pi/raspibtsrv/raspibtsrv.py
Creați fișierul unitate pentru systemd
sudo nano /etc/systemd/system/raspibtsrv.service
Inserați codul următor (de asemenea, modificați căile, dacă este necesar)
[Unit] Description=Raspberry PI Bluetooth Server After=bluetooth.target [Service] Type=simple User=root Group=root WorkingDirectory=/home/pi/raspibtsrv ExecStart=/home/pi/raspibtsrv/raspibtsrv.py -l /home/pi/raspibtsrv/raspibtsrv.log [Install] WantedBy=multi-user.target
Acum este timpul să reîncărcați configurația pentru systemd și să activați pornirea automată a noului serviciu
sudo systemctl daemon-reload sudo systemctl enable raspibtsrv.service
În cele din urmă, pentru a verifica dacă totul este bine, trebuie să reporniți Raspberry Pi.
sudo reboot
După ce dispozitivul a repornit, verificați starea serviciului utilizând:
sudo systemctl status raspibtsrv.service
Serviciul nostru ar trebui să fie marcat ca active (running).
De asemenea, puteți verifica fișierul jurnal pentru a vedea dacă a fost creat. Fișierul jurnal trebuie să conțină mesajul care spune că serviciul nostru așteaptă conexiuni.
cat /home/pi/raspibtsrv/raspibtsrv.log
Aplicația Android
Puteți obține aplicația Android care comunică cu serviciul Python pe care tocmai l-am creat de la https://github.com/levifuksz/raspibt/tree/master/android-app
După cum am menționat mai devreme, aveți nevoie de Visual Studio cu Xamarin instalat pentru a compila codul. La fel ca și codul din serviciul Python, codul din această aplicație este destul de bine documentat. Cele mai multe funcționalități se regăsesc în două fișiere: BtDiscovery.cs și BtClient.cs. Ambele sunt situate în folderul Services din proiectul RasPiBtControl.Android.
Singurul lucru pe care trebuie să îl modificați este UUID-ul de serviciu din Model\BtDeviceInfo.cs. Acest lucru trebuie să se potrivească cu UUID din scriptul Python. Dacă nu l-ați modificat în script, lăsați-l neschimbat și aici.
Aplicația funcționează numai dacă ați împerecheat telefonul cu Raspberry Pi prin Bluetooth. Faceți „pair device” înainte de utiliza aplicația.
De asemenea, dacă doriți să extindeți funcționalitatea aplicației și să acceptați alte mesaje de la serviciul Python editați fișierul LandingPageViewModel.cs începând cu linia 168.
În concluzie, nu este nevoie de o soluție complicată pentru a controla un Raspberry Pi cu telefonul, tot ce aveți nevoie este un simplu script Python și o aplicație Android la fel de simplă.
T3ZlciBBbmQgT3V0IQ==
Be First to Comment