题
有没有人在 Android 2.2 上使用 Multicast,特别是用于 Bonjour 服务检测的 JmDNS。Android 1.5->2.0 时间范围内有许多问题和答案,包括 stackOverflow 上的问题和答案,这些问题和答案表明不同程度的成功,并且错误跟踪器中的一个错误表明它已修复并已关闭,对于 2.2 (http://code.google.com/p/android/issues/detail?id=2323)。我已经尝试过“TuneControl”源代码,但它在 ~1.5 上工作并且尚未更新,并且在 2.2 上对我不起作用。
所以,问题...1) 有 任何人 见过 2.2 上的多播工作吗,特别是 JmDNS,特别是 Bonjour 服务检测?
2)代码中需要什么才能使其工作?
我正在使用适当的权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
我获取多播锁:
WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
if(wifi != null)
{
MulticastLock mcLock = wifi.createMulticastLock("mylock");
mcLock.acquire();
...
然后尝试启动jmDNS来寻找服务器:
mdns = JmDNS.create(addr, HOSTNAME);
jmdns.addServiceListener(TOUCH_ABLE_TYPE, listener);
jmdns.addServiceListener(DACP_TYPE, listener);
...
侦听器永远看不到任何服务。我已经使用 Wireshark 验证了请求数据包已发送,并且服务器已响应,但 jmDNS 库中的套接字侦听器代码从未看到响应数据包。
所以...我错过了什么吗?这仍然是一个错误吗?有没有人得到这样的东西甚至远程工作???
解决方案
为了(粗鲁地)回答我自己的问题,提供了更多信息 http://code.google.com/p/android/issues/detail?id=2917#c48 由另一个人。正如他们所说,对于后代,这是 brian.ro...@gmail.com 的答案...
“我花了很多时间在我的EVO和HTC Hero(CDMA)上与JMDNS调试MDNS问题。我发现的是,EVO上的Broadcom无线驱动程序中似乎有一个过滤器(并且由于我从HTC Desire用户获得了类似的reptrt - 带有相同的芯片组,也可能是该手机)。默认情况下,该过滤器会阻止任何非unicast或网络广播流量,包括多播。显然,理论是节省电池。
该问题似乎是EVO上的WPA_Supplicant在您获得多频道时不支持删除这些过滤器。(在获得锁后立即检查日志输出,您会明白我的意思)。不幸的是,发生的事情是硬件供应商已经分散了多播支持。:("
所以...看来这是一个设备问题,而不是编码问题。噢。:( 如果我有机会在另一台设备上进行测试......
其他提示
我已经做了一些研究到这一点,我认为这是一个问题与在一般情况下,和固定在或周围的安卓2.3.7.
这是一个有点太传闻,但这里是我的测试:
- 宏达的愿望,2.2、股票:失败
- 宏达的愿望,2.3.7,独立的:成功
- 摩托罗拉的里程碑,2.1-更新1:失败
- 宏达的愿望S2.3.3:失败
- 电脑A501、3.2.1:成功
- 三星什么的,2.3.3:失败
- 宏达传说,2.2我认为:失败
当我说"失败",事实上他们都能够播送消息的'成功'的设备,但从未收到任何东西回来除非他们自己的信息-因为jldupont描述的。
注意播IM应用程序 Kouchat 仅适用于2.3.7起,尽管它可以作为汇编可回溯2.1,其中提供了进一步证实了这一理论。
我认为另一个原因是你的AP不支持。
其他:计算机发送/收到向/从的Android 强>
计算机必须只使用WIFI,最好关闭所有其他网络