it-swarm.com.de

Verwenden von hcitool zum Festlegen von Anzeigenpaketen

Es gibt einen bekannten Blog-Beitrag darüber, wie ein USB-Bluetooth-4-Dongle als iBeacon eingerichtet werden kann. Es läuft auf diesen magischen Befehl hinaus:

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 bei diesem Beispiel ist, dass es so undurchsichtig ist, dass es schwer ist, es in einem allgemeineren Format zu verwenden. Ich habe es ein bisschen auseinander brechen können:

Sudo hcitool -i hci0 cmd

sendet einen hci-Befehl an das hci0-Gerät

0x08 0x0008 

es ist einfach magisch, das Anzeigenpaket zu setzen. Andere Stackoverflow-Befehle haben gesagt: "Verwende es einfach, frage nicht

1e

ist die Länge des GESAMTEN folgenden Datenpakets in Bytes

02 01 1a 1a

Sind Flags zum Einrichten des Werbepakets (Details auf Anfrage)

ff 4c 00 ...

sind die unternehmensspezifischen Daten, die die iBeacon-Informationen codieren

Ich habe versucht, die "FF ..." - Bytes durch die Opcodes zum Einstellen des NAME-Parameters "04 09 41 42 43" zu ersetzen (der es auf ABC setzen sollte), aber das funktioniert nicht.

Ich bin überrascht, dass das hcitool uns keine Beispiele zum Festlegen des Anzeigenpakets gibt, da dies beim Festlegen aller möglichen anderen Parameter (wie TEMP oder POWER) sehr nützlich wäre. Hat jemand Erfahrung mit hcitool, um Dinge wie NAME festzulegen?

11
ScottJenson

Keine dieser Antworten ist richtig und sauber.

1) BLE hat einen separaten Befehlssatz. Der Befehl "LE Werbedaten setzen" muss verwendet werden (siehe 7.8.7 Band 2 Teil E).

2) LE Set-Werbedaten sind viel komplexer als oben erklärt. Es gibt mindestens 2 Felder mit einer Länge von 1 Oktett. Das Paket muss 32 Byte lang und mit Nullen aufgefüllt sein. Das erste Byte darf jedoch nicht 0x1e (31) sein, sondern die Länge des signifikant verwendeten Teils, der einen oder mehrere Header enthält. Jeder Header enthält weiterhin eine Länge, ein AS-Type-Byte (0x09 für gesetzten lokalen Namen) und den Namen.

SET LE LOCAL 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 Headers 0x09: AD Typ für vollständigen Rest des Namens 0x0a Länge ist der Name

6

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

Wenn Sie hcitool cmd --help verwenden, wird Ihnen dieser cmd <ogf> <ocf> ... angezeigt. Es ist hilfreich, sich die Bluetooth Core Specification anzusehen, um herauszufinden, was 0x08 und 0x0008 für OGF und OCF wären. Speziell Vol. 2, Teil E, 7.8

Für die LE-Controller-Befehle ist der OGF-Code als 0x08 definiert

und für die OCF von 0x0008

Advertising_Data_Length, Advertising_Data

Im Grunde genommen geben Sie mit 0x08 0x0008 (im LE-Controller) die Länge der gesendeten Daten an. Da der Name des BLE-Werbepakets 31 Byte (1E) beträgt, müssen Sie die gesamten 31 Byte senden. Wenn Sie also nur ABC als Namen haben, ist die Einstellung von 04 09 41 42 43 korrekt, aber das sind nur fünf Bytes. Für 31 müssen Sie 00 26 Mal hinzufügen. Pass nur auf, dass du nicht zu viel oder zu wenig hinzufügst.

Außerdem hatte ich nicht den Eindruck, dass BLE Werbung macht. pakete haben eine feste größe von 31 bytes, sind aber zumindest für hcitool gedacht. Es funktioniert nicht, wenn Sie die ausgehende Größe auf einen Wert festlegen, der kleiner als 1E ist.

5
nomve

Schauen Sie sich diese Antwort eine ähnliche Frage an. Grundsätzlich wird beschrieben, wie Sie das riesige Bluetooth Core Spec - Dokument herunterladen und alle darin enthaltenen Befehle durchlesen können. Sie können den Befehl hcitool verwenden, um einen dieser Befehle auszuführen, wenn Sie nur das richtige Format herausfinden können (und herausfinden, was die Befehle tatsächlich tun!).

Wichtige Einschränkung: Ich habe nicht versucht, den Namen selbst festzulegen, aber wenn ich mir die Spezifikation anschaue, sieht es so aus, als wäre dies auf Seite 482 der Spezifikation in Abschnitt "7.3.11 Write Local Name Command" beschrieben. Demnach besteht der Befehl aus:

OCF: 0x0013
Name (up to 248 bytes)

Also würde ich einen Befehl wie diesen versuchen:

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

Ein weiterer Tipp: Wenn Sie Befehle wie diesen ausgeben, versuchen Sie, hcidump & auszuführen, damit der Befehl im Hintergrund ausgeführt wird. Anschließend können Sie experimentelle hcitool-Befehle (oder sogar hciconfig-Befehle) eingeben und mit Anmerkungen versehene Details darüber anzeigen, welche (von Menschen lesbaren) Befehle ausgeführt wurden und welche Fehler gegebenenfalls aufgetreten sind.

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

3
davidgyoung

Anscheinend müssen Sie statt eines Befehls zwei Befehle verwenden. 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-Anzeigenamen anzuzeigen, können Sie einen zusätzlichen Befehl "LE Set Scan Response Data" verwenden. Dazu muss der Empfänger Ihr Gerät scannen (anstatt das Werbepaket passiv zu lesen). Sie können also Angelos Beispiel mit diesem kombinieren , um das Gerät als iBeacon festzulegen und den "Anzeigenamen" festzulegen, der die Scan-Antwortdaten darstellt

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

Dies funktionierte für mich mit einer Ubuntu-Box mit einem BLE-Dongle und dann mit dieser Android BLE Scan-App nach dem Beacon zu suchen

1
Matt Young