use*_*877 21 iphone bonjour bluetooth
我想知道在iPhone OS 3.0或更高版本中直接使用蓝牙而不使用GameKit的可能性.有人可以提供任何例子吗?
Iva*_*ica 20
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
Run Code Online (Sandbox Code Playgroud)
但是,对于iOS5,默认情况下禁用"调用它""Bluetooth Bonjour",因此您必须使用声明的C API <dns_sd.h>.
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
);
Run Code Online (Sandbox Code Playgroud)
这只是公告部分; 解决方案有点复杂.我建议你看一下Apple的以下例子:
<dns_sd.h>.目标OS X,但包括一个SRVResolver可以在iOS上使用的类,您可以在OS X上使用它.对于iOS 5蓝牙P2P工作,更新呼叫DNSServiceQueryRecord()以传递kDNSServiceFlagsIncludeP2P为interfaceIndex.(注意!此示例似乎不存在于OS X 10.8 docset中.它可以在10.6和10.7文档集中找到.在10.8中,有DNSSDObjects示例,但我并没有完全了解它的作用.)<dns_sd.h>.在宣布或解决您的服务后,您可以使用常规BSD套接字来收听或连接.在编写服务器时,您甚至可能希望首先listen()在端口0(零)上,然后查询分配给您的随机可用端口.查询后,宣布此端口而不是固定端口.这正是WiTap示例所做的(但使用CFSocket API而不是BSD套接字API).
有关BSD套接字的更多信息,请参阅Google周围的教程.
注意:有关iOS 5的信息来自Apple的技术问答QA1753.
阅读这篇文章:在iOS 5.0上通过蓝牙进行Bonjour https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315
这是IOS 5.0中的已知问题,需要使用较低级别的API解决:DNSSDObjects.
如果启用了蓝牙,在足够新的设备(3G 及以上,或 iPod 同等产品,或 iPad)和足够新的操作系统(显然是 3.1)上,Bonjour 将自动使用链接本地地址 (168.254.*) 通过蓝牙工作。然后就可以正常使用TCP/UDP了。
(在幕后,我很确定 GameKit 使用 Bonjour-over-IP-over-Bluetooth。)
一般来说,发布/浏览是在蓝牙层完成的,但如果一个发布 Bonjour 服务而另一个浏览它,则会建立自动 IP-over-Bluetooth 连接。
任何 Bonjour 示例都应该自动运行。