Bonjour over bluetooth没有Gamekit?

use*_*877 21 iphone bonjour bluetooth

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

Iva*_*ica 20

只需宣布服务,就像tc一样.如下所述:

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的以下例子:

  • SRVResolver - 演示如何使用声明的API查找服务<dns_sd.h>.目标OS X,但包括一个SRVResolver可以在iOS上使用的类,您可以在OS X上使用它.对于iOS 5蓝牙P2P工作,更新呼叫DNSServiceQueryRecord()以传递kDNSServiceFlagsIncludeP2PinterfaceIndex.(注意!此示例似乎不存在于OS X 10.8 docset中.它可以在10.6和10.7文档集中找到.在10.8中,有DNSSDObjects示例,但我并没有完全了解它的作用.)
  • WiTap - 只要您不关心iOS 5上的蓝牙支持,只需看看名为WiTap的示例,该示例不仅演示了漂亮的Objective-C API,还演示了如何使用CFSocket API创建服务器(瘦) BSD套接字周围的包装器).即使您使用SRVResolver来查看如何使用基于C的API,您也希望看到这一点<dns_sd.h>.

在宣布或解决您的服务后,您可以使用常规BSD套接字来收听或连接.在编写服务器时,您甚至可能希望首先listen()在端口0(零)上,然后查询分配给您的随机可用端口.查询后,宣布此端口而不是固定端口.这正是WiTap示例所做的(但使用CFSocket API而不是BSD套接字API).

有关BSD套接字的更多信息,请参阅Google周围的教程.

注意:有关iOS 5的信息来自Apple的技术问答QA1753.


Jam*_*ter 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.


tc.*_*tc. 2

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

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

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

任何 Bonjour 示例都应该自动运行。

  • 我在这里详细介绍了我的一些观察结果:http://stackoverflow.com/questions/8070998/using-ios-gamekits-bluetooth-bonjour-with-other-platforms 但是,我需要技术细节。它确实有 PAN 的气味,但广告方式略有不同,只是为了让它看起来不像 PAN。不过,我还没有机会嗅探协议。 (2认同)
  • 它甚至被宣传为 0x1115 - PANU - 但看起来 OS X 不知道如何直接与另一个 PANU 设备通信。令人困惑。当我使用 Linux 机器时我会探索更多:) (2认同)