Co to jest profil Bluetooth iBeacon

150

Chciałbym stworzyć własny iBeacon z kilkoma zestawami dla programistów o niskim zużyciu energii przez Bluetooth. Apple nie wydało jeszcze specyfikacji dla iBeacons, jednak kilku programistów sprzętu dokonało inżynierii wstecznej iBeacon z kodu AirLocate Sample i zaczęło sprzedawać zestawy deweloperskie iBeacon.

Więc co to jest profil Bluetooth iBeacon?

Bluetooth Low Energy wykorzystuje GATT do wykrywania usług profilu LE. Myślę więc, że powinniśmy znać uchwyt atrybutu, typ atrybutu, wartość atrybutu i być może uprawnienia atrybutu atrybutu iBeacon. Więc dla iBeacon z UUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 główną wartością 1 i podrzędną wartością 1 byłaby usługa profilu Bluetooth GATT?

Oto kilka założeń, które poczyniłem na podstawie dyskusji na forach Apple oraz w dokumentacji.

  1. Wystarczy zobaczyć usługę profilu (GATT) urządzenia peryferyjnego Bluetooth, aby wiedzieć, że jest to iBeacon.

  2. Klucze Major i Minor są zakodowane gdzieś w tej usłudze profilu

Oto kilka firm oferujących zestawy deweloperskie iBeacon, które wydają się już mieć to na uwadze:

Miejmy nadzieję, że z czasem opublikujemy profil na Bluetooth.org, taki jak ten: https://www.bluetooth.org/en-us/specification/adopted-specifications

PaulWoodIII
źródło
właściwie teraz sprowadziłem to do 4 wartości atrybutów
PaulWoodIII,
@ Dan1One Zreplikowałem usługę za pomocą Light Blue, a następnie używając przykładowego kodu Apple AirLocate nie mogłem określić zakresu zduplikowanej usługi Myślę, że jest coś więcej, również Light Blue nie ma wymienionego uchwytu atrybutu
PaulWoodIII
Szukasz sposobu na stworzenie iBeacon za pomocą CBPeripheralManager (działającego w tle) lub innego oprogramowania lub sprzętu (innego niż iOS)? Doprowadzi to do wymaganych szczegółów.
Wain
@Wain Próbuję umieścić na własnym sprzęcie, jak zauważa pierwszy akapit. Ale jak zauważyłem w powiązanym pytaniu, może to być potencjalnie przydatne do odpowiedzi na połączone pytanie za pomocą CBPeripheralManager reklamującego iBeacon w tle
PaulWoodIII
1
Wspaniały! czy możesz podzielić się tą dokumentacją tutaj dla przyszłych programistów, kiedy zadawałem pytanie w 2013 roku na pewno jeszcze nie istniało
PaulWoodIII

Odpowiedzi:

228

Dla iBeacon z ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, głównym 0, pobocznym 0i skalibrowaną mocą Tx -59RSSI, przesyłany pakiet ogłoszeniowy BLE wygląda następująco:

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

Ten pakiet można podzielić w następujący sposób:

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

Kluczową częścią tego pakietu jest reklama Bluetooth, którą można podzielić w następujący sposób:

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

Każde urządzenie Bluetooth LE, które można skonfigurować do wysyłania określonej reklamy, może wygenerować powyższy pakiet. Skonfigurowałem komputer z systemem Linux przy użyciu Bluez do wysyłania tej reklamy, a urządzenia iOS7 z kodem testowym AirLocate firmy Apple odbierają go jako iBeacon z polami określonymi powyżej. Zobacz: Użyj stosu BlueZ jako urządzenia peryferyjnego (reklamodawca)

Ten blog zawiera szczegółowe informacje na temat procesu inżynierii wstecznej.

