O que é o perfil Bluetooth iBeacon

150

Eu gostaria de criar meu próprio iBeacon com alguns kits de desenvolvimento de baixa energia para Bluetooth. A Apple ainda não divulgou uma especificação para o iBeacons, no entanto, alguns desenvolvedores de hardware fizeram a engenharia reversa do iBeacon a partir do código AirLocate Sample e começaram a vender kits de desenvolvimento do iBeacon.

Então, qual é o perfil Bluetooth iBeacon?

O Bluetooth Low Energy usa o GATT para descoberta de serviço de perfil LE. Então, acho que precisamos conhecer o identificador de atributo, o tipo de atributo, o valor do atributo e talvez as permissões de atributo do atributo iBeacon. Portanto, para um iBeacon com um UUID de E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, um valor maior de 1 e um valor menor de 1, qual seria o serviço de perfil Bluetooth GATT?

Aqui estão algumas suposições que fiz da discussão nos fóruns da Apple e nos documentos.

  1. Você só precisa ver o serviço de perfil (GATT) de um periférico Bluetooth para saber que é um iBeacon.

  2. As chaves Maiores e Menores são codificadas em algum lugar deste serviço de perfil

Aqui estão algumas empresas com os kits de desenvolvimento iBeacon que parecem já ter descoberto isso:

Felizmente, com o tempo, teremos um perfil publicado no Bluetooth.org como este: https://www.bluetooth.org/en-us/specification/adopted-specifications

PaulWoodIII
fonte
na verdade, agora eu tenho-o para o 4 valores de atributos são
PaulWoodIII
@ Dan1One Eu replicado o serviço usando azul claro, em seguida, usando o código de exemplo AirLocate da Apple I não poderia variar o serviço duplicado Eu acho que há algo mais, também luz azul não tem o Handle Atributo listados
PaulWoodIII
Você está procurando uma maneira de criar um iBeacon com o CBPeripheralManager (que é executado em segundo plano) ou outro software ou hardware (não iOS)? Isso levará ao detalhe necessário.
Wain
@ Wain Estou tentando colocar meu próprio hardware como o primeiro parágrafo observa. Mas como observei na questão ligada poderia ser potencialmente útil para a resposta da questão ligada usando CBPeripheralManager anunciando o iBeacon em segundo plano
PaulWoodIII
1
Ótimo! você pode compartilhar que a documentação aqui para futuros programadores, quando eu fiz a pergunta em 2013, definitivamente, não existia ainda
PaulWoodIII

Respostas:

228

Para um iBeacon com ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, Tx Power RSSI maior 0, menor 0e calibrado -59, o pacote de anúncio BLE transmitido se parece com o seguinte:

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

Este pacote pode ser dividido da seguinte maneira:

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

A parte principal desse pacote é o Anúncio do Bluetooth, que pode ser dividido dessa maneira:

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

Qualquer dispositivo Bluetooth LE que possa ser configurado para enviar um anúncio específico pode gerar o pacote acima. Eu configurei um computador Linux usando o Bluez para enviar este anúncio, e os dispositivos iOS7 que executam o código de teste AirLocate da Apple o escolhem como um iBeacon com os campos especificados acima. Consulte: Usar pilha BlueZ como periférico (anunciante)

Este blog possui detalhes completos sobre o processo de engenharia reversa.

davidgyoung
fonte
Isso é ótimo! Exatamente o que eu estava procurando. Mas alguém poderia explicar como eu posso calcular a soma de verificação?
Benjamin Groener
Tenho outra pergunta para você nos ajudar a concluir um pouco mais as especificações. Qual parece ser o intervalo de transmissão correto em ms? Estou percebendo o uso do código de instrumentos do texas que estou usando como base para o meu iBeacon, que faz com que o aplicativo Airlocate da Apple seja meio inconsistente ao exibir uma lista de iBeacons nas proximidades.
22413 PaulWoodIII
O UUID / proximidadeUUID é um perfil BLE específico para o iBeacon ou depende do fabricante do dispositivo? Qual é o método preferido para distinguir entre dispositivos iBeacon: o endereço MAC BT, o UUID ou os valores principais / secundários?
N /
David, você conseguiu configurar um dispositivo iOS com um pacote de publicidade específico ao usar as APIs principais do Bluetooth GATT? Não consegui encontrar a opção. Você pode definir UUIDs personalizados para Serviços e Características, mas não para o anúncio.
Miguel
1
@ReinaldoJunior AD = Dados de publicidade. Veja as referências em resposta por slackhappy.
RenniePet
47

Parece basear-se nos dados do anúncio, particularmente nos dados do fabricante:

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>
  • Identificador da empresa Apple (Little Endian), 0x004c
  • tipo de dados, 0x02 => iBeacon
  • comprimento dos dados, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • principal: 0000
  • menor: 0000
  • potência medida a 1 metro: 0xc5 = -59

Eu tenho esse script node.js trabalhando no Linux com o exemplo de aplicativo AirLocate de exemplo.

sandeepmistry
fonte
Infelizmente, o script não está mais disponível. Você se importaria de compartilhá-lo novamente?
Thomaschaaf
@Thomaschaaf desculpe, removi aqui está um link para a versão antiga no Github. Também atualizei o bleacon para não exigir a criação de hcitool / hciconfig.
sandeepmistry
"potência medida a 1 metro: 0xc5 = -59" como você calcula de 0xc5 a -59?
22414 Andreasbecker.de
@ andreasbecker.de você tomar o de complemento de dois
sandeepmistry
@sandeepmistry o link para o script node.js. agora está quebrado.
21415 Tinyyu
20

Apenas para reconciliar a diferença entre a resposta do sandeepmistry e a davidgyoung:

02 01 1a 1a ff 4C 00

Faz parte da especificação do formato de dados de publicidade [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

Faltando no AD está uma definição de Serviço [5]. Eu acho que o próprio protocolo iBeacon não tem relação com o GATT e com a descoberta de serviços padrão. Se você baixar o programa iBeacon do RedBearLab, verá que eles usam o GATT para configurar os parâmetros do anúncio, mas isso parece ser específico para sua implementação e não faz parte das especificações. O programa AirLocate parece não usar o GATT para configuração, por exemplo, de acordo com o LightBlue e / ou outros programas similares que eu tentei.

Referências:

  1. Núcleo Bluetooth Spec v4, Vol 3, Parte 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
preguiçoso
fonte
Obrigado @slackhappy, atualizei minha resposta. O cabeçalho de 2 bytes é do tipo 0x02, 0x15 = 21 dados.
sandeepmistry
obrigado @slackhappy isso é bom, mas posso fazer uma pergunta idiota? Se eu quisesse enviar uma mensagem como "Venha tomar um café grátis" ou algo parecido, eu apenas substituiria FFno seu exemplo o valor HEX da minha string? (e também atualizar o comprimento da estrutura AD a suíte?)
Mark
6

Se o motivo pelo qual você fez esta pergunta é porque deseja usar o Core Bluetooth para anunciar como um iBeacon, em vez de usar a API padrão, você pode fazer isso facilmente anunciando um NSDictionary como:

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

Veja esta resposta para mais informações.

Sensível
fonte
0

O perfil do iBeacon contém 31 bytes, que inclui os seguintes

  1. Prefixo - 9 bytes - que inclui os dados adv e os dados do fabricante
  2. UUID - 16 bytes
  3. Principal - 2 bytes
  4. Menor - 2 bytes
  5. TxPower - 1 Byte

insira a descrição da imagem aqui

Ambi
fonte