Pubblico, per l’utente Basilio de Caro questa guida sulla creazione di un demone Bluetooth, frutto del suo impegno
Zzed
Introduzione
Può essere utile, a volte, prevedere modalità di gestione del proprio Raspberry Pi che non utilizzino le comuni interfacce disponibili (monitor/tastiera o IP di rete).
Di seguito proveremo a realizzare un semplice demone, scritto in Python, che consenta di riavviare o spegnere il Raspberry Pi utilizzando l’interfaccia Bluetooth di bordo.
Gli strumenti che comporrannno la nostra ideale “cassetta degli attrezzi”, sono:
- un RaspberryPi, con attivo il modulo bluetooth,
- python 2.7,
- le librerie PyBluez, installabili mediante
apt install python-bluez
opip install pybluez
- un qualsiasi editor di testo per la creazione dello script.
Lo script Python
Lo script di esempio ridotto all’osso, ma integrabile a piacere con altre funzioni:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#!/usr/bin/env python import os, sys, time, bluetooth #================================================ bt1 = None; client1 = None; clientInfo1 = None; data = None # --------------------------------------------------------------------------------- try: bt1 = bluetooth.BluetoothSocket(bluetooth.RFCOMM) bt1.settimeout(1.5); bt1.bind(("",bluetooth.PORT_ANY)) bt1.listen(1) bluetooth.advertise_service( bt1, "helloService1", service_id="00001101-0000-1000-8000-00805F9B34FF", service_classes=[bluetooth.SERIAL_PORT_CLASS], profiles=[bluetooth.SERIAL_PORT_PROFILE]) exceptException, e: print "Errore interfaccia Bt: ", str(e) sys.exit(1) #endtry while 1: try: data = None if( client1 == None ): client1, clientInfo1 = bt1.accept() client1.settimeout(1.5) print 'Connessione instaurata col client ', clientInfo1 data = client1.recv(1024) else : data = client1.recv(1024) #endif ifdata: print "Ricevuto comando dal client ", client1.getpeername() if( data == "restart" ): bt1.close() os.system("/sbin/shutdown -r now") elif( data == "shutdown" ): bt1.close() os.system("/sbin/shutdown -h now") else : print "Comando non riconosciuto" #endif #endif exceptException, e: client1 = None print "Errore client Bt: ", str(e) #endtry time.sleep(int(1)) #wend |
Si compone di: una prima parte dove vengono effettuate le dichiarazioni, importati i moduli necessari e attivato il socket bluetooth. E di un corpo costituito da un ciclo infinito in cui vengono letti i dati dal socket ed eseguiti i comandi.
I moduli Python utilizzati
- os, libreria standard che si interfaccia col sistema operativo.
- sys, libreria dedicata alle funzioni specifiche del sistema.
- time, che espone le funzioni di manipolazione di data e ora.
- bluetooth, modulo Python dedicato alla gestione delle risorse Bluetooth del sistema.
Spiegazione
In dettaglio, nelle prime righe dello script importiamo i moduli e dichiariamo le variabili che utilizzeremo:
1 2 3 |
import os, sys, time, bluetooth #================================================ bt1 = None; client1 = None; clientInfo1 = None; data = None |
quindi dichiariamo un socket di tipo RFCOMM, protocollo che emula una interfaccia seriale su dispositivi Bluetooth:
1 |
bt1 = bluetooth.BluetoothSocket(bluetooth.RFCOMM) |
con timeout di connessione di un secondo e mezzo
1 |
bt1.settimeout(1.5); |
e lo lasciamo in attesa di connessioni senza indicare una porta specifica:
1 2 |
bt1.bind(("",bluetooth.PORT_ANY)) bt1.listen(1) |
Al servizio assegniamo un id ed un nome che dovranno poi essere utilizzati dai client in fase di connessione e autenticazione:
1 2 3 4 5 |
bluetooth.advertise_service( bt1, "helloService1", service_id="00001101-0000-1000-8000-00805F9B34FF", service_classes=[bluetooth.SERIAL_PORT_CLASS], profiles=[bluetooth.SERIAL_PORT_PROFILE]) |
Nel corpo dello script sono invece utilizzati i metodi che consentono di instaurare una connessione:
1 |
client1, clientInfo1 = bt1.accept() |
e ricevere i comandi dal client, lunghi al massimo 1024 byte nel nostro caso:
1 |
data = client1.recv(1024) |
Lo script è volutamente privo di meccanismi di autenticazione più complessi, che però possono, anzi dovrebbero, essere previsti.
Link
Ultima nota, la descrizione di dettaglio delle API PyBluez è disponibile a questo link.
Se vuoi restare aggiornato, seguici anche sui nostri social: Facebook, Twitter, Youtube
Se vuoi anche trovare prodotti e accessori Raspberry Pi in offerta, seguici anche su Telegram !!