【问题标题】:Bonjour not advertising over BTBonjour 不在 BT 上做广告
【发布时间】:2012-10-19 20:59:16
【问题描述】:

在过去一周左右的时间里,我一直在努力解决这个问题。我已经浏览了以下资源:

  • StackOverflow:在没有 Gamekit 的情况下通过蓝牙享受 Bonjour? (3844189)
  • StackOverflow:Bonjour Over Bluetooth 的工作原理 (3350094)
  • StackOverflow:在其他平台上使用 iOS GameKit 的“Bluetooth Bonjour” (8070998)
  • 技术问答 QA1753 -- 苹果开发者
  • WiTap 示例应用程序
  • SRVResolver 示例应用程序
  • DNSSDObjects 示例应用程序

我使用的是 Mac OS 10.7、Xcode 4.5、带有 iOS 6 的 iPhone 4 和带有 iOS 5.1.1 的 iPad 1。

我的问题是:我正在修改一个应用程序,该应用程序当前使用 GameKit 的对等选择器在 iPad 和 iP{hone|od touch} 之间进行连接。我们想修改它以通过蓝牙使用 Bonjour,因为如果连接丢失,我们在使用 Gamekit 重新连接设备时遇到了问题。我已经使用 dns_sd.h API 取得了一些成功,并且已经获得了通过 wifi 进行广告和解析的服务,但是即使我通过了 kDNSServiceFlagsIncludeP2P,我也没有通过蓝牙获得任何成功。

我认为蓝牙 Bonjour 可能已经需要在设备之间建立 PAN,但即使将 iPad 与 iMac 配对并浏览 DNS-SD 服务也没有给我任何帮助……而且 iPhone 也不会与 iPad 配对。

【问题讨论】:

    标签: ios ios5 bluetooth bonjour


    【解决方案1】:

    在过去的 24 小时内,我刚刚在自己的应用中解决了这个问题。我使用了 OS X 示例应用程序 DNSSDObjects 中的核心类。我只需要更改三行代码即可添加对蓝牙的支持。这在我的 iOS 应用中效果很好。

    在 DNSSDBrowser.m 中,对 DNSServiceBrowse 的调用需要为第二个参数传入 kDNSServiceFlagsIncludeP2P

    在 DNSSDRegister.m 中,对 DNSServiceRegister 的调用需要进行相同的更改。

    在 DNSSDService.m 中,对 DNSServiceResolve 的调用也需要进行相同的更改。

    如果您想只使用蓝牙而不是 WiFi,则应更新相同的三行代码,以便第三个参数为 kDNSServiceInterfaceIndexP2P 而不是 kDNSServiceInterfaceIndexAny .

    【讨论】:

    • 是的!我也在使用 DNSSDObjects,但我忘记更新对 DNSServiceBrowse 的调用以包含 kDNSServiceFlagsIncludeP2P。
    • 那么蓝牙 Bonjour 最终是否需要在设备之间建立 PAN?
    【解决方案2】:

    确实,看起来 kDNSServiceInterfaceIndexP2P 标志在 OSX 上不起作用。

    如果您在 IOS 上运行代码,您会注意到 Bonjour 将发布两个 IP 地址:一个用于本地 WiFi 网络,一个 169.xx.xx.xx 地址用于蓝牙。

    OSX 上的相同代码从不发布 169.xx.xx.xx 地址,因此只能通过 WiFi 找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多