Bonjour不是通过BT广告

过去一周左右,我一直在抨击我的头脑。 我已经通过了以下资源:

  • StackOverflow:通过蓝牙Bonjour没有Gamekit? (3844189)
  • StackOverflow:如何通过蓝牙工作Bonjour(3350094)
  • StackOverflow:在其他平台上使用iOS GameKit的“蓝牙Bonjour”(8070998)
  • 技术问答QA1753 – 苹果开发者
  • WiTap示例应用程序
  • SRVResolver示例应用程序
  • DNSSDObjects示例应用程序

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

我的问题是这样的:我正在修改一个当前使用GameKit的对等select器来连接iPad和iP {}的应用程序。 我们想修改这个以通过蓝牙使用Bonjour,而不是因为我们在连接丢失的情况下使用Gamekit重新连接设备。 我已经使用dns_sd.h API来取得一些成功,并已获得服务,通过无线广告和解决,但即使我通过kDNSServiceFlagsIncludeP2P我没有得到任何成功通过蓝牙。

我认为蓝牙Bonjour可能需要在设备之间build立一个PAN,但即使将iPad与iMac配对,浏览DNS-SD服务也不会给我带来任何影响,iPhone也不会与iPad配对。

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

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

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

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

如果你想限制自己只是蓝牙,而不是WiFi,那么相同的三行代码应该更新,所以第三个参数是kDNSServiceInterfaceIndexP2P而不是kDNSServiceInterfaceIndexAny

确实,它看起来像kDNSServiceInterfaceIndexP2P标志将无法在OSX上工作。

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

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