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工具抓包发现,
而出问题的手机(华为手机和我们自己的设备),根本没发IGMP包。
也就是表示,它们在加入组播组时,尽管在app总调用joinGroup成功,但实际上并未向路由器发出IGMP请求,即根本没加入组播组,自然就监听不到消息。
那么为什么这两台机器在小米,华硕,cisco路由上能正常监听呢? 猜测这三台路由恐怕并没有严格按照的UPnP协议来实现,猜测它可能给连在路由上的任何设备发送组播(类似广播一样处理),设备收到组播后,根据本地的配置情况决定是否发给app。由于没有路由器实现的代码,只是根据现象猜测。
至此,我们要解决的问题就是 让它们发出IGMP包。
对华为手机,没办法了,不是我做的。。。
我们自己的设备是有全部源码的,调查发现linux kernel的config中 CONFIG_IP_MULTICAST 这项没定义。
Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到的更多相关文章
- Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...
- Android EditText截获与监听输入事件
Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...
- Android Back Home键监听
Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...
- Android addTextChangedListener(文本监听)参数解释及实现EditText字数监听
由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher.它有三个成员方法,第一个after很简单,这个方法就是在EditT ...
- android事件处理之基于监听
Android提供了了两种事件处理方式:基于回调和基于监听. 基于监听: 监听涉及事件源,事件,事件监听器.用注册监听器的方法将某个监听器注册到事件源上,就可以对发生在事件源上的时间进行监听. 最简单 ...
- Android 对电话进行监听和挂断
1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...
- android应用锁之监听应用前后台切换方式
今天在做技术总结,顺便就把知识共享,个人崇尚分享. 通过以下方式来监听是不是发生了应用的前后台切换: 1. android api 10 – 15 通过ActivityManager register ...
- Android——按钮的事件监听
关于Button按钮的四种事件监听方法总结 首先我们在activity_main.xml里面先定义一个Button空间 <RelativeLayout xmlns:android="h ...
- Android EditText的输入监听,输入字符的动态获取
http://itindex.net/detail/38974-android-edittext-%E7%9B%91%E5%90%AC 有时候我们可能会用到时时的监听EditText输入字符的时时监听 ...
随机推荐
- ASP.NET 導入Excel
常常碰到這種需求,為了避免自己每次寫Code都要東翻西找Sample,乾脆丟上來當備份 此外,也為了方便網路上的大大們Copy Paste方便,小弟已經順便標示要複製程式碼的起始結束位置 在歡樂的貼程 ...
- 巧架个人BT服务器
BT的流行比之当年的江湖,传奇等的流行有过之而无不及.现在我们常说的话题是:“今天你BT了吗?”哇K!兄弟们你们怎么吐了?!假如你还不知道BT是什么,那似乎证明你已经到了归隐Internet的时候了, ...
- 2015年NEUACM一月月赛题解
A Money , money 时间限制: 1 Sec 内存限制: 128 MB 提交: 15 解决: 14 题目描述 Small K seen recently stock market rea ...
- JAVASCRIPT中RegExp.$1是什么意思
RegExp 是javascript中的一个内置对象.为正则表达式. RegExp.$1是RegExp的一个属性,指的是与正则表达式匹配的第一个 子匹配(以括号为标志)字符串,以此类推,RegExp. ...
- PV,UV,IP
参加了DTCC归来之后,各大电商技术大牛都会自豪的分享一下自己公司网站的PV,流量等等.当时也是一知半解,回来之后赶紧查了查,也算是扫扫盲. 以下摘自网络中,自己稍稍做了整理,对于PV,流量和带宽的理 ...
- 2013华为校园招聘java实现(大家水个回复啊)
package 乒乒乓乓; import java.util.Scanner; /* * * author:hansongjiang 分别求整数数组里面的奇数与偶数之和 问题描述:从标准输入里面接收一 ...
- Hadoop InputFormat浅析
本文转载:http://hi.baidu.com/_kouu/item/dc8d727b530f40346dc37cd1 在执行一个Job的时候,Hadoop会将输入数据划分成N个Split,然后启动 ...
- POJ3107--Godfather(树的重心)
vector建图被卡了..改为链式前向星500ms过的..差了四倍多?... 表示不太会用链表建图啊..自己试着写的,没看模板..嗯..果然错了..落了一句话orz 树的重心就是找到一个树中一个点,其 ...
- 在Windows8工作站上安装可靠多播协议
为什么要安装可靠多播协议? 答:随着因特网的发展,出现了视频点播.电视会议.远程学习.计算机协同工作等新业务.传统的点到点通信方式,不仅浪费大量的网络带宽,而且效率很低.一种有效利用现有带宽的技术 ...
- [二]JFreeChart实践一
生成一张简单的图片 java代码: package com.lxl.chart; import javax.servlet.http.HttpSession; import org.jfree.cha ...