Mehrere BLE-Verbindungen mit Linux und Bluez 5.0
Ich bin derzeit versucht, eine Verbindung zu mehreren BLE Geräte mit BlueZ 5.0 und Linux. Ich habe einen host-BLE-adapter, und ich geändert haben, die gatttool zu verbinden und diese Funktion ausführen. Wenn ich eine Instanz der geänderten gatttool, habe ich mich erfolgreich verbinden und eine Benachrichtigung erhalten Daten aus der BLE-Gerät. Wenn ich starten Sie eine weitere Instanz der geänderten gatttool und eine Verbindung zu einem anderen von der BLE Gerät, diese Anwendung beginnt mit Erhalt der Mitteilung Daten sowohl von BLE-Geräten und die erstmalige Anwendung nicht mehr empfängt keine Daten. Ich glaube, dies ist aufgrund der socket-setup, bei dem beide Anwendungen konfigurieren Ihre Steckdosen an die gleiche Adresse und PSM (die neueste Instanz, die die Daten erhält, während der andere ist verhungert). Gibt es eine Möglichkeit zu verhindern, dass diese Bedingung? Im Idealfall, ich will eine Anwendung die Verbindung zu mehreren Geräten. Ich gehe davon aus, dass die Anwendung kann nur eine Buchse für den Grund, dass mehrere sockets haben das gleiche Problem wie die verschiedenen Instanzen vor. Meine BLE Gerät ist mit einem TI CC2540 Schlüsselanhänger-als ein Herzfrequenz-monitor.
- Ist das nicht das, was Sie wollen? Wenn Sie möchten, eine Anwendung zum verbinden von mehreren Geräten, dann kann man es über eine einzige Buchse. Ich glaube, dass jede Nachricht durch kommt mit dem Gerät der BT-Adresse, so können Sie verbinden es mit dem rechten Gerät.
- Ich verstehe jetzt, dass ich sollte ein sockel. Die ACL-Verbindung verarbeiten soll, verwendet werden, die Daten zu Separieren. Ich habe Schwierigkeiten beim Zugriff auf diese Griff über BlueZ. Buchse(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) schafft die Steckdose. connect(sock, (struct sockaddr *) &addr, sizeof(addr)) verbindet den socket. Zugriff auf das handle mittels ioctl(socket, HCIGETCONNINFO, cr) gibt einen errno 2 (keine Datei). Die dest-Adresse korrekt ist. Meine erstellten Stecker oben gibt einen Wert von 5 in der Erwägung, dass der socket = hci_open_dev(dev_id) liefert den Wert 6. Gibt es einen besseren Weg, um diese zu behandeln.
- Die ioctl(socket, HCIGETCONNINFO, cr) - Methode funktioniert gut für bluetooth-classic-Geräten, aber nicht BLE Geräte. Ich brauche eine Methode für den Zugriff auf die ACL-Daten-Griff für ein BLE-Gerät für die Paarung Zwecke. Ist das möglich mit BlueZ?
- Ich habe ähnliches problem. Erläutern Sie bitte die Ergebnisse Ihrer Experimente?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Begann ich eine Antwort, so hätte ich mehr Platz...
Ich verwende eine Kombination von Python und C, um meinen code zu arbeiten, also mein "code" sieht vielleicht lustig, weil es könnte entweder. Außerdem habe ich Bluez 4 5 nicht unterstützt der kernel war ich mit. Lassen Sie mich wissen, wenn es gibt ein Problem, und ich kann klären.
Scheint es mehrere Wege, Dinge zu tun, aber ich landete öffnen separate sockets für verschiedene Aufgaben. Sie kann öffnen Sie eine Steckdose und legen Sie die socket-Optionen zu nehmen, abfiltrieren und Sie sollten alle Pakete in einem Ort. Jedoch, das war meine erste Weg, es zu tun, und ich fand, dass meine verbindungen würde sterben innerhalb von Sekunden.
Scannen für verbindungen, die ich öffnete eine
socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
dann hatbind
auf dem Gerät0
. (es gibt eine Funktion namenshci_get_route
um eine Geräte-Nummer) können Sie dann rufenhci_le_set_scan_parameters
um Optionen zu setzensetsockopt(SOL_HCI, HCI_FILTER, filter)
zu bekommen, LE scan-Ereignisse, und dann riefhci_le_set_scan_enable
schalten Sie das scanning.Jedes Gerät Verbindung mit einem
socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
was Sie dann sagen, um eine Verbindung zu einem bestimmten Gerät durch aufrufenconnect
auf den sockel mit einemstruct sockaddr_l2
hat, dass die Geräte-Adresse in ihm. Auf diesem sockel du solltest nur Pakete, die von diesem Gerät. (ein Nachteil... ich fand, dass mein dongle würde nicht zulassen, dass eine Verbindung während aktivem scanning stattfand.. ich hatte, um vorübergehend schalten Sie es nur vor dem anschließen und schalten Sie ihn dann wieder auf. Ansonsten habe ich eine BUSY-Fehler aus errno)Nach sagen alle, dass, obwohl... ich denke, die Art und Weise Sie tun sollen, alles in Bluez 5 ist die Verwendung von DBUS. Leider war nicht wirklich eine option für das, was ich Tat. Die Funktionen, die ich erwähnte, sind in der shared lib, die offenbar nicht standardmäßig installiert in 5 (Sie müssen explizit Fragen, für die es installiert werden mit
configure
). Sie beendet die Installation des shared lib standardmäßig, weil Sie wollte, um Menschen zu ermutigen, zu verwenden, DBUS statt.socket
variable.WIR haben die kombinierte code von hcitool und gatttool. Der code funktioniert gut für 2-Gerät (Scannen, hci_le_create_conn und gatt_connect). Ich glaube, es gibt keine Beschränkung der Anzahl der Geräte verwendet.
Diese Weise einen Prozess verwalten können mehrere BLE-Gerät. Wir haben nicht zu DEAKTIVIEREN, Scannen, einfach ignorieren non-advertisement-Nachrichten:
Dank und freue mich auf Kommentare.