使用iOS GameKit的“蓝牙Bonjour”功能与其他平台配对

68

我对通过蓝牙连接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)
    },

其他部分相关的问题:


在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不受支持

3
另外,有关此问题的提示,请参阅mringwal对相似问题的回答在Android设备与iPhone之间通过蓝牙/GameKit接口是否原则上可行? - Brad Larson
@BradLarson 这是一个很棒的提示!谢谢! - Ivan Vučica
你特别需要使用Bonjour的原因是什么?我也在考虑同样的事情(在我的情况下,是为了在iOS设备和C# WPF应用程序之间进行同步)。最终,我选择使用DropBox,因为它拥有出色的API,适用于许多平台,并允许您做想做的事情。据我所知,即使Bonjour“工作”,它也只能正常工作约40%的时间。 - Echilon
新的Core Bluetooth API怎么样?(虽然它仅限于BT 4 LE,并且可能与要通信的设备不兼容。)http://developer.apple.com/library/ios/#documentation/CoreBluetooth/Reference/CoreBluetooth_Framework/_index.html - Sixten Otto
正如@SixtenOtto所说,只支持低功耗蓝牙4设备,并且仅限于iOS5及以上版本。 - Ivan Vučica
显示剩余2条评论
2个回答

8

2
他们在使用蓝牙Bonjour时可能会激活此检查,但考虑到您可以购买现成的蓝牙键盘、鼠标、耳机,并且您可以通过iPhone使用非苹果品牌的计算机或其他设备进行绑定,我认为没有足够的证据明确说明在建立蓝牙Bonjour的PAN连接时存在加密检查。 - Ivan Vučica
1
没错,伊万,你说得很对 - 我和你一样正在研究蓝牙解决方案 - IOS - 与其他平台的比较。 但是,请记住蓝牙有配置文件 - 因此苹果可以非常容易地定义连接到耳机和键盘是可能的,而连接到其他设备则不可能。 你对此有什么看法? - James Roeiter
1
肯定是可能的,但我还没有探索所有选项。我还没有尝试过EIR,这可能是允许连接的关键。无论如何,有趣的是,我们可以通过... 鼓声 ...将目标设备连接起来,非常容易地使用PAN。不幸的是,这不能自动化,需要配对! - Ivan Vučica

1
也许有些延迟,但技术已经发展了,因此肯定有新的信息可以为这个问题带来新的光芒......传统的GameKit已被Multiper Connectivity取代,并引入了对iOS上WiFi Direct的支持,但框架仍然仅限于iOS。我认为其中可能有专有的东西在起作用。另外,由于iOS尚未为WiFi Direct开放直接API,我认为最好的方法是使用BLE,它被两个平台所支持(某些比其他平台更好)。在iOS上,设备可以同时作为BLE Central和BLE Peripheral,而在Android上,情况更加复杂,因为并非所有设备都支持BLE Peripheral状态。此外,截至目前,Android BLE堆栈非常不稳定。如果您的用例是以功能为驱动的,则建议查看可以为您实现跨平台通信的框架和库,而无需从头开始构建。例如:http://p2pkit.io或Google Nearby。声明:我为Uepaa工作,为Android和iOS开发p2pkit.io。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接