我对通过蓝牙连接iOS设备很感兴趣。我可以看到“本地网络”服务已经暴露了,但我找不到任何额外的信息。存储在0x0204键下的属性看起来像是Bonjour键。
使用了哪个协议?如何在Linux、Mac或自己的带有蓝牙芯片的嵌入式设备上与iOS设备进行通信?
以下是在iOS设备运行Gameloft的Star Battalion时使用蓝牙浏览器在OS X下提取的SDP数据。
{
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)
},
其他部分相关的问题:
- 使用Linux、iOS、蓝牙、Bonjour、GameKit进行PAN是否可能? - 该人可以使用Wi-Fi解决问题。这里没有提供解决方案,因为嵌入式设备将不会拥有更昂贵的Wi-Fi芯片。
- 无需Gamekit使用蓝牙上的Bonjour? - 最佳答案没有提供技术细节。
- iOS蓝牙无需GameKit - 提供了一个针对越狱设备的解决方案,这在这里不适用。
在OS X中使用Apple的Bluetooth Explorer和在GNU / Linux中使用sdptool
进一步研究后,我发现关键字0x0001
(代表“协议类”),包含值为0x1115
,表示“PAN”的“PANU”变体 - 点对点变体。值得注意的是,尽管支持创建0x1116
网络,即“PAN”的客户端/服务器变体,但OS X不支持此协议的服务端('hosting')支持。
这可能是好消息,但仅当不必使用GameKit的会话协议时才是如此。劫持由GameKit建立的媒体层连接以发送其他UDP流量将是理想的。
我仍然需要研究GameKit连接是否真的是0x1115
;也就是说,它是否确实是“PANU”。有没有进一步的信息?
请注意,虽然Bonjour在iOS 3之后自动宣布了此蓝牙服务,但在iOS 5中已经更改了。请参见我在如何在不使用GameKit的情况下建立蓝牙连接上发布的答案,其中我方便地记录了来自Apple的Technical Q&A QA1753的信息。
在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)
是否需要某种授权?启用加密、身份验证、安全连接和强制成为主节点似乎没有任何区别(在各种组合中使用-AESM
选项)。
有人有什么想法吗?
哎呀!
ivucica@ivucica-MacBook:~$ sudo hcidump HCI sniff工具 - 蓝牙数据包分析器 版本 2.2 设备:hci0 抓取长度:1028 过滤器:0xffffffff HCI事件:命令状态(0x0f)长度 4 创建连接(0x01|0x0005) 状态 0x00 命令数 1 > HCI事件:角色改变(0x12)长度 8 状态 0x00 BD地址 ADDRESS_HERE 角色 0x01 角色:Slave > HCI事件:连接完成(0x03)长度 11 状态 0x00 句柄 12 BD地址 ADDRESS_HERE 类型 ACL 加密 0x00 HCI事件:命令状态(0x0f)长度 4 读取远程支持的特性(0x01|0x001b) 状态 0x00 命令数 1 > HCI事件:读取远程支持的特性(0x0b)长度 11 状态 0x00 句柄 12 特性:0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x83 HCI事件:命令状态(0x0f)长度 4 读取远程扩展特性(0x01|0x001c) 状态 0x00 命令数 1 > HCI事件:最大槽位数更改(0x1b)长度 3 句柄 12 槽位数 5 > HCI事件:读取远程扩展特性(0x23)长度 13 状态 0x00 句柄 12 页面 1 最大 1 特性:0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 HCI事件:命令状态(0x0f)长度 4 远程名称请求(0x01|0x0019) 状态 0x00 命令数 1 > HCI事件:远程名称请求完成(0x07)长度 255 状态 0x00 BD地址 ADDRESS_HERE 名称 'Evil iPad' HCI事件:命令状态(0x0f)长度 4 请求身份验证(0x01|0x0011) 状态 0x00 命令数 1 > HCI事件:连接密钥请求(0x17)长度 6 BD地址 ADDRESS_HERE HCI事件:命令完成(0x0e)长度 10 连接密钥请求回复(0x01|0x000b) 命令数 1 状态 0x00 BD地址 ADDRESS_HERE > HCI事件:身份验证完成(0x06)长度 3 状态 0x00 句柄 12 HCI事件:命令状态(0x0f)长度 4 设置连接加密(0x01|0x0013) 状态 0x00 命令数 1 > HCI事件:加密更改(0x08)长度 4 状态 0x00 句柄 12 加密 0x01 HCI事件:完成的数据包数量(0x13)长度 5 句柄 12 数据包数目 1 > ACL数据:句柄 12 标志 0x02 长度 16 L2CAP(s): 信息响应:类型 2 结果 0 扩展特性掩码 0x02a8 增强重传模式 FCS选项 固定通道 单播无连接数据接收 HCI事件:完成的数据包数量(0x13)长度 5 句柄 12 数据包数目 1 > ACL数据:句柄 12 标志 0x02 长度这个吗?
> ACL数据:句柄12标志0x02 dlen 16 L2CAP(s):连接rsp:dcid 0x0000 scid 0x0040结果2状态0 连接被拒绝-PSM不受支持