我想知道在 iPhone OS 3.0 或更高版本中直接使用 bonjour 通过蓝牙而不使用 GameKit 的可能性。任何人都可以提供任何例子吗?
3 回答
只需宣布服务,就像tc. 在下面说过:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
然而,在 iOS5 中,我们称之为“Bluetooth Bonjour”默认是禁用的,所以你必须使用在<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
);
这只是公告部分;解析有点复杂。我建议您看一下 Apple 的以下示例:
- SRVResolver - 演示如何使用在
<dns_sd.h>
. 以 OS X 为目标,但包含一个名为的类SRVResolver
,您可以在 iOS 上像在 OS X 上一样轻松使用它。要使 iOS 5 蓝牙 P2P 正常工作,请将调用DNSServiceQueryRecord()
更新kDNSServiceFlagsIncludeP2P
为interfaceIndex
. (注意!这个示例在 OS X 10.8 文档集中似乎不存在。它可以在 10.6 和 10.7 文档集中找到。在 10.8 中,有 DNSSDObjects 示例,但我没有看清楚它的作用。) - WiTap - 只要你实际上并不关心 iOS 5 上的蓝牙支持,只要看看名为 WiTap 的示例,它不仅演示了漂亮的 Objective-C API,还演示了如何使用 CFSocket API 创建服务器(瘦BSD 套接字的包装器)。即使您使用 SRVResolver 来了解如何使用
<dns_sd.h>
.
在宣布或解决您的服务后,您使用常规 BSD 套接字来侦听或连接。在编写服务器时,您甚至可能希望首先listen()
使用端口 0(零),然后查询分配给您的随机可用端口。查询后,宣布此端口而不是固定端口。这正是 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。)
Sypposedly 发布/浏览是在蓝牙层完成的,但是如果一个发布 Bonjour 服务而另一个浏览它,则会建立一个自动 IP-over-Bluetooth 连接。
任何 Bonjour 示例都应该自动工作。