Was ist das iBeacon Bluetooth-Profil?


150

Ich möchte meinen eigenen iBeacon mit einigen Bluetooth-Niedrigenergie-Entwicklungskits erstellen. Apple hat noch keine Spezifikation für iBeacons veröffentlicht. Einige Hardwareentwickler haben den iBeacon jedoch aus dem AirLocate-Beispielcode rückgängig gemacht und mit dem Verkauf von iBeacon-Entwicklungskits begonnen.

Was ist das iBeacon Bluetooth-Profil?

Bluetooth Low Energy verwendet GATT für die Erkennung von LE-Profildiensten. Ich denke, wir müssen das Attributhandle, den Attributtyp, den Attributwert und möglicherweise die Attributberechtigungen des iBeacon-Attributs kennen. Für einen iBeacon mit einer UUID von E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 wäre ein Hauptwert von 1 und ein Nebenwert von 1 der Bluetooth GATT-Profildienst.

Hier sind einige Annahmen, die ich aus der Diskussion in Apples Foren und durch die Dokumente gemacht habe.

  1. Sie müssen nur den Profildienst (GATT) eines Bluetooth-Peripheriegeräts anzeigen, um zu wissen, dass es sich um einen iBeacon handelt.

  2. Die Haupt- und Nebenschlüssel sind irgendwo in diesem Profildienst codiert

Hier sind einige Unternehmen mit iBeacon Dev Kits, die diese Zahl anscheinend bereits herausgefunden haben:

Hoffentlich haben wir mit der Zeit ein Profil wie dieses auf Bluetooth.org: https://www.bluetooth.org/en-us/specification/adopted-specifications


Eigentlich habe ich es jetzt auf die 4 Attributwerte gebracht
PaulWoodIII

@ Dan1One Ich habe den Dienst mit Light Blue repliziert und dann mit dem AirLocate-Beispielcode von Apple den duplizierten Dienst nicht erreicht. Ich denke, es gibt noch etwas mehr. Auch in Light Blue ist das Attribut-Handle nicht aufgeführt
PaulWoodIII

Suchen Sie nach einer Möglichkeit, einen iBeacon mit CBPeripheralManager (der im Hintergrund ausgeführt wird) oder einer anderen (Nicht-iOS-) Software oder Hardware zu erstellen? Dies führt zu den erforderlichen Details.
Wain

@Wain Ich versuche, meine eigene Hardware als erste Absatznotizen einzubauen. Aber wie ich in der verknüpften Frage bemerkt habe, könnte es möglicherweise nützlich sein, die verknüpfte Frage mit CBPeripheralManager zu beantworten, der den iBeacon im Hintergrund
bewirbt

1
Toll!
Können

Antworten:


228

Für einen iBeacon mit ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, Major 0, Minor 0und kalibrierter Tx Power von -59RSSI sieht das übertragene BLE-Werbepaket folgendermaßen aus:

d6 be 89 8e 40 24 05 a2 17 6e 3d 71 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 52 ab 8d 38 a5

Dieses Paket kann wie folgt aufgeteilt werden:

d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
05 a2 17 6e 3d 71 # Bluetooth Mac address (note this is a spoofed address)
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 # Bluetooth advertisement
52 ab 8d 38 a5 # checksum

Der Hauptteil dieses Pakets ist die Bluetooth-Werbung, die wie folgt unterteilt werden kann:

02 # Number of bytes that follow in first AD structure
01 # Flags AD type
1A # Flags value 0x1A = 000011010  
   bit 0 (OFF) LE Limited Discoverable Mode
   bit 1 (ON) LE General Discoverable Mode
   bit 2 (OFF) BR/EDR Not Supported
   bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
   bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
1A # Number of bytes that follow in second (and last) AD structure
FF # Manufacturer specific data AD type
4C 00 # Company identifier code (0x004C == Apple)
02 # Byte 0 of iBeacon advertisement indicator
15 # Byte 1 of iBeacon advertisement indicator
e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon proximity uuid
00 00 # major 
00 00 # minor 
c5 # The 2's complement of the calibrated Tx Power

Jedes Bluetooth LE-Gerät, das zum Senden einer bestimmten Werbung konfiguriert werden kann, kann das oben genannte Paket generieren. Ich habe einen Linux-Computer mit Bluez konfiguriert, um diese Werbung zu senden, und iOS7-Geräte, auf denen der AirLocate-Testcode von Apple ausgeführt wird, nehmen ihn als iBeacon mit den oben angegebenen Feldern auf. Siehe: BlueZ-Stapel als Peripheriegerät verwenden (Werbetreibender)

Dieser Blog enthält alle Details zum Reverse Engineering-Prozess.


Das ist toll! Genau das, wonach ich gesucht habe. Aber könnte jemand erklären, wie ich die Prüfsumme berechnen kann?
Benjamin Groener

Ich habe noch eine Frage an Sie, die uns helfen soll, die Spezifikation ein wenig weiter zu vervollständigen. Was scheint das richtige Sendeintervall in ms zu sein? Ich stelle fest, dass die Verwendung des Texas Instruments-Codes, den ich als Grundlage für meinen iBeacon verwende, dazu führt, dass die Airlocate-App von Apple beim Anzeigen einer Liste von iBeacons in der Nähe inkonsistent wirkt.
PaulWoodIII

