2014-05-05 15 views
10

Es gibt einen bekannten Blogpost, der sich damit befasst, wie man einen USB-Bluetooth-4-Dongle als iBeacon einrichten kann. Es läuft darauf hinaus, diesen magischen Befehl herunter:Verwenden von hcitool zum Setzen von Werbepaketen

sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00 

Das Problem mit diesem Beispiel ist, dass es so undurchsichtig ist es schwer, ist es in jedem allgemeinere Format zu verwenden. Ich habe in der Lage gewesen, um es zu brechen ein wenig auseinander:

sudo hcitool -i hci0 cmd 

einen hci-Befehl an das hci0 Gerät sendet den „gerade haben

0x08 0x0008 

ist nur Magie des Anzeigenpaket, andere Stackoverflow Kommandos zu setzen es verwenden, bitten nicht

1e 

die Länge des gesamten ist folgende Datenpaket in Bytes

02 01 1a 1a 

Sind Flaggen das Anzeigenpaket (Details auf Anfrage) einzurichten

ff 4c 00 ... 

sind die ‚unternehmensspezifische Daten‘, die die IBeacon info ersetzen

Was ich habe versucht zu tun, kodiert ist "FF ..." Bytes mit den Opcodes zum Setzen des NAME-Parameters "04 09 41 42 43" (der auf ABC setzen sollte), aber das funktioniert nicht.

Ich bin überrascht, dass das hcitool uns einige Beispiele nicht gibt, wie man das Anzeigenpaket einstellt, wie das sehr nützlich sein könnte, wenn man alle möglichen anderen params (wie TEMP oder POWER) setzt. Hat jemand andere Erfahrung im Umgang mit HCitool, um Dinge wie NAME zu setzen?

+0

Die Werbepaket Nutzlast, die am Ende übertragen übertragen beginnt mit der Sequenz "02 01 1a 1a". Das "ff 4c", das Sie zu ändern versuchen, ist also gut innerhalb der Nutzlast, und so ändert sich das nicht in einem anderen Befehl, sondern lediglich in einer verstümmelten Übertragung. –

Antwort

3

Überprüfen Sie this answer auf eine ähnliche Frage. Es beschreibt im Grunde, wie Sie den riesigen Bluetooth Core Spec Dokument herunterladen können, und lesen Sie alle Befehle, die es Ihnen bietet. Sie können den Befehl hcitool verwenden, um einen dieser Befehle auszuführen, wenn Sie nur das richtige Format herausfinden (und herausfinden, was die Befehle tatsächlich tun!)

Major Vorbehalt: Ich habe nicht versucht, den Namen selbst, aber einen Blick Bei der Spezifikation sieht es so aus, als ob dies auf Seite 482 der Spezifikation im Abschnitt "7.3.11 Lokaler Name schreiben" beschrieben ist. Danach ist das Kommando besteht aus:

OCF: 0x0013 
Name (up to 248 bytes) 

So würde ich einen Befehl wie diesen versuchen:

hcitool -i hci0 cmd 0x08 0x0013 41 42 43

Ein weiterer Tipp: Wenn Sie Befehle wie dieser Ausgabe versuchen hcidump & so den Befehl ausführen wird im Hintergrund ausgeführt. Dann können Sie experimentelle hcitool Befehle (oder sogar hciconfig Befehle) eingeben und annotierte Details darüber sehen, welche (menschenlesbaren) Befehle ausgeführt wurden und welche Fehler aufgetreten sind.

Mit dem obigen Tipp können Sie auch versuchen, hciconfig name abc ausführen, um den lokalen Namen mit diesem Befehlszeilentool festzulegen, während Sie eine hcidump & im Hintergrund ausführen. Dies sollte Ihnen die richtigen zu verwendenden hcitool-Befehlswerte anzeigen.

+0

Danke David, ich habe eine Aufnahme gemacht, aber ich habe wieder "Senden fehlgeschlagen: Operation nicht erlaubt". Meine Vermutung ist, dass es einen Unterschied zwischen BT3 und BT4 Befehlen gibt. Zum Beispiel kann es * nicht * bis zu 248 Bytes sein, da das Anzeigenpaket nur 28 Bytes freien Speicherplatzes hat, so dass es hier eine klare Trennung gibt. – ScottJenson

+0

Nun, ich glaube nicht, dass der lokale Name im Werbepaket ausgesendet wird. Daher sollte seine Längenbeschränkung nicht gelten. – davidgyoung

+1

