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

Posted

技术标签:

【中文标题】在其他平台上使用 iOS GameKit 的“Bluetooth Bonjour”【英文标题】:Using iOS GameKit's "Bluetooth Bonjour" with other platforms 【发布时间】:2011-12-25 15:21:38 【问题描述】:

我有兴趣通过蓝牙连接到基于 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)
    ,

其他部分相关的问题:

PAN with Linux, iOS, Bluetooth, Bonjour, GameKit — Possible? - 人们可以使用 Wi-Fi 解决问题。这里不是解决方案,因为嵌入式设备不会有更昂贵的 Wi-Fi 芯片。 Bonjour over bluetooth WITHOUT Gamekit? - 最佳答案最终不会提供技术细节 iOS bluetooth without GameKit - 提供越狱设备的解决方案,此处不适用。

在 OS X 中使用 Apple 的蓝牙资源管理器和 GNU/Linux 中的 sdptool 进一步研究,我发现密钥 0x0001(代表“协议类”),包含值 0x1115,代表“PANU " "PAN" 的变体 - peer2peer 变体。值得注意的是,尽管支持创建0x1116 网络(它是“PAN”的“NAP”变体 - 客户端/服务器变体),但 OS X 并未为此协议提供服务端(“托管”)支持。

这可能是个好消息,但前提是不必使用 GameKit 的会话协议。劫持 GameKit 建立的媒体层连接以发送其他 UDP 流量是理想的选择。

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


注意,虽然 Bonjour 在 iOS 3 之后自动宣布了这项蓝牙服务,但随着 iOS 5 发生了变化。请参阅我在 how to establish Bluetooth connection without 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 嗅探器 - 蓝牙数据包分析器 2.2 版
设备:hci0 snap_len:1028 过滤器:0xffffffff
 HCI 事件:命令状态 (0x0f) plen 4
    创建连接 (0x01|0x0005) 状态 0x00 ncmd 1
> HCI 事件:角色更改 (0x12) plen 8
    状态 0x00 bdaddr ADDRESS_HERE 角色 0x01
    角色:奴隶
> HCI 事件:连接完成 (0x03) plen 11
    状态 0x00 句柄 12 bdaddr ADDRESS_HERE 类型 ACL 加密 0x00
 HCI 事件:命令状态 (0x0f) plen 4
    读取远程支持的功能 (0x01|0x001b) 状态 0x00 ncmd 1
> HCI 事件:读取远程支持的功能 (0x0b) plen 11
    状态 0x00 句柄 12
    特征:0xbf 0xfe 0x8f 0xfe 0x9b 0xff 0x79 0x83
 HCI 事件:命令状态 (0x0f) plen 4
    读取远程扩展功能 (0x01|0x001c) 状态 0x00 ncmd 1
> HCI 事件:最大插槽更改 (0x1b) plen 3
    手柄 12 插槽 5
> HCI 事件:读取远程扩展功能 (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
    已请求身份验证 (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 事件:身份验证完成 (0x06) plen 3
    状态 0x00 句柄 12
 HCI 事件:命令状态 (0x0f) plen 4
    设置连接加密 (0x01|0x0013) 状态 0x00 ncmd 1
> HCI 事件:加密更改 (0x08) plen 4
    状态 0x00 句柄 12 加密 0x01
 HCI 事件:已完成数据包数 (0x13) plen 5
    处理 12 个数据包 1
> ACL 数据:处理 12 个标志 0x02 dlen 16
    L2CAP(s):信息 rsp:类型 2 结果 0
      扩展功能掩码 0x02a8
        增强重传模式
        FCS 选项
        固定频道
        单播无连接数据接收
 HCI 事件:已完成数据包数 (0x13) plen 5
    处理 12 个数据包 1
> ACL 数据:处理 12 个标志 0x02 dlen 20
    L2CAP(s):信息 rsp:类型 3 结果 0
      固定频道列表0x00000006
        L2CAP 信令通道
        L2CAP 无连接
 HCI 事件:已完成数据包数 (0x13) plen 5
    处理 12 个数据包 1
> ACL 数据:处理 12 个标志 0x02 dlen 16
    L2CAP(s):连接 rsp:dcid 0x0000 scid 0x0040 结果 2 状态 0
      连接被拒绝 - 不支持 PSM
> HCI 事件:Disconn 完成 (0x05) plen 4
    状态 0x00 句柄 12 原因 0x13
    原因:远程用户终止连接

这个?

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

【问题讨论】:

另请参阅 mringwal 对类似问题 Is it possible, in principle, for an android device to interface with an iPhone over Bluetooth/GameKit? 的回答,了解有关此问题的另一个提示。 @BradLarson 这是一个惊人的提示!谢谢! 您是否有特别需要使用 Bonjour 的原因?我在考虑同样的事情(在我的情况下,用于 iOS 设备和 C# WPF 应用程序之间的同步)。我最终最终使用了DropBox,因为它具有出色的 API,可用于大量平台并允许你做你想做的事。据我所知,即使 Bonjour “有效”,它也只有大约 40% 的时间有效。 我打算交换命令而不是文件。我计划与没有 WLAN 卡的嵌入式设备交换命令。与 WLAN 卡相比,蓝牙芯片更便宜、更简单、更容易获得并且耗电量更少。我对经典 LAN/WLAN Bonjour 也有零问题,它作为一项发现服务一直对我有用。 (除非您在谈论蓝牙变体,否则我将其称为 FUD;) Bluetooth Bonjour 之所以有趣,不是因为它比经典 Bonjour 或蓝牙自己的 SDP 做得更好,而是因为它在 iOS 上打开了一个 PANU 服务,因此是唯一一个在 iOS 上通过蓝牙通话的官方 API,没有申请昂贵且复杂的 MFI(对于我正在考虑的小批量项目来说很麻烦)。 【参考方案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 或附近的谷歌

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

【讨论】:

【参考方案2】:

根据这个有趣的网站: http://code.google.com/p/btstack/wiki/iPhoneBluetooth Apple 在他们的蓝牙 RF 芯片之外使用了一个特殊的芯片,它拒绝没有该芯片的设备的任何连接 - 这意味着它锁定了硬件级别。

【讨论】:

在使用蓝牙 Bonjour 时,他们总是有可能激活此检查,但考虑到您可以购买现成的蓝牙键盘、鼠标、耳机,并且您可以使用非 Apple 品牌的计算机或其他设备,我认为没有足够的证据可以肯定地表明在建立 Bluetooth Bonjour 的 PAN 连接时存在加密检查。 对,你说得非常正确,伊万——我就像你在研究蓝牙解决方案——IOS——vs——其他平台。但是,请记住蓝牙具有配置文件——因此 Apple 可以非常轻松地定义可以连接到耳机和键盘,而不能连接到其他设备。您对此有何看法? 绝对有可能,但我还没有探索所有选项。我还没有玩过 EIR,这可能是允许连接的关键。在任何情况下,通过... drumroll ...连接目标设备可以非常轻松地使用 PAN 是一件很有趣的事情。不幸的是,这不能自动化,需要配对!

以上是关于在其他平台上使用 iOS GameKit 的“Bluetooth Bonjour”的主要内容,如果未能解决你的问题,请参考以下文章

iOS gamekit/蓝牙数据流

GameKit 错误表示玩家未通过身份验证,但 .authenticated 属性 = true

发送 iOS GameKit 消息所需的时间

在 iPhone 上以编程方式打开蓝牙

为啥新的 iOS GameKit 会在代理和块之间拆分?

使用 GameKit 将数据保存到不同帐户的 iCloud