【发布时间】:2011-04-20 03:22:52
【问题描述】:
我想知道在 iPhone OS 3.0 或更高版本中直接使用 bonjour over 蓝牙而不使用 GameKit 的可能性。任何人都可以提供任何例子吗?
【问题讨论】:
-
在 2012 年 3 月 11 日的编辑中,您完全改变了问题。在收到三个答案并与其他问题相关联之后,这是一种不好的做法,并且看起来好心回答您的人现在正在漫无目的,提供不相关的答案。你能问一个新问题吗? :-)
我想知道在 iPhone OS 3.0 或更高版本中直接使用 bonjour over 蓝牙而不使用 GameKit 的可能性。任何人都可以提供任何例子吗?
【问题讨论】:
只需宣布服务,就像tc. has said below:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
然而,在 iOS5 中,我们称之为“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 的类,您可以像在 OS X 上一样轻松地在 iOS 上使用它。要使 iOS 5 蓝牙 P2P 正常工作,请将调用更新为 DNSServiceQueryRecord() 以将 kDNSServiceFlagsIncludeP2P 传递为interfaceIndex。 (注意! 这个示例在 OS X 10.8 文档集中似乎不存在。它可以在 10.6 和 10.7 文档集中找到。在 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。
【讨论】:
阅读本文:在 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 示例都应该自动运行。
【讨论】: