【问题标题】:Bonjour over bluetooth WITHOUT Gamekit ?Bonjour 在没有 Gamekit 的情况下通过蓝牙?
【发布时间】:2011-04-20 03:22:52
【问题描述】:

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

【问题讨论】:

  • 在 2012 年 3 月 11 日的编辑中,您完全改变了问题。在收到三个答案并与其他问题相关联之后,这是一种不好的做法,并且看起来好心回答您的人现在正在漫无目的,提供不相关的答案。你能问一个新问题吗? :-)

标签: iphone bluetooth bonjour


【解决方案1】:

只需宣布服务,就像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 的示例:

  • SRVResolver - 演示如何使用<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 示例,但我没有看正是它的作用。)
  • WiTap - 只要你实际上并不关心 iOS 5 上的蓝牙支持,只要看看名为 WiTap 的示例,它不仅演示了漂亮的 Objective-C API,还演示了如何使用 CFSocket 创建服务器API(BSD 套接字周围的瘦包装器)。即使您正在使用 SRVResolver,您也需要查看此内容以了解如何使用来自 <dns_sd.h> 的基于 C 的 API。

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

有关 BSD 套接字的更多信息,请在 Google 上查找教程。

注意:有关 iOS 5 的信息来自 Apple 的Technical Q&A QA1753

【讨论】:

  • 我很惊讶你没有在任何地方提到AsyncSocket..你推荐/反对它吗?还是使用上面提到的API就足够了?
  • @abbood:我没用过AsyncSocket。但是,只要您按照我的回答中所述宣布服务,操作系统就会启动可以连接两个 iOS 设备的蓝牙 PAN 服务。这使您能够通过蓝牙而不是 WiFi 或 GS​​M 建立 TCP 或 UDP 连接。您将如何实际建立它(直接 BSD 套接字或通过 AsyncSocket 之类的包装器)——这实际上是无关紧要的。 :-)
【解决方案2】:

阅读本文:在 iOS 5.0 上通过蓝牙享受 Bonjour https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315

这是 IOS 5.0 中的一个已知问题,需要使用较低级别的 API 解决:DNSSDObjects。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您知道使用的是哪种蓝牙服务,以及如何与使用 Linux、Mac 或自己的配备蓝牙芯片的嵌入式设备的 iOS 设备通信吗?
    • @IvanVučica:我相信它是蓝牙 PAN,但我听说该服务也通过蓝牙进行广告宣传,除非必要,否则 PAN 不会启动。
    • 我在这里详细介绍了我的一些观察:stackoverflow.com/questions/8070998/… 但是,我需要技术细节。它确实闻起来有 PAN 的味道,但宣传的方式略有不同,只是为了让它看起来不是 PAN。不过,我还没有机会嗅探协议。
    • 它甚至被宣传为 0x1115 - PANU - 除了看起来 OS X 不知道如何直接与另一个 PANU 设备对话。令人困惑。我会在使用 Linux 机器时进行更多探索:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多