2013-04-25 4 views
5

Ich versuche derzeit, mit BlueZ 5.0 und Linux eine Verbindung zu mehreren BLE-Geräten herzustellen. Ich habe einen Host-BLE-Adapter und ich habe das Gattool geändert, um eine Verbindung herzustellen und diese Funktion auszuführen. Wenn ich eine Instanz des modifizierten Gattools ausführe, verbinde ich erfolgreich Benachrichtigungsdaten vom BLE-Gerät und empfange diese. Wenn ich eine andere Instanz des modifizierten Gattools ausführe und eine Verbindung zu einem anderen BLE-Gerät herstelle, empfängt diese Anwendung Benachrichtigungsdaten von beiden BLE-Geräten und die ursprüngliche Anwendung erhält keine Daten mehr. Ich glaube, das liegt an dem Socket-Setup, bei dem beide Anwendungen ihre Sockets auf die gleiche Adresse und das gleiche PSM konfigurieren (die neueste Instanz empfängt die Daten, während die andere gehungert wird). Gibt es eine Möglichkeit, diesen Zustand zu verhindern? Idealerweise möchte ich, dass eine Anwendung eine Verbindung zu mehreren Geräten herstellt. Ich nehme an, dass die Anwendung nur einen Socket haben kann, weil mehrere Sockets das gleiche Problem haben wie die oben genannten Instanzen. Mein BLE-Gerät ist ein TI CC2540 Keyfob, der als Herzfrequenzmonitor fungiert.Mehrere BLE-Verbindungen mit Linux und Bluez 5.0

+0

Wollen Sie das nicht? Wenn Sie möchten, dass eine Anwendung eine Verbindung zu mehreren Geräten herstellt, können Sie dies über einen einzelnen Socket tun. Ich glaube, jede Nachricht kommt mit der BT-Adresse des Geräts durch, damit Sie sie mit dem richtigen Gerät verknüpfen können. –

+0

Ich verstehe jetzt, dass ich eine Steckdose verwenden sollte. Der ACL-Verbindungshandle sollte verwendet werden, um die Daten zu trennen. Ich habe Schwierigkeiten, über BlueZ auf dieses Handle zuzugreifen. Socket (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) erstellt den Socket. connect (sock, (struct sockaddr *) & addr, sizeof (addr)) verbindet den Socket. Der Zugriff auf das Handle mit ioctl (Socket, HCIGETCONNINFO, cr) gibt ein errno 2 (keine Datei) zurück. Die Zieladresse ist korrekt. Mein oben erstellter Socket gibt einen Wert von 5 zurück, während der Socket = hci_open_dev (dev_id) den Wert 6 zurückgibt. Gibt es einen besseren Weg, dieses Handle zu erhalten? – user2321427

+1

Die Methode ioctl (Socket, HCIGETCONNINFO, cr) funktioniert gut für klassische Bluetooth-Geräte, aber nicht für BLE-Geräte. Ich benötige eine Methode, um auf das ACL-Datenhandle für ein BLE-Gerät zu Datenpaarungszwecken zuzugreifen. Ist das mit BlueZ möglich? – user2321427

Antwort

2

begann ich eine Antwort, so konnte ich mehr Platz ...

Ich bin eine Kombination aus Python und C mit meinem Code zu bekommen, zu arbeiten, damit mein „Code“ mag komisch aussehen, weil es sein könnte von beiden. Außerdem habe ich Bluez 4 verwendet, da die 5 den Kernel, den ich benutzte, nicht unterstützte. Lassen Sie es mich wissen, wenn es ein Problem gibt, und ich kann es klären.

Es scheint, als gäbe es mehrere Möglichkeiten, Dinge zu tun, aber am Ende öffne ich separate Sockets für verschiedene Aufgaben. Sie können öffnen Sie einen einzelnen Socket und stellen Sie dann die Socket-Optionen, um die Filterung abzunehmen und Sie sollten alle Pakete an einem Ort bekommen. Dies war jedoch meine anfängliche Art, dies zu tun, und ich fand, dass meine Verbindungen innerhalb von Sekunden sterben würden.

