Android 可以通过蓝牙支持 Zeroconf/Bonjour 吗? TCP/IP 怎么样?
在 iPhone 上,如果我创建自定义服务,例如“_test._tcp.local”。在 Bonjour 中,我可以通过 WiFi 或/和蓝牙寻找/广播此服务。
安卓上可以吗?
我知道有 jmDNS,但据我了解,它只能通过 WiFi/网络工作, 不是蓝牙。
感谢
Seva Alekseyev 的编辑,他提供了赏金:我不追求解决方法(例如无蓝牙的 Zeroconf 或无 Zeroconf 的蓝牙)。我追求的是真实的东西。
On iPhone if I create custom service for example "_test._tcp.local." in Bonjour I can seek/broadcast this service through WiFi or/and Bluetooth.
It is possible on Android ?
I know that there is jmDNS but from what I understand it works only through WiFi/Network,
not Bluetooth.
Thanks
EDIT by Seva Alekseyev, who offered the bounty: I'm not after workarounds (like Zeroconf sans Bluetooth or Bluetooth sans Zeroconf). I'm after the real thing.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不适用于蓝牙,因为 Android 目前不支持蓝牙上的 TCP/IP,并且 Android 的本机 NSD 支持 (网络服务发现)通过 IP 工作。
不过,它确实可以通过 Wi-Fi 运行。此外,Android 支持通过 Wi-Fi Direct 进行服务发现,这为您提供比蓝牙更大的范围和电池效率。有关如何将服务发现集成到启用 Wi-Fi Direct 的应用程序中的指南,请查看 Android 培训课程。
Not on bluetooth, because Android currently doesn't support TCP/IP over bluetooth, and Android's native NSD support (network service discovery) works over IP.
It DOES, however, work over Wi-Fi. Also, Android supports service discovery over Wi-Fi Direct, which gives you greater range and battery efficiency than bluetooth. For a guide on how to integrate service discovery into a wi-fi direct enabled application, check out the Android Training lesson.
您可以使用 BluetoothSocket 和 BluetoothServerSocket 通过蓝牙创建类似于 TCP 的套接字。
这是 android dnssd 的示例:
https://github.com/twitwi/AndroidDnssdDemo
您可能需要修改 jmdns 库,以便它创建如果蓝牙打开,则创建蓝牙套接字,否则创建简单套接字。将套接字通信封装在有条件地创建套接字的不同类中。
You can use BluetoothSocket and BluetoothServerSocket to create TCP like sockets over Bluetooth.
Here is a sample of android dnssd :
https://github.com/twitwi/AndroidDnssdDemo
You may need to modify the jmdns library such that it creates bluetooth sockets if bluetooth is ON, otherwise creates simple sockets. Encapsulate the socket communication in a different class that creates socket conditionally.
目前这是不可能的,有几个原因。与您的问题最相关的一个是 - 正如您可能经历过的 - jmDNS 需要 TCP/IP 链接来发布或浏览服务(它需要绑定到 IP 地址)。正如其他答案&评论指出,您需要一个已建立的 PANU 链接,但 Android 目前不提供该链接。
它不起作用的其他原因是:
您可以考虑使用蓝牙 4 LE - 至少有一个 Apple API 从 iOS 5 开始提供从属配置文件,并在 iOS 6 中扩展到支持主配置文件。
There's a couple of reasons why this is not possible currently. The one most related to your question is that - as you probably experienced - jmDNS requires a TCP/IP link to publish or browse services (it requires an IP address to bind to). As the other answers & comments state, you'd need an established PANU link for that, which Android currently doesn't provide.
The other reasons it will not work are:
You could instead look into using Bluetooth 4 LE - at least there's an Apple API for that starting in iOS 5 providing a Slave profile, and extended to support a Master profile in iOS 6.