編輯:關於android開發
---------------------------!! 轉載請注明出處 !!-----------------------
一個項目,利用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包了,實測問題解決。 這個問題調查過程中 發現在國內的站點上很少能搜到真正有幫助的信息,所以發這個帖子,也許你的問題與我不一樣,但至少提供一個思路吧。 ---------------------------轉載請注明出處-----------------------微信支付,信支付記錄片,防止以後很久沒做在次犯二 把官方例子集成進項目後 scheme就是你創建應用的AppID 然後還有在配置文件的appid也要換掉
Android 手機衛士5--手機防盜,android5--1,界面介紹 跳轉到導航界面的第1個,描述功能 跳轉到導航界面的第2個,必須,綁定sim卡,才可以跳轉到第三個
Linux內核系列—操作系統開發之HelloWorld,linuxhelloworld org 07c00h ;偽指令,告訴編譯器程序會被加載到7c00處
android加固系列—5.加固前先學會破解,hook(鉤子)jni層系統api,androidjni【版權所有,轉載請注明出處。出處:http://www.cnblog