Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到

 

---------------------------!! 转载请注明出处 !!-----------------------
 

一个项目,利用wifi组播在局域网内发现设备。却发现在有的路由器上能正常工作,有的路由器上完全监听不到组播消息。检查路由配置没有任何问题。

组播实现很简单:拿住WifiLock,拿住MulticastLock,创建MulticastSocket端口1900,ttl设为3或者5,然后joinGroup加入239.255.255.250组,然后设置socket的timeout,调用receive开始监听。还要记得manifest中加上几个相关的permission。

网上可以搜到很多示例,基本都是这样的处理流程,没什么复杂的。

 

一开始测试时工作正常,由于用的是UPnP通用的组播ip (239.255.255.250:1900),所以可以收到局域网里很多组播消息,包括MediaRenderer,InternetGateway等等,我们只要从中筛出自己的消息就行了。

但小批量投放后,发现了问题。我们的产品在某些路由器上无法监听到组播消息。监听端口上一片静默,不仅我们自己的消息收不到,网络中其他设备发的组播消息也收不到。

带回3台有问题的路由,分别是 1) linksys,2) 华为,3) ARRIS

而国内的三台路由上工作却是正常的,这三台分别是  4)小米,5) 华硕, 6)Cisco

找了另外三台android手机安装同一个app做测试,三台手机:htc (android4.4.2),Sony (andorid4.1.2),华为(android5.0.2)

问题来了,htc和sony在6台路由上均能监听到组播,华为荣耀7跟我们的设备一样,完全监听不到。

*以上路由和手机就不标具体型号了^_^

----------------------------------------------------问题描述完毕,开始解决------------------------------------

WinPCap工具抓包发现,

两台测试机htc和sony,在加入组播组(joinGroup)时,会发送
IGMP V2 Membership Report / Join group 239.255.255.250
离开组播组(leaveGroup)
IGMP V2 Leave Group 239.255.255.250
 
有些支持IGMP V3的路由上抓包如下:
IGMP V3 Membership Report / Join group 239.255.255.250 for any sources
IGMP V3 Membership Report / Leave group 239.255.255.250

而出问题的手机(华为手机和我们自己的设备),根本没发IGMP包。

也就是表示,它们在加入组播组时,尽管在app总调用joinGroup成功,但实际上并未向路由器发出IGMP请求,即根本没加入组播组,自然就监听不到消息。

那么为什么这两台机器在小米,华硕,cisco路由上能正常监听呢? 猜测这三台路由恐怕并没有严格按照的UPnP协议来实现,猜测它可能给连在路由上的任何设备发送组播(类似广播一样处理),设备收到组播后,根据本地的配置情况决定是否发给app。由于没有路由器实现的代码,只是根据现象猜测。

至此,我们要解决的问题就是 让它们发出IGMP包。

对华为手机,没办法了,不是我做的。。。

我们自己的设备是有全部源码的,调查发现linux kernel的config中 CONFIG_IP_MULTICAST 这项没定义。

添加CONFIG_IP_MULTICAST=y, 重编kernel img后,再次抓包能抓到设备发出的IGMP包了,实测问题解决。
 
这个问题调查过程中 发现在国内的站点上很少能搜到真正有帮助的信息,所以发这个帖子,也许你的问题与我不一样,但至少提供一个思路吧。
 
---------------------------转载请注明出处-----------------------
 
posted @ 2016-05-19 13:53  馒头脸  阅读(4171)  评论(2编辑  收藏  举报