Utilizando el "Bluetooth Bonjour" de iOS GameKit con otras plataforms

Estoy interesado en conectarse a dispositivos basados ​​en iOS a través de Bluetooth. Puedo ver que el service "Red local" está expuesto, pero no puedo encontrar ninguna información adicional al respecto. La propiedad almacenada bajo la key 0x0204 parece una key Bonjour.

¿Qué protocolo se usa? ¿Cómo se puede hablar con el dispositivo iOS usando Linux, Mac o el propio dispositivo incorporado equipado con un chip Bluetooth?

Aquí se extraen los datos SDP utilizando Bluetooth Explorer bajo OS X mientras que el dispositivo iOS ejecuta el Star Battalion de Gameloft.

{ 0x0000 = uint32(1330188565), 0x0200 = uint32(2), 0x0202 = string(004wD7l1A..0|0|0|ivucic-À'), 0x030a = uint32(0), 0x0009 = { { uuid16(11 15), uint16(256) } }, 0x0201 = string(_657o30a6rmst07À), 0x0005 = { uuid16(10 02) }, 0x0100 = string(Local Network), 0x0001 = { uuid16(11 15) }, 0x0203 = string(004wd7l1a..0|0|0|ivucic-_657o30a6rmst07À 0xf000 = uint8(2), 0x0204 = string( txtvers=1state=A), 0x0008 = uint8(255), 0x0006 = { uint16(25966), uint16(106), uint16(256), uint16(26226), uint16(106), uint16(272), uint16(25701), uint16(106), uint16(288), uint16(27233), uint16(106), uint16(304) }, 0x0004 = { { uuid16(01 00), uint16(15) }, { uuid16(00 0f), uint16(256), { uint16(2048), uint16(2054) } } }, 0x0002 = uint32(0) }, 

Otras preguntas parcialmente relevantes:

  • PAN con Linux, iOS, Bluetooth, Bonjour, GameKit – ¿Posible? – La persona puede resolver el problema usando Wi-Fi. No hay solución aquí porque el dispositivo integrado no tendrá el chip Wi-Fi más caro.
  • ¿Bonjour sobre bluetooth SIN Gamekit? – La mejor respuesta no termina proporcionando detalles técnicos.
  • iOS bluetooth sin GameKit : proporciona una solución para un dispositivo bloqueado, que no es aplicable aquí.

Al investigar más a background con el Bluetooth Explorer de Apple en OS X y sdptool en GNU / Linux, he descubierto que la key 0x0001 (que significa "class de protocolo"), que contiene un valor de 0x1115 , significa la variante "PANU" de "PAN" – un peer2peer variante. Es notable que OS X no brinde soporte al lado del service ('hosting') para este protocolo, a pesar de apoyar la creación de una networking 0x1116 , que es la variante "NAP" de "PAN", una variante cliente / server.

Esto podría ser una buena noticia, pero solo si el protocolo de session de GameKit no tiene que usarse. Secuestrar la connection de capa de medios establecida por GameKit para enviar otro tráfico UDP sería ideal.

Aún tendré que investigar si esta connection de GameKit es realmente 0x1115 ; es decir, si realmente es "PANU". ¿Alguien tiene más información?


Tenga en count que mientras Bonjour anunciaba este service Bluetooth automáticamente después de iOS 3, esto cambió con iOS 5. Vea la respuesta que publiqué sobre cómo establecer la connection Bluetooth sin GameKit , donde documenté de manera práctica la información de Preguntas y respuestas técnicas QA1753 de Apple .


Una pequeña cantidad de investigación con GNU / Linux no resultó en una connection exitosa. Puede deberse a la falta de conocimiento sobre cómo usar correctamente pand . También puede deberse al locking basado en Bluetooth MAC. Me encantaría la información que cualquier persona tenga para ofrecer. Si investigo esto más y tropiezo con algo interesante, actualizaré esta respuesta.


Resultados bajo Ubuntu. El service aparece solo cuando Bluetooth Bonjour está activo.

 ivucica@ivucica-MacBook:~$ sdptool browse $ADDR #relevant data only Browsing ADDRESS_HERE ... Service Name: Local Network Service RecHandle: 0x4f491115 Service Class ID List: "PAN User" (0x1115) Protocol Descriptor List: "L2CAP" (0x0100) PSM: 15 "BNEP" (0x000f) Version: 0x0100 SEQ8: 0 6 Language Base Attr List: code_ISO639: 0x656e encoding: 0x6a base_offset: 0x100 code_ISO639: 0x6672 encoding: 0x6a base_offset: 0x110 code_ISO639: 0x6465 encoding: 0x6a base_offset: 0x120 code_ISO639: 0x6a61 encoding: 0x6a base_offset: 0x130 Profile Descriptor List: "PAN User" (0x1115) Version: 0x0100 ... and so on ... 

Aquí está el bash de conectar:

 ivucica@ivucica-MacBook:~$ pand --connect $ADDR -n pand[3237]: Bluetooth PAN daemon version 4.98 pand[3237]: Connecting to ADDRESS_HERE pand[3237]: Connect to ADDRESS_HERE failed. Connection refused(111) 

¿Se requiere algún tipo de autorización? Habilitar el encryption, la authentication, la connection segura y forzar convertirse en un maestro no parece hacer ninguna diferencia (opciones -AESM en varias combinaciones).

¿Alguien tiene alguna idea?


Huh!

  ivucica @ ivucica-MacBook: ~ $ sudo hcidump
 HCI sniffer - Analizador de packages Bluetooth ver 2.2
 dispositivo: hci0 snap_len: filter 1028: 0xffffffff
  Evento HCI: estado del command (0x0f) plen 4
     Crear estado de connection (0x01 | 0x0005) 0x00 ncmd 1
 > Evento HCI: Cambio de rol (0x12) plen 8
     estado 0x00 bdaddr ADDRESS_HERE rol 0x01
     Rol: esclavo
 > Evento HCI: Connect Complete (0x03) plen 11
     estado 0x00 manejar 12 bdaddr DIRECCIÓN_HERE tipo ACL cifrar 0x00
  Evento HCI: estado del command (0x0f) plen 4
     Leer características de soporte remoto (0x01 | 0x001b) estado 0x00 ncmd 1
 > Evento HCI: Leer funciones admitidas a distancia (0x0b) plen 11
     estado 0x00 manejar 12
     Características: 0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x83
  Evento HCI: estado del command (0x0f) plen 4
     Leer características extendidas remotas (0x01 | 0x001c) estado 0x00 ncmd 1
 > Evento HCI: Cambio de Tragamonedas Max (0x1b) plen 3
     manejar 12 máquinas tragamonedas 5
 > Evento HCI: Leer características extendidas remotas (0x23) plen 13
     estado 0x00 manejar 12 página 1 max 1
     Características: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  Evento HCI: estado del command (0x0f) plen 4
     Solicitud remota de nombre (0x01 | 0x0019) estado 0x00 ncmd 1
 > Evento HCI: Nombre Remoto Requerido Completo (0x07) plen 255
     estado 0x00 bdaddr ADDRESS_HERE nombre 'Evil iPad'
  Evento HCI: estado del command (0x0f) plen 4
     Autenticación solicitada (0x01 | 0x0011) estado 0x00 ncmd 1
 > Evento HCI: Solicitud de key de enlace (0x17) plen 6
     bdaddr DIRECCIÓN_HERE
  Evento HCI: Comando Completo (0x0e) plen 10
     Solicitud de key de enlace de respuesta (0x01 | 0x000b) ncmd 1
     estado 0x00 bdaddr DIRECCIÓN_HERE
 > Evento HCI: Auth Complete (0x06) plen 3
     estado 0x00 manejar 12
  Evento HCI: estado del command (0x0f) plen 4
     Establecer el estado de Cifrado de connection (0x01 | 0x0013) 0x00 ncmd 1
 > Evento HCI: Encrypt Change (0x08) plen 4
     status 0x00 handle 12 encrypt 0x01
  Evento HCI: Número de packages completados (0x13) plen 5
     manejar 12 packages 1
 > Datos de ACL: handle 12 flags 0x02 dlen 16
     L2CAP (s): Info rsp: tipo 2 resultado 0
       Máscara de function extendida 0x02a8
         Modo de retransmisión mejorado
         Opción de FCS
         Canales fijos
         Recepción de datos sin connection Unicast
  Evento HCI: Número de packages completados (0x13) plen 5
     manejar 12 packages 1
 > Datos de ACL: manejar 12 indicadores 0x02 dlen 20
     L2CAP (s): Info rsp: tipo 3 resultado 0
       Lista de canales fija 0x00000006
         Canal de señalización L2CAP
         L2CAP Connless
  Evento HCI: Número de packages completados (0x13) plen 5
     manejar 12 packages 1
 > Datos de ACL: handle 12 flags 0x02 dlen 16
     L2CAP (s): Conectar rsp: dcid 0x0000 scid 0x0040 resultado 2 estado 0
       Conexión rechazada: no se admite PSM
 > Evento HCI: Disconn Complete (0x05) plen 4
     estado 0x00 manejar 12 motivo 0x13
     Motivo: connection remota terminada por el usuario

¿Esta?

 > Datos de ACL: handle 12 flags 0x02 dlen 16
     L2CAP (s): Conectar rsp: dcid 0x0000 scid 0x0040 resultado 2 estado 0
       Conexión rechazada: no se admite PSM

De acuerdo con este interesante sitio: http://code.google.com/p/btstack/wiki/iPhoneBluetooth Apple está utilizando un chip especial además de su chip RF de Bluetooth que niega cualquier connection para un dispositivo sin ese chip, esto significa que es un locking en el nivel de hardware.

Tal vez un poco retrasado, pero las tecnologías han evolucionado, ya que, por lo tanto, hay una nueva información en torno a la cual se traza nueva luz sobre el asunto …

El GameKit tradicional ha sido reemplazado por Multiper Connectivity junto con la introducción de soporte para WiFi Direct en iOS, sin embargo, el marco sigue siendo solo iOS. Supongo que hay cosas propias allí.

Además, como iOS todavía tiene que abrir una API directa para Wi-Fi Direct, creo que la mejor manera de abordar esto es usar BLE, que es compatible con ambas plataforms (algunas son mejores que otras).

En iOS, un dispositivo puede actuar tanto como un BLE Central como como un BLE Peripheral al mismo time, en Android la situación es más compleja ya que no todos los dispositivos admiten el estado periférico BLE. También la stack de Android BLE es muy inestable (hasta la date).

Si su caso de uso está basado en funciones, sugeriría que vean Frameworks and Libraries que puedan lograr la comunicación multiplataforma sin necesidad de buildlo desde cero.

Por ejemplo: http://p2pkit.io o google cerca

Descargo de responsabilidad: trabajo para Uepaa, desarrollando p2pkit.io para Android e iOS.