Die Antwort "Senden fehlgeschlagen: Operation nicht erlaubt" zeigt wahrscheinlich an, dass der Linux-Benutzer, der den Befehl ausführt, nicht über die Rechte zum Schreiben auf das BLE-Gerät verfügt. Versuchen Sie 'sudo hcitool -i hci0 cmd 0x08 0x0013 41 42 43' – davidgyoung

5

Späte Antwort, aber jemand könnte dies nützlich finden. Ich fand es, als ich selbst nach Lösungen suchte, wenn ich hcitool verwendete.

Wenn Sie hcitool cmd --help verwenden, wird es Ihnen so etwas sagen cmd <ogf> <ocf> .... Es hilft, die Bluetooth Core Specification zu betrachten, um herauszufinden, was 0x08 und 0x0008 für OGF und OCF wäre. Speziell Vol. 2, Teil E, 7,8

Für die LE-Controller-Befehle wird das OGF Code definiert als 0x08

und für den OCF von 0x0008

Advertising_Data_Length, Advertising_Data

Also im Grunde, mit 0x08 0x0008 sagen Sie, dass Sie (im LE-Controller) die Länge der Daten einstellen, die gesendet werden. Was den Namen betrifft, müssen Sie, da die Länge des BLE-Advertisement-Pakets 31 Bytes (1E) beträgt, die gesamten 31 Bytes senden. Wenn Sie also nur ABC als Namen haben, ist die Einstellung 04 09 41 42 43 korrekt, aber das sind nur fünf Bytes. Für 31 müssen Sie 00 26 Mal hinzufügen. Sei nur vorsichtig, dass du nicht zu viel oder zu wenig hinzufügst.

Auch war ich nicht unter dem Eindruck, dass BLE ad. Pakete haben eine feste Größe von 31 Byte, aber sie sind mindestens für hcitool. Es funktioniert nicht, wenn Sie die ausgehende Größe speziell auf etwas kleiner als 1E festlegen.

5

Nein. Keine dieser Antworten ist korrekt und sauber.

1) BLE haben einen separaten Befehlssatz. Der Befehl "Le Set Advertising Data" muss verwendet werden (siehe 7.8.7 Bd. 2 Teil E).

2) LE Set Werbung Daten sind viel komplexer als das, was oben erklärt wurde. Es gibt mindestens 2 1-Oktett-Längenfelder, Paket muss 32 Byte Länge, Null aufgefüllt sein, aber das erste Längenbyte darf nicht 0x1e (31) sein, sondern die Länge des signifikant verwendeten Teils, das einen oder mehrere Header enthält. Jeder Header enthält weiterhin eine Länge, ein AS-Typ-Byte (0x09 für den lokalen Namen) und den Namen.

SET LE LOKALER NAME:

hciconfig hci0 down 
hciconfig hci0 up 
hcitool -i hci0 cmd 0x08 0x0008 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
hciconfig hci0 leadv 0 

0x0c: Länge der folgenden Gruppe von Headern 0x0b: Länge dieses Kopfes 0x09: AD Typ für vollständige Namen Rest 0x0a Länge ist der Name

+0

Die oben angegebene Reihenfolge ist falsch. Der Befehl hcitool -i hci0 cmd 0x08 muss dem Befehl hciconfig hci0 leadv 0 folgen. Dies liegt daran, dass der Befehl leadv auch die paketierten Daten für Werbezwecke auf den Standardwert 0x000 setzt. Nach dem Aufruf von "leadv" müssen Sie den Befehl hctitool -i hci0 cmd 0x08 .. aufrufen, um die gepackten Daten auf Ihre benutzerdefinierten Werte zurückzusetzen –

1

Es scheint, dass Sie zwei Befehle anstelle von einem verwenden müssen. Die iBeacon-Daten sind in den "LE Set Advertising Data" -Daten enthalten und wurden an anderer Stelle in diesem Beitrag erwähnt. Um einen BLE-freundlichen Namen zu sehen, können Sie einen zusätzlichen Befehl "LE Set Scan Response Data" verwenden, dies erfordert, dass der Empfänger Ihr Gerät scannt (anstatt das Werbepaket passiv zu lesen). So können Sie Angelo Beispiel mit this one kombinieren, um das Gerät als IBeacon zu setzen und die „freundlichen Namen“ gesetzt, sind die Scan-Antwort-Daten

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00 
sudo hcitool -i hci0 cmd 0x08 0x0009 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Dieser arbeitete für mich eine Ubuntu-Box mit einem BLE-Dongle und dann Scannen für die Beacon mit dieser android BLE Scan-App