Android多播工作非常不可靠

时间:2016-03-06 20:28:25

标签: android networking android-6.0-marshmallow multicast android-permissions

我已经获得了一些在Android上工作了几年的网络代码。现在,使用运行Android 6.0的设备,它只是部分工作。在使用Samsung Tab S2s时,我也收到了用户报告可能由同一问题引起的问题,但我不知道他们正在运行的操作系统版本。基本上,设备似乎传输得很好,但实际上没有数据被它们接收。同一网络上的其他设备可以毫无问题地发送和接收。但是有一些警告(见下文),但设置工作正常。

目前为止,我能猜到的是,我的Android 6.0设备未正确加入多播组。但这并不能解释为什么一台路由器似乎工作正常。任何想法如何解决它,以便所有有效的多播地址正常工作?如果没有修复,那么对于非路由消息使用保留的224.0.0.251地址有多糟糕?

设备:
A - 注5运行Android 5.1.1
B - 运行Android 6.0的nVidia Shield Tablet

路由器:
X - WIFI Linksys EA4500路由器
Y - WIFI Windows 10 PC托管网络

调查结果:
1 - UDP / TCP单播似乎在设备和路由器上都能正常工作 2 - UDP多播在路由器X上与224.0.0.251一起工作(没有尝试路由器Y)
3 - UDP组播在路由器Y上工作,地址为239.2.3.1
4 - 地址为239.2.3.1的UDP组播,或者我尝试的任何其他有效地址,部分适用于路由器X.设备A可以是tx / rx,设备B只能是tx。

我的相关清单权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

以下是适用于我使用过的其他所有设备的简化代码:

try
{
    mRxSocket = new MulticastSocket( APort );

    mRxSocket.joinGroup( AMulticastAddress );

    mRxSocket.setSoTimeout( 0 );

    final WifiManager wm = (WifiManager)getSystemService( Context.WIFI_SERVICE );

    mMyMulticastLock = wm.createMulticastLock( "WAKELOCK_STRING" );
    mMyMulticastLock.acquire();

    int maxPacketSize = 1024*64;
    final byte packetBuffer[] = new byte[maxPacketSize];
    final DatagramPacket packet = new DatagramPacket( packetBuffer, maxPacketSize );

    mRxSocket.receive( packet );

    // it never gets past the receive call.  No data is ever received by this thread...
}
catch( final IOException e )
{
    mRxSocket = null;

    //connection failed

    //never gets here unless the network is disconnected
}

1 个答案:

答案 0 :(得分:-1)

默认情况下,5.0及以上禁用多播...不知道为什么谷歌会做这样的事情。但我能找到的唯一解决方案是使用启用多播的自定义内核闪存

您也可以尝试将多播转换为单播