21

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

4

3 回答 3

20

只需宣布服务,就像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()更新kDNSServiceFlagsIncludeP2PinterfaceIndex. 注意!这个示例在 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

于 2011-11-25T19:53:38.203 回答
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。

于 2012-01-08T10:01:55.067 回答
2

如果启用了蓝牙,在足够新的设备(3G 及更高版本,或 iPod 等效设备,或 iPad)和足够新的操作系统(显然是 3.1)上,Bonjour 将使用链接本地地址 (168.254.*) 自动通过蓝牙工作. 然后你就可以正常使用 TCP/UDP 了。

(在后台,我很确定 GameKit 使用的是 Bonjour-over-IP-over-Bluetooth。)

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

任何 Bonjour 示例都应该自动工作。

于 2010-10-02T13:27:30.683 回答