Bonjour over bluetooth没有Gamekit?

时间:2010-10-02 03:04:44

标签: iphone bluetooth bonjour

我想知道在不使用GameKit的情况下直接在iPhone OS 3.0或更高版本中直接使用蓝牙的可能性。任何人都可以提供任何例子吗?

3 个答案:

答案 0 :(得分:20)

只需宣布该服务,就像tc. has said below

一样
self.netService = [[[NSNetService alloc] initWithDomain:@"" 
                                                   type:@"_http._tcp" 
                                                   name:@"" 
                                                   port:8080] autorelease];
[self.netService publish];

然而,对于iOS5,默认情况下禁用“call-it”“Bluetooth Bonjour”,因此您必须使用<dns_sd.h>中声明的C API。

DNSServiceRef serviceRef;
DNSServiceRegister(&serviceRef, // sdRef
                   kDNSServiceFlagsIncludeP2P, // interfaceIndex
                   0, // flags
                   NULL, // name
                   "_http._tcp", // regtype
                   NULL, // domain
                   NULL, // host
                   1291, // port
                   0, // txtLen
                   NULL, // txtRecord
                   NULL, // callBack,
                   NULL // context
                   );

这只是公告部分;解决方案有点复杂。我建议你看一下Apple的以下例子:

  • SRVResolver - 演示如何使用<dns_sd.h>中声明的API查找服务。目标OS X,但包括一个名为SRVResolver的类,您可以在iOS上使用它,就像在OS X上使用它一样容易。对于iOS 5蓝牙P2P工作,更新调用DNSServiceQueryRecord()以通过kDNSServiceFlagsIncludeP2PinterfaceIndex注意!此示例似乎不存在于OS X 10.8 docset中。它可以在10.6和10.7 docset中找到。在10.8中,有DNSSDObjects示例,但我没看正是它的作用。)
  • WiTap - 只要您不关心iOS 5上的蓝牙支持,只需看看名为WiTap的示例,它不仅演示了漂亮的Objective-C API,还展示了如何使用CFSocket创建服务器API(BSD套接字周围的薄包装)。即使您使用SRVResolver查看如何使用<dns_sd.h>中基于C的API,您也会想要查看此内容。

在宣布或解决您的服务后,您可以使用常规BSD套接字来收听或连接。在编写服务器时,您甚至可能希望在端口0(零)上先listen(),然后查询为您分配的随机可用端口。查询后,宣布此端口而不是固定端口。这正是WiTap示例所做的(但使用CFSocket API而不是BSD套接字API)。

有关BSD套接字的更多信息,请参阅Google,获取教程。

注意:有关iOS 5的信息来自Apple的Technical Q&A QA1753

答案 1 :(得分:5)

阅读这篇文章:在iOS 5.0上通过蓝牙Bonjour https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315

这是IOS 5.0中的一个已知问题,需要使用较低级别的API解决:DNSSDObjects。

答案 2 :(得分:2)

如果启用了蓝牙,在足够新的设备(3G及以上,或iPod等效产品或iPad)和足够新的操作系统(3.1显然)上,Bonjour将使用链接本地地址自动使用蓝牙(168.254) 。*)。然后你只需正常使用TCP / UDP。

(在引擎盖下,我很确定GameKit使用Bonjour-over-IP-over-Bluetooth。)

相反,发布/浏览是在蓝牙层完成的,但如果有人发布Bonjour服务而另一个浏览它,则会建立自动IP蓝牙连接。

任何Bonjour示例都应自动生效。