我想知道在不使用GameKit的情况下直接在iPhone OS 3.0或更高版本中直接使用蓝牙的可能性。任何人都可以提供任何例子吗?
答案 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的以下例子:
<dns_sd.h>
中声明的API查找服务。目标OS X,但包括一个名为SRVResolver
的类,您可以在iOS上使用它,就像在OS X上使用它一样容易。对于iOS 5蓝牙P2P工作,更新调用DNSServiceQueryRecord()
以通过kDNSServiceFlagsIncludeP2P
为interfaceIndex
。 (注意!此示例似乎不存在于OS X 10.8 docset中。它可以在10.6和10.7 docset中找到。在10.8中,有DNSSDObjects示例,但我没看正是它的作用。) <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示例都应自动生效。