在其他平台上使用iOS GameKit的“蓝牙Bonjour”

我有兴趣通过蓝牙连接到基于iOS的设备。 我可以看到“本地networking”服务是暴露的,但我无法find任何额外的信息。 存储在密钥0x0204下的属性看起来像Bonjour键。

使用哪种协议? 如何使用Linux,Mac或自己的embedded式设备与蓝牙芯片进行通话?

这里是使用蓝牙浏览器在OS X下提取的SDP数据,而iOS设备运行Gameloft的Star营。

{ 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) }, 

其他部分相关的问题:

  • PAN与Linux,iOS,蓝牙,Bonjour,GameKit – 可能吗? – 人可以使用Wi-Fi解决问题。 因为embedded式设备不会有更昂贵的Wi-Fi芯片的方式在这里不解决。
  • Bonjour通过蓝牙无需Gamekit? – 最好的答案不会提供技术细节
  • 没有GameKit的iOS蓝牙 – 为越狱设备提供解决scheme,这在这里不适用。

使用OS X中的Apple蓝牙浏览器和GNU / Linux中的sdptool进一步研究,我发现包含值0x1115密钥0x0001 (代表“协议类”)代表“PAN”的“PANU”变体 – 对等体2变种。 值得注意的是,尽pipeOS X支持创build0x1116networking,即“PAN”的“NAP”变体(客户机/服务器变体),但OS X并未为此协议提供服务端(“托pipe”)支持。

这可能是一个好消息,但只有在GameKit的会话协议不必被使用的情况下。 劫持由GameKitbuild立的媒体层连接以发送其他UDPstream量将是理想的。

我仍然必须研究这个GameKit连接是否真的是0x1115 ; 也就是说,如果真的是“PANU”的话。 有没有人有任何进一步的信息?


请注意,虽然Bonjour在iOS 3之后自动发布了这项蓝牙服务,但iOS 5已经发生了变化。请参阅我发布的关于如何在没有GameKit的情况下build立蓝牙连接的问题 ,我可以轻松logging来自Apple Q&A QA1753的信息 。


less量使用GNU / Linux的研究并没有导致成功的连接。 这可能是由于缺乏如何正确使用pand的知识。 这也可能是由于基于蓝牙MAC的阻塞。 我很喜欢任何人可能要提供的信息。 如果我进一步研究这个,并偶然发现一些有趣的事情,我会更新这个答案。


在Ubuntu下的结果。 该服务仅在蓝牙Bonjour处于活动状态时出现。

 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 ... 

这是连接的尝试:

 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) 

是否需要某种授权? 启用encryption,authentication,安全连接和强制成为主人似乎没有任何区别( -AESM选项在各种组合)。

任何人有任何想法?


咦!

  ivucica @ ivucica-MacBook:〜$ sudo hcidump
 HCI嗅探器 - 蓝牙数据包分析器版本2.2
设备:hci0 snap_len:1028filter:0xffffffff
  HCI事件:命令状态(0x0f)plen 4
    创build连接(0x01 | 0x0005)状态0x00 ncmd 1
 > HCI事件:angular色变更(0x12)plen 8
    状态0x00 bdaddr ADDRESS_HEREangular色0x01
    angular色:奴隶
 > HCI事件:连接完成(0x03)plen 11
    状态0x00句柄12 bdaddr ADDRESS_HEREtypesACLencryption0x00
  HCI事件:命令状态(0x0f)plen 4
    读取远程支持的function(0x01 | 0x001b)状态0x00 ncmd 1
 > HCI事件:读取远程支持的function(0x0b)plen 11
    状态0x00句柄12
    特征:0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x83
  HCI事件:命令状态(0x0f)plen 4
    读取远程扩展function(0x01 | 0x001c)状态0x00 ncmd 1
 > HCI事件:最大插槽更改(0x1b)plen 3
    处理12个插槽5
 > HCI事件:读远程扩展function(0x23)plen 13
    状态0x00句柄12第1页最大1
    特性:0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  HCI事件:命令状态(0x0f)plen 4
    远程名称请求(0x01 | 0x0019)状态0x00 ncmd 1
 > HCI事件:远程名称请求完成(0x07)plen 255
    状态0x00 bdaddr ADDRESS_HERE名字“邪恶的iPad”
  HCI事件:命令状态(0x0f)plen 4
    身份validation请求(0x01 | 0x0011)状态0x00 ncmd 1
 > HCI事件:链接密钥请求(0x17)plen 6
     bdaddr ADDRESS_HERE
  HCI事件:命令完成(0x0e)plen 10
    链接密钥请求回复(0x01 | 0x000b)ncmd 1
    状态0x00 bdaddr ADDRESS_HERE
 > HCI Event:Auth Complete(0x06)plen 3
    状态0x00句柄12
  HCI事件:命令状态(0x0f)plen 4
    设置连接encryption(0x01 | 0x0013)状态0x00 ncmd 1
 > HCI事件:encryption更改(0x08)plen 4
    状态0x00句柄12encryption0x01
  HCI事件:完成数据包数(0x13)plen 5
    处理12包1
 > ACL数据:处理12个标志0x02 dlen 16
     L2CAP:信息rsp:types2结果0
      扩展function掩码0x02a8
        增强重传模式
         FCS选项
        固定频道
        单播无连接数据接收
  HCI事件:完成数据包数(0x13)plen 5
    处理12包1
 > ACL数据:处理12个标志0x02 dlen 20
     L2CAP:信息rsp:types3结果0
      固定频道列表0x00000006
         L2CAP信令信道
         L2CAP Connless
  HCI事件:完成数据包数(0x13)plen 5
    处理12包1
 > ACL数据:处理12个标志0x02 dlen 16
     L2CAP(s):连接rsp:dcid 0x0000 scid 0x0040结果2状态0
      连接被拒绝 - 不支持PSM
 > HCI Event:Disconn Complete(0x05)plen 4
    状态0x00处理12原因0x13
    原因:远程用户终止连接

这个?

 > ACL数据:处理12个标志0x02 dlen 16
     L2CAP(s):连接rsp:dcid 0x0000 scid 0x0040结果2状态0
      连接被拒绝 - 不支持PSM

根据这个有趣的网站: http : //code.google.com/p/btstack/wiki/iPhoneBluetooth除了蓝牙射频芯片,苹果公司正在使用一种特殊的芯片,它拒绝没有芯片的设备的任何连接 – 这意味着它的锁在硬件上。

也许有点延迟,但是技术已经发展了,所以肯定有新的信息可以提供新鲜的信息。

传统的GameKit已经被Multiper Connectivity所取代,同时在iOS上引入了对WiFi Direct的支持,但是这个框架仍然只是iOS。 我假设那里有专有的东西。

此外,由于iOS尚未开放WiFi Direct的直接API,我认为最好的方法是使用两种平台(比其他平台都支持)更好的BLE。

在iOS上,设备可以同时作为BLE中央处理器和BLE外设,在Android上情况更为复杂,因为并非所有设备都支持BLE外设状态。 另外Android BLE堆栈非常不稳定(迄今为止)。

如果您的用例是function驱动的,那么我build议您查看可以为您实现跨平台通信的框架和库,而无需从头构build它。

例如: http : //p2pkit.io或谷歌附近

免责声明:我为Uepaa工作,为Android和iOS开发p2pkit.io。