Controlați un Raspberry Pi cu Android prin Bluetooth

Controlați un Raspberry PiDacă 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==

Articole recente

Be First to Comment

Lasă un răspuns

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.