davidgyoung
źródło
To jest świetne! Dokładnie to, czego szukałem. Ale czy ktoś mógłby wyjaśnić, jak mogę obliczyć sumę kontrolną?
Benjamin Groener
Mam do Ciebie kolejne pytanie, które pomoże nam nieco dokładniej uzupełnić specyfikację. Co wydaje się być prawidłowym interwałem transmisji w ms? Zauważam, że używam kodu instrumentów texas, którego używam jako podstawy dla mojego iBeacon, co powoduje, że aplikacja Airlocate firmy Apple działa niespójnie podczas wyświetlania listy pobliskich iBeaconów.
PaulWoodIII
Czy UUID / approachUUID jest profilem BLE specyficznym dla iBeacon, czy zależy to od producenta urządzenia? Jaka jest preferowana metoda rozróżniania urządzeń iBeacon: adres MAC BT, identyfikator UUID czy wartości główne / poboczne?
nickaknudson
David, czy byłeś w stanie skonfigurować urządzenie iOS z określonym pakietem reklamowym podczas korzystania z interfejsów API Core Bluetooth GATT? Nie mogłem znaleźć opcji. Możesz zdefiniować niestandardowe identyfikatory UUID dla usług i cech, ale nie dla ogłoszenia.
miguel
1
@ReinaldoJunior AD = Dane reklamowe. Zobacz referencje w odpowiedzi slackhappy.
RenniePet
47

Wydaje się, że na podstawie danych reklamowych, w szczególności danych producenta:

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>
  • Identyfikator firmy Apple (Little Endian), 0x004c
  • typ danych, 0x02 => iBeacon
  • długość danych, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • kierunek: 0000
  • drobne: 0000
  • mierzona moc z 1 metra: 0xc5 = -59

Mam ten skrypt node.js działający w systemie Linux z przykładowym przykładem aplikacji AirLocate.

sandeepmistry
źródło
Niestety skrypt nie jest już dostępny. Czy możesz podzielić się tym ponownie?
Thomaschaaf
@Thomaschaaf przepraszam, że usunąłem tutaj jest link do starej wersji w Github. Zaktualizowałem również bleacon, aby nie wymagał tworzenia hcitool / hciconfig.
sandeepmistry
„Moc mierzona na 1 metrze: 0xc5 = -59” jak obliczyć od 0xc5 do -59?
andreasbecker.de
@ andreasbecker.de bierzesz dopełnienie
sandeepmistry
@sandeepmistry łącze do skryptu node.js jest teraz zepsute.
tedyyu
20

Żeby pogodzić różnicę między odpowiedzią Sandeepmistry a odpowiedzią Davidgyounga:

02 01 1a 1a ff 4C 00

Jest częścią specyfikacji formatu danych reklamowych [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

W AD brakuje definicji usługi [5]. Myślę, że sam protokół iBeacon nie ma związku z GATT i standardowym wykrywaniem usług. Jeśli pobierzesz program iBeacon firmy RedBearLab, zobaczysz, że używają oni GATT do konfigurowania parametrów reklamy, ale wydaje się, że jest to specyficzne dla ich implementacji, a nie część specyfikacji. Wydaje się, że program AirLocate nie używa GATT do konfiguracji, na przykład według LightBlue i innych podobnych programów, które próbowałem.

Bibliografia:

  1. Podstawowa specyfikacja Bluetooth v4, tom 3, część C, 11
  2. Tom 3, część C, 18.1
  3. Vol 3, część C, 18.11.2018
  4. https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
  5. Tom 3, część C, 18.2
rozluźniony
źródło
Dzięki @slackhappy, zaktualizowałem moją odpowiedź. 2-bajtowy nagłówek ma typ danych 0x02, długość danych 0x15 = 21.
sandeepmistry
dzięki @slackhappy, to dobrze, ale czy mogę zadać głupie pytanie? Gdybym chciał wysłać wiadomość typu „Przyjdź na darmową kawę” lub coś w tym rodzaju, czy FFw twoim przykładzie zastąpiłbym po prostu wartość HEX mojego ciągu? (a także zaktualizować długość struktury AD do zestawu?)
Mark
6

Jeśli powodem, dla którego zadajesz to pytanie, jest to, że chcesz używać Core Bluetooth do reklamowania się jako iBeacon zamiast używania standardowego interfejsu API, możesz to łatwo zrobić, reklamując NSDictionary, taki jak:

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

Zobacz tę odpowiedź, aby uzyskać więcej informacji.

Rozsądne
źródło
0

Profil iBeacon zawiera 31 bajtów, w tym następujące

  1. Prefiks - 9 bajtów - który zawiera dane reklamowe i dane producenta
  2. UUID - 16 bajtów
  3. Major - 2 bajty
  4. Drobne - 2 bajty
  5. TxPower - 1 bajt

wprowadź opis obrazu tutaj

Ambi
źródło