Cos'è il profilo Bluetooth iBeacon


150

Vorrei creare il mio iBeacon con alcuni kit di sviluppo bluetooth a basso consumo energetico. Apple non ha ancora rilasciato una specifica per iBeacons, tuttavia alcuni sviluppatori hardware hanno decodificato l'iBeacon dal codice di esempio AirLocate e hanno iniziato a vendere kit di sviluppo iBeacon.

Allora, qual è il profilo Bluetooth iBeacon?

Bluetooth Low Energy utilizza GATT per il rilevamento del servizio profili LE. Quindi penso che dobbiamo conoscere la maniglia dell'attributo, il tipo di attributo, il valore dell'attributo e forse le autorizzazioni dell'attributo dell'attributo iBeacon. Quindi per un iBeacon con un UUID di E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 un valore maggiore di 1 e un valore minore di 1 quale sarebbe il servizio di profilo GATT Bluetooth?

Ecco alcune ipotesi che ho fatto dalla discussione sui forum di Apple e attraverso i documenti.

  1. Devi solo vedere il servizio profili (GATT) di una periferica Bluetooth per sapere che si tratta di un iBeacon.

  2. Le chiavi Major e Minor sono codificate da qualche parte in questo servizio di profilo

Ecco alcune aziende con i Dev Kit di iBeacon che sembrano aver già capito questo:

Speriamo che col tempo avremo un profilo pubblicato su Bluetooth.org come questi: https://www.bluetooth.org/en-us/specification/adopted-specifications


in realtà ora ho capito cosa sono i 4 valori degli attributi
PaulWoodIII,

@ Dan1One Ho replicato il servizio usando Light Blue, quindi usando il codice di esempio AirLocate di Apple non ho potuto spaziare il servizio duplicato Penso che ci sia qualcosa di più, anche Light Blue non ha la maniglia
dell'attributo

Stai cercando un modo per creare un iBeacon con CBPeripheralManager (che funziona in background), o un altro pezzo di software (non iOS) o hardware? Questo porterà verso i dettagli richiesti.
Guadagna il

@Wain Sto provando a inserire il mio hardware come le note del primo paragrafo. Ma come ho notato nella domanda collegata, potrebbe potenzialmente essere utile alla risposta della domanda collegata usando CBPeripheralManager che pubblicizza l'iBeacon in background
PaulWoodIII

1
Grande! puoi condividere questa documentazione qui per i futuri programmatori, quando ho posto la domanda nel 2013, sicuramente non esisteva ancora
PaulWoodIII,

Risposte:


228

Per un iBeacon con ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, maggiore 0, minore 0e calibrato Tx Power di -59RSSI, il pacchetto di pubblicità BLE trasmesso si presenta così:

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

Questo pacchetto può essere suddiviso come segue:

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

La parte fondamentale di quel pacchetto è la pubblicità Bluetooth, che può essere suddivisa in questo modo:

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

Qualsiasi dispositivo Bluetooth LE che può essere configurato per inviare un annuncio specifico può generare il pacchetto di cui sopra. Ho configurato un computer Linux che utilizza Bluez per inviare questo annuncio e i dispositivi iOS7 che eseguono il codice di test AirLocate di Apple lo raccolgono come iBeacon con i campi sopra specificati. Vedi: Usa BlueZ Stack come periferica (inserzionista)

Questo blog contiene tutti i dettagli sul processo di reverse engineering.


Questo è fantastico! Esattamente quello che stavo cercando. Qualcuno potrebbe spiegare come posso calcolare il checksum?
Benjamin Groener,

Ho un'altra domanda per aiutarci a completare un po 'di più le specifiche. Quale sembra essere l'intervallo di trasmissione corretto in ms? Sto notando che usando il codice Texas Instruments che sto usando come base per il mio iBeacon, l'app Airlocate di Apple agisce in modo incoerente quando viene visualizzato un elenco di iBeacon nelle vicinanze.
PaulWoodIII,

L'UUID / prossimitàUUID è un profilo BLE specifico di iBeacon o dipende dal produttore del dispositivo? Qual è il metodo preferito per distinguere tra i dispositivi iBeacon: l'indirizzo MAC BT, l'UUID o i valori maggiori / minori?
Nickaknudson,

David, sei stato in grado di configurare un dispositivo iOS con uno specifico pacchetto pubblicitario quando si utilizzano le API GATT Bluetooth di base? Non sono riuscito a trovare l'opzione. È possibile definire UUID personalizzati per servizi e caratteristiche ma non per l'annuncio.
miguel,

1
@ReinaldoJunior AD = Dati pubblicitari. Vedi riferimenti in risposta di slackhappy.
RenniePet,

47

Sembra basarsi sui dati pubblicitari, in particolare sui dati del produttore:

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>
  • Identificatore dell'azienda Apple (Little Endian), 0x004c
  • tipo di dati, 0x02 => iBeacon
  • lunghezza dei dati, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • maggiore: 0000
  • minore: 0000
  • potenza misurata a 1 metro: 0xc5 = -59

Ho questo script node.js che funziona su Linux con l'esempio dell'app AirLocate di esempio.


Purtroppo la sceneggiatura non è più disponibile. Ti dispiacerebbe condividere di nuovo?
Thomaschaaf,

@Thomaschaaf mi dispiace che ho rimosso qui è un link alla vecchia versione in Github. Ho anche aggiornato Bleacon per non richiedere la generazione di hcitool / hciconfig.
sandeepmistry

"potenza misurata a 1 metro: 0xc5 = -59" come si calcola da 0xc5 a -59?
andreasbecker.de,

@ andreasbecker.de prendi il complemento a due
sandeepmistry il

@sandeepmistry il collegamento allo script node.js è ora interrotto.
tedyyu,

20

Giusto per conciliare la differenza tra la risposta di sandeepmistry e la risposta di davidgyoung:

02 01 1a 1a ff 4C 00

Fa parte della specifica del formato dei dati pubblicitari [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

Manca da AD è una definizione di servizio [5]. Penso che il protocollo iBeacon stesso non abbia alcuna relazione con il GATT e la scoperta del servizio standard. Se scarichi il programma iBeacon di RedBearLab, vedrai che usano GATT per configurare i parametri pubblicitari, ma questo sembra essere specifico per la loro implementazione e non fa parte delle specifiche. Il programma AirLocate non sembra utilizzare GATT per la configurazione, ad esempio, secondo LightBlue e altri programmi simili che ho provato.

Riferimenti:

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

Grazie @slackhappy, ho aggiornato la mia risposta. L'intestazione a 2 byte è del tipo di dati 0x02, 0x15 = 21 lunghezza dei dati.
sandeepmistry,

grazie @slackhappy va bene, ma posso fare una domanda stupida? Se volessi inviare un messaggio come "Vieni per un caffè gratis" o qualcosa del genere, sostituirei il FFtuo esempio con il valore HEX della mia stringa? (e aggiorni anche la lunghezza della struttura AD alla suite?)
Segna il



0

Il profilo iBeacon contiene 31 byte, inclusi i seguenti

  1. Prefisso - 9 byte - che include i dati adv e i dati del produttore
  2. UUID - 16 byte
  3. Maggiore - 2 byte
  4. Minore - 2 byte
  5. TxPower - 1 byte

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.