Android 多播工作非常不可靠

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

我有一些网络代码已经在 Android 中运行了几年。现在,对于运行 Android 6.0 的设备,它只能部分工作。我还收到了用户的报告,这些问题可能是由在 Samsung Tab S2s 上运行时同样的问题引起的,但我不知道他们运行的是什么操作系统版本。基本上,这些设备似乎可以很好地传输数据,但它们实际上并没有接收到任何数据。同一网络上的其他设备可以毫无问题地发送和接收。不过,在设置工作正常的地方有一些注意事项(见下文)。

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

设备:
A - 运行 Android 5.1.1 的 Note 5
B - 运行 Android 6.0 的 nVidia Shield 平板电脑

路由器:
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。

我的相关 list 权限:

<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
}

最佳答案

多播在 5.0 及更高版本中默认被禁用...不知道为什么谷歌会做这样的事情。但我能找到的唯一解决方案是刷新一个启用多播的自定义内核

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

关于Android 多播工作非常不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35832133/

相关文章:

分发心跳的算法?

android - 使用 LiveData 从网络刷新数据

java - 搜索 JTS STR 树

android - 确定 GPS 纬度的东或西

Java 从 DataStream 切换到 ObjectStream

android - 更新后允许按钮不起作用

Android 2.2 使用 ACTION_UP 而 2.1 不使用(在嵌套 ScrollView 中)。我使用的是旧错误吗?

networking - 如何在用户定义的网络中永久设置docker中的dns名称服务器?

android - checkSelfPermission 返回 PERMISSION_GRANTED 以撤销 targetSdkVersion <= 22 的权限

android - Cordova:无法使用 cordova-plugin-calendar 构建项目