Ist die UUID / ProximityUUID ein für iBeacon spezifisches BLE-Profil oder liegt es am Gerätehersteller? Was ist die bevorzugte Methode zur Unterscheidung zwischen iBeacon-Geräten: Die BT-MAC-Adresse, die UUID oder die Haupt- / Nebenwerte?
Nickaknudson

David, konnten Sie ein iOS-Gerät mit einem bestimmten Werbepaket konfigurieren, wenn Sie die Core Bluetooth GATT-APIs verwenden? Ich konnte die Option nicht finden. Sie können benutzerdefinierte UUIDs für Dienste und Merkmale definieren, jedoch nicht für die Anzeige.
Miguel

1
@ReinaldoJunior AD = Werbedaten. Siehe Referenzen in der Antwort von slackhappy.
RenniePet

47

Es scheint auf Werbedaten zu beruhen, insbesondere auf den Herstellerdaten:

4C00 02 15 585CDE931B0142CC9A1325009BEDC65E 0000 0000 C5

<company identifier (2 bytes)> <type (1 byte)> <data length (1 byte)>
    <uuid (16 bytes)> <major (2 bytes)> <minor (2 bytes)> <RSSI @ 1m>
  • Apple Firmenkennung (Little Endian), 0x004c
  • Datentyp 0x02 => iBeacon
  • Datenlänge 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • Hauptfach: 0000
  • Moll: 0000
  • gemessene Leistung bei 1 Meter: 0xc5 = -59

Ich habe dieses node.js-Skript unter Linux mit dem Beispiel einer AirLocate-App.


Leider ist das Skript nicht mehr verfügbar. Würde es Ihnen etwas ausmachen, es wieder zu teilen?
Thomaschaaf

@Thomaschaaf sorry ich habe hier einen Link zur alten Version in Github entfernt. Ich habe auch bleacon aktualisiert , um das Laichen von hcitool / hciconfig nicht zu erfordern.
Sandeepmistry

"gemessene Leistung bei 1 Meter: 0xc5 = -59" Wie berechnet man von 0xc5 auf -59?
andreasbecker.de

@ andreasbecker.de Sie nehmen die Ergänzung
Sandeepmistry

@sandeepmistry Der Link zum Skript node.js ist jetzt unterbrochen.
Tededyyu

20

Nur um den Unterschied zwischen der Antwort von Sandeepmistry und der Antwort von Davidgyoung in Einklang zu bringen:

02 01 1a 1a ff 4C 00

Ist Teil der Spezifikation des Werbedatenformats [1]

  02 # length of following AD structure
  01 # <<Flags>> AD Structure [2]
  1a # read as b00011010. 
     # In this case, LE General Discoverable,
     # and simultaneous BR/EDR but this may vary by device!

  1a # length of following AD structure
  FF # Manufacturer specific data [3]
4C00 # Apple Inc [4]
0215 # ?? some 2-byte header

In der AD fehlt eine Service [5] -Definition. Ich denke, das iBeacon-Protokoll selbst hat keine Beziehung zum GATT und zur Standarddiensterkennung. Wenn Sie das iBeacon-Programm von RedBearLab herunterladen, werden Sie feststellen, dass sie zufällig das GATT zum Konfigurieren der Ankündigungsparameter verwenden. Dies scheint jedoch spezifisch für ihre Implementierung zu sein und nicht Teil der Spezifikation. Das AirLocate-Programm scheint das GATT nicht für die Konfiguration zu verwenden, beispielsweise gemäß LightBlue und anderen ähnlichen Programmen, die ich ausprobiert habe.

Verweise:

  1. Core Bluetooth Spec v4, Band 3, Teil C, 11
  2. Band 3, Teil C, 18.1
  3. Band 3, Teil C, 18.11
  4. https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
  5. Band 3, Teil C, 18.2

Danke @slackhappy, ich habe meine Antwort aktualisiert. Der 2-Byte-Header ist vom Datentyp 0x02, 0x15 = 21 Datenlänge.
Sandeepmistry

danke @slackhappy das ist gut, aber kann ich eine dumme frage stellen? Wenn ich eine Nachricht wie "Komm für einen kostenlosen Kaffee herein" oder so etwas senden wollte, würde ich die FFin Ihrem Beispiel einfach durch den HEX-Wert meiner Zeichenfolge ersetzen ? (und aktualisieren auch die Länge der AD - Struktur Suite?)
Mark

6

Wenn der Grund, warum Sie diese Frage stellen, darin besteht, dass Sie Core Bluetooth verwenden möchten, um als iBeacon zu werben, anstatt die Standard-API zu verwenden, können Sie dies einfach tun, indem Sie ein NSDictionary bewerben, wie z.

{
    kCBAdvDataAppleBeaconKey = <a7c4c5fa a8dd4ba1 b9a8a240 584f02d3 00040fa0 c5>;
}

Weitere Informationen finden Sie in dieser Antwort .



0

iBeacon Profile enthält 31 Bytes, einschließlich der folgenden

  1. Präfix - 9 Bytes - einschließlich s Adv-Daten und Herstellerdaten
  2. UUID - 16 Bytes
  3. Major - 2 Bytes
  4. Minor - 2 Bytes
  5. TxPower - 1 Byte

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.