2013-04-25 18 views
5

Attualmente sto tentando di connettermi a più dispositivi BLE usando BlueZ 5.0 e Linux. Ho un adattatore BLE host e ho modificato il gatttool per connettersi ed eseguire questa funzione. Se eseguo un'istanza del gatttool modificato, collego e ricevo correttamente i dati di notifica dal dispositivo BLE. Se eseguo un'altra istanza del gatttool modificato e mi collego a un altro dispositivo BLE, questa applicazione inizia a ricevere i dati di notifica da entrambi i dispositivi BLE e l'applicazione iniziale non riceve più alcun dato. Credo che ciò sia dovuto alla configurazione del socket, in cui entrambe le applicazioni stanno configurando i loro socket allo stesso indirizzo e PSM (l'ultima istanza riceve i dati mentre l'altro è affamato). C'è un modo per prevenire questa condizione? Idealmente, voglio che un'applicazione si connetta a più dispositivi. Suppongo che l'applicazione possa avere un solo socket per il motivo che più socket avranno lo stesso problema delle multiple istanze di cui sopra. Il mio dispositivo BLE è un telecomando TI CC2540 che funge da monitor di frequenza cardiaca.Connessioni BLE multiple che utilizzano Linux e Bluez 5.0

+0

Non è questo quello che vuoi? Se vuoi che un'applicazione si connetta a più dispositivi, puoi farlo attraverso un singolo socket. Credo che ogni messaggio arrivi con l'indirizzo BT del dispositivo in modo da poterlo associare al dispositivo giusto. –

+0

Ora capisco che dovrei usare un socket. L'handle di connessione ACL deve essere utilizzato per separare i dati. Ho difficoltà ad accedere a questo handle tramite BlueZ. socket (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) crea il socket. connect (calzino, (struct sockaddr *) e addr, sizeof (addr)) collega il socket. Accedere all'handle utilizzando ioctl (socket, HCIGETCONNINFO, cr) restituisce un errore 2 (nessun file). L'indirizzo di destinazione è corretto. Il mio socket creato sopra restituisce un valore di 5 mentre il socket = hci_open_dev (dev_id) restituisce il valore di 6. Esiste un modo migliore per ottenere questo handle. – user2321427

+1

Il metodo ioctl (socket, HCIGETCONNINFO, cr) funziona bene per i dispositivi bluetooth classici ma non per i dispositivi BLE. Ho bisogno di un metodo per accedere all'handle dei dati ACL per un dispositivo BLE ai fini dell'accoppiamento dei dati. Questo è possibile con BlueZ? – user2321427

risposta

2

ho iniziato una risposta così ho potuto avere più spazio ...

sto usando una combinazione di Python e C per ottenere il mio codice per lavorare, quindi il mio "codice" può sembrare divertente, perché potrebbe essere da entrambi. Inoltre, ho usato Bluez 4 in quanto il 5 non supportava il kernel che stavo usando. Fammi sapere se c'è un problema e posso chiarire.

Sembra che ci siano diversi modi di fare le cose, ma ho finito per aprire prese separate per compiti diversi. È possibile può aprire un singolo socket e quindi impostare le opzioni di socket per rimuovere il filtro e si dovrebbero ottenere tutti i pacchetti in un unico punto. Tuttavia, quello era il mio modo iniziale di farlo e ho scoperto che le mie connessioni sarebbero morte in pochi secondi.

Per cercare i collegamenti, ho aperto un socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI) e poi un bind sul dispositivo 0. (è disponibile una funzione chiamata hci_get_route per ottenere un numero di dispositivo disponibile) È quindi possibile chiamare hci_le_set_scan_parameters per impostare le opzioni, setsockopt(SOL_HCI, HCI_FILTER, filter) per ottenere solo gli eventi di scansione LE, quindi chiamare hci_le_set_scan_enable per attivare la scansione.

Ogni connessione del dispositivo è stata effettuata con un socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP) che viene quindi comunicato per connettersi a un particolare dispositivo chiamando lo connect sul socket con uno struct sockaddr_l2 che contiene il particolare indirizzo del dispositivo. Su quel socket si dovrebbero ricevere solo pacchetti da quel dispositivo. (un avvertimento ... ho scoperto che il mio dongle non avrebbe permesso una connessione mentre era in corso la scansione attiva. Ho dovuto spegnerlo temporaneamente prima di connetterlo e poi riaccenderlo. Altrimenti ho ricevuto un errore BUSY da errno)

Dopo aver detto tutto questo, anche se ... Penso che il modo in cui si suppone di fare tutto in Bluez 5 è usare DBUS. Sfortunatamente quella non era un'opzione per quello che stavo facendo. Le funzioni che ho citato sono nella lib condivisa che apparentemente non è installata di default in 5 (devi chiedere esplicitamente di installarla con configure). Hanno smesso di installare la lib condivisa di default perché volevano incoraggiare le persone a usare DBUS.

+0

Mi piacerebbe inizialmente risolvere questo problema non usando DBUS. Ho bisogno di recuperare l'handle associato ai dati del socket in ingresso in modo da poter associare i dati con la connessione corretta. La chiamata ioctl (socket, HCIGETCONNINFO, cr) non funziona per i dispositivi BLE. Avete un metodo per accedere alle informazioni sulla maniglia associate alla connessione e ai dati in arrivo? – user2321427

+0

Non sono sicuro di aver capito ... Non stai iniziando la connessione? Non avresti già la maniglia in quel caso e sai a cosa ti sei collegato? –

+1

Quando eseguo connect (socket, (struct sockaddr *) e addr, sizeof (addr)), viene restituito un valore 0 che indica che la connessione socket è stata effettuata. Se eseguo hcidump allo stesso tempo, vedo che l'handle 1025 è assegnato alla connessione. Ulteriori transazioni di dati per quella connessione utilizzano quell'handle. Sto cercando di accedere a quella maniglia. – user2321427

1

ABBIAMO combinato il codice da hcitool e gattol. Il codice funziona bene per 2 dispositivi (scansione, hci_le_create_conn e gatt_connect). Credo che non ci siano limitazioni sul numero di dispositivi utilizzati.

1 Start cmd_lescan (from hcitool.c) 
2.For each device scanned - 
     cmd_lecc (from hcitool.c) 
     gatt_connect (from gatttool.c) 

In questo modo un processo può gestire più dispositivi BLE.Non è necessario spegnere la scansione, avere solo ignorare i messaggi non pubblicità:

 if (meta->subevent != 0x02) 
       continue; 

Grazie e in attesa di commenti.

+0

Puoi spiegare perché stai facendo due connessioni a uno stesso dispositivo usando cmd_lecc e GATT_connect? – abhiarora

Problemi correlati