2014-09-11 24 views
13

Sto lavorando alla configurazione di due sistemi Linux per una demo BLE. Ovviamente un sistema sarà la periferica e uno sarà il dispositivo centrale. Ho diverse domande su entrambe queste configurazioni.Come implementare Bluetooth LE con Bluez in Linux

Ambiente

Impostazione dispositivo periferico

Il primo ordine del giorno è ottenere la configurazione del sistema periferico e pubblicità con un server GATT configurato. A questo punto, non sembra possibile configurare un server GATT dalla riga di comando. Quindi, mentre è un compito semplice portare un dongle USB e pubblicizzarlo, questo non consente la creazione di servizi e caratteristiche personalizzate. L'unico esempio di un server GATT che ho trovato era il file gatt-example.c nel pacchetto Bluez. Così ho scaricato e creato l'ultima fonte bluez-5.23. (http://www.linuxfromscratch.org/blfs/view/svn/general/bluez.html). Inoltre configurato utilizzando il flag --enable-maintainer-mode per forzare la compilazione del plugin gatt-example.c in bluetoothd. E ho convalidato post-build dalla directory ~/bluez-5.23/plugins che esisteva un file bluetoothd-gat-example.o. Il che mi dice che l'esempio gatt è stato realizzato almeno con successo.

Ho quindi modificato il file di configurazione per abilitare LE e il server degli attributi.

$ sudo vi /etc/bluetooth/main.conf 
EnableLE = true   // Enable Low Energy support. Default is false. 
AttributeServer = true // Enable the GATT attribute server. Default is false. 

Poi basta riavviare o riavviare il demone bluetooth ...

Setup Device Central

Come il dispositivo centrale non ha bisogno di alcun plugin speciali costruite come la periferica, ho appena installato bluez utilizzando apt-get. Questo sembra aver installato v4.101 secondo bluetoothd -v.

Session Setup

processo la connessione, quindi dovrebbe essere abbastanza semplice. I ha installato la periferica per pubblicizzare e poi connettersi con il dispositivo centrale:

periferica:

$ sudo hciconfig hci0 up  // Make sure the interface is up 
$ sudo hciconfig hci0 leadv  // Set the interface to advertise 

Centrale:

$ sudo hcitool -i hci0 lescan // Scan for nearby devices advertising 
LE Scan ... 
00:02:72:C9:5E:0F (unknown)  // Not sure why two of the same MAC are found? 
00:02:72:C9:5E:0F (unknown)  // but I know this is my device... 

$ sudo gatttool -i hci0 -b 00:02:72:C9:5E:0F -m 48 --interactive  // Connect interactively 
[ ][00:02:72:C9:5E:0F][LE]> connect 
[CON][00:02:72:C9:5E:0F][LE]> primary 
attr handle: 0x0001, end grp handle: 0x0008 uuid: 00001800-0000-1000-8000-00805f9b34fb 
attr handle: 0x0010, end grp handle: 0x0010 uuid: 00001801-0000-1000-8000-00805f9b34fb 
[CON][00:02:72:C9:5E:0F][LE]> characteristics 
handle: 0x0004, char properties: 0x02, char value handle: 0x0006, uuid: 00002a00-0000-1000-8000-00805f9b34fb 
handle: 0x0007, char properties: 0x02, char value handle: 0x0008, uuid: 00002a01-0000-1000-8000-00805f9b34fb 

E noi non vediamo uno dei servizi o le caratteristiche del gatt- esempio sono disponibili.

Domande

dispositivo --Peripheral

  1. Come potrei fare per creare il mio server GATT personalizzato? Può essere un'applicazione C stand-alone o deve essere incorporata in bluetoothd come plugin come il gatt-example?La risposta a questa domanda (Creating a Gatt Server?) implica che tu faccia quanto segue: "inizia inizializzando la libreria GATT e moduli aggiuntivi" e poi "registra il tuo database GATT". Ma non c'è un solo esempio su come implementare queste dichiarazioni generiche e il link fornito è semplicemente un URL del sito Web di Bluetooth.
  2. Le specifiche GATT (https://developer.bluetooth.org/gatt/Pages/default.aspx) forniscono numerosi servizi e caratteristiche "adottati" che sono scaricabili in formato XML. Ma non ci sono istruzioni su come usarli ?!
  3. Come si esegue una convalida del mio server GATT?

dispositivo --Central

  1. Perché il mio dispositivo centrale non vedere i servizi e le caratteristiche dal server GATT in esecuzione sul periferica?

Posso fornire qualsiasi informazione aggiuntiva necessaria. Grazie.

+0

Invece di utilizzare BlueZ direttamente si potrebbe desiderare di considerare l'utilizzo di una libreria di livello superiore come [Noble] (https://github.com/sandeepmistry/noble) e [Bleno] (https://github.com/ sandeepmistry/bleno) – jfhc

+0

@jfhc Non ce n'è davvero bisogno, poiché BlueZ implementa due API per la sua funzionalità, una delle quali è di altissimo livello ('DBus') – Zimano

risposta

2

creare un server GATT in un processo separato si ha (almeno) due casi:

  • Bluez v4.x: il servizio GATT deve essere un plugin Bluez
  • v5.x Bluez: la tua Il servizio GATT dovrebbe utilizzare la nuova API Gatt DBus (ma si consiglia di utilizzare almeno Bluez v5.39 (da aprile 2016), altrimenti è più sicuro (in termini di API Gatt Server Bluez) utilizzare l'approccio del plug-in Bluez v4.x.

Se il dispositivo centrale non vede il servizio GATT appena esportato è probabilmente un problema sul periphal piuttosto che essere un problema sul dispositivo centrale. Quando sarà necessario implementare il client GATT sul Device Central avete ancora due casi:

  • Bluez v4.x: Bluez non espone l'API GATT. O usi uno script di shell per lanciare i comandi gatttool, o usi una libreria GATT come gattlib per interagire con il dispositivo BLE
  • Bluez v5.x: Stessa cosa, se non puoi migrare a Bluez v5.39 allora è meglio utilizzare la metodologia Bluez v4.x.