- Stiamo cercando di rilevare un evento in C/C++.
- Usiamo Bluez su Linux come libreria Bluetooth.
- Il nostro obiettivo è eseguire uno script esterno quando viene attivato quell'evento.
- In particolare, abbiamo un auricolare Motorola H730, con un pulsante su di esso, e stiamo cercando di rilevare la pressione di tale pulsante.
- Abbiamo associato il dispositivo bluetooth (hcitool) e ci possiamo connettere ad esso (bluez-test-audio), ma saremmo interessati a migrare tale approccio a C/C++.
L'uscita hcidump quando il dispositivo è collegato e viene premuto il pulsante è:Bluetooth: Rileva evento utilizzando Bluez
HCI ventosa - Bluetooth analizzatore di pacchetti ver 2.2
dispositivo: hci0 snap_len 1028 filtro: 0xffffffffHCI evento: Cambia modalità (0x14) plen 6
stato 0x00 gestiscono 21 modalità intervallo 0x00 0
modo: attivo dati
ACL: gestire 21 bandiere 0x02 dlen 17
L2CAP (d): cid 0x0041 len 13 [PSM 0]
< ACL dati: maniglia 21 flags 0x00 dlen 14
L2CAP (d): cid 0x0047 len 10 [PSM 0]
< ACL dati: maniglia 21 flags 0x00 dlen 22
L2CAP (d): cid 0x0047 len 18 [PSM 0] dati
< ACL: ansa 21 flags 0x00 dlen 22
L2CAP (d): cid 0x0047 len 18 [PSM 0]
HCI evento : Numero di pacchetti completati (0x13) plen 5
handle 21 pacchetti 1
dati 10 ACL: ansa 21 flags 0x02 dlen 18
L2CAP (d): cid 0x0041 len 14 [PSM 0]
< ACL dati: maniglia 21 flags 0x00 dlen 14
L2CAP (d): cid 0x0047 len 10 [psm 0]
HCI evento: numero di pacchetti completata (0x13) plen 5
maniglia 21 pacchetti 1
HCI evento: Numero di pacchetti completati (0x13) Plen 5
impugnatura 21 pacchetti 1
HCI evento: Numero Completato pacchetti (0x13) Plen 5
maniglia 21 pacchetti 1
HCI evento: Cambia modalità (0x14) plen 6
stato 0x00 gestiscono 21 modalità intervallo 0x02 Modo 2048
: Sniff- Abbiamo cercato la documentazione bluetooth e non hanno avuto molto successo.
Come possiamo rilevare un evento bluetooth in C/C++ usando Bluez?
risposta
hcidump come raccolti sono i registri tra l'host del dispositivo e il controller. Gli eventi sono quelli che il controller ha inviato all'host del dispositivo e i comandi sono le richieste/risposte invia all'host del dispositivo.
Bluez guida di programmazione: http://people.csail.mit.edu/albert/bluez-intro/
ho fatto qualcosa di simile l'anno scorso. L'approccio che ho scelto è stato quello di utilizzare libdbus-c++ per generare oggetti/classi proxy C++ per comunicare con bluez via dbus.
- Determinare le interfacce Bluetooth implementate dall'auricolare. Ho usato d-feet e ho esplorato il dispositivo quando è stato collegato. È possibile controllare manualmente e leggere lo stato dall'auricolare qui, questo è stato utile per il debug.
- Generare, trovare o creare le descrizioni dbus xml delle interfacce richieste. L'ho fatto manualmente traducendo le specifiche API da bluez api documentation a xml, ma credo che potresti anche crearle con dbus introspection.
- Usa dbusxx-xml2cpp per generare proxy di oggetti
- Determinare il callback che viene chiamata quando viene premuto il pulsante
- Integrare gli oggetti nel vostro codice proxy come richiesto
Sarà necessario collegare il codice per libdbus- C++ e installarlo anche sul target.
È possibile utilizzare gli oggetti proxy generati per accedere a tutte le funzionalità dell'auricolare, potrebbe rivelarsi utile per molto più di una semplice pressione di un pulsante!
Hai avuto successo? – Schrieveslaach