Um nach Verbindungen zu suchen, öffnete ich eine socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI) dann tat eine bind auf Gerät 0. (Es gibt eine Funktion namens hci_get_route, um eine verfügbare Gerätenummer zu erhalten.) Sie können dann hci_le_set_scan_parameters aufrufen, um Optionen einzustellen, setsockopt(SOL_HCI, HCI_FILTER, filter), um LE-Scanereignisse zu erhalten, und dann hci_le_set_scan_enable aufrufen, um den Scanvorgang zu aktivieren.

Jedes Gerät Verbindung wurde mit einem socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP) gemacht, die Sie dann zu einem bestimmten Gerät verbinden erzählen von connect auf dem Sockel mit einem struct sockaddr_l2 Aufruf, der die bestimmte Geräteadresse in ihm hat. Auf diesem Socket sollten Sie nur Pakete von diesem Gerät erhalten. (Ein Vorbehalt ... Ich habe festgestellt, dass mein Dongle während des aktiven Scans keine Verbindung zulassen würde. Ich musste ihn kurz vor dem Anschließen vorübergehend abschalten und dann wieder einschalten. Sonst habe ich einen Fehler bei ERRNO bekommen)

Nachdem ich das alles gesagt habe, denke ich, dass du alles in Bluez 5 machen sollst, um DBUS zu benutzen. Leider war das nicht wirklich eine Option für das, was ich tat. Die Funktionen, die ich erwähnt habe, sind in der freigegebenen Bibliothek, die anscheinend nicht standardmäßig in 5 installiert ist (Sie müssen explizit darum bitten, dass sie mit configure installiert wird). Sie haben standardmäßig aufgehört, die freigegebene Lib zu installieren, weil sie die Benutzer dazu ermutigen wollten, stattdessen DBUS zu verwenden.

+0

Ich möchte dieses Problem zunächst ohne DBUS lösen. Ich muss das Handle abrufen, das den eingehenden Socket-Daten zugeordnet wird, damit ich die Daten mit der richtigen Verbindung verknüpfen kann. Der Aufruf ioctl (Socket, HCIGETCONNINFO, cr) funktioniert nicht für BLE-Geräte. Verfügen Sie über eine Methode, um auf die Handle-Informationen zuzugreifen, die mit der Verbindung und den eingehenden Daten verknüpft sind? – user2321427

+0

Ich bin mir nicht sicher, ob ich verstehe ... Sie leiten die Verbindung nicht ein? Würdest du den Griff in diesem Fall nicht schon haben und wissen, womit du verbunden bist? –

+1

Wenn ich connect ausführen (Socket, (struct sockaddr *) & addr, sizeof (addr)), wird der Wert 0 zurückgegeben, der angibt, dass die Socket-Verbindung hergestellt wurde. Wenn ich hcidump zur selben Zeit starte, sehe ich, dass der Handle 1025 der Verbindung zugewiesen ist. Weitere Datentransaktionen für diese Verbindung verwenden dieses Handle. Ich versuche, auf dieses Handle zuzugreifen. – user2321427

1

Wir haben den Code von hcitool und gattool kombiniert. Der Code funktioniert gut für 2 Geräte (scan, hci_le_create_conn und gatt_connect). Ich glaube, dass die Anzahl der verwendeten Geräte nicht begrenzt ist.

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

Auf diese Weise kann ein Prozess mehrere BLE-Geräte verwalten.Wir müssen den Scan nicht ausschalten, ignorieren Sie einfach nicht Werbung Nachrichten:

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

Danke und freue mich auf Kommentare.

+0

Können Sie erklären, warum Sie mit cmd_lecc und GATT_connect zwei Verbindungen zu einem Gerät herstellen? – abhiarora

Verwandte Themen