我有一个原型Android应用程序,它正在侦听多播数据包,以‘发现’客户端进行通信。套接字的设置类似于:
InetAddress group = InetAddress.getByName("228.1.2.3");
MulticastSocket s = new MulticastSocket(4000);
s.joinGroup(group);当所有设备都通过WiFi连接时,这种方法工作得很好。我想支持这一点与手机作为一个便携式热点。但是,虽然我的所有设备似乎都正确连接到热点,但我不再接收多播数据。我想知道在热点模式下是否有限制不允许这种类型的通信,或者是否需要任何额外的网络配置来启用它?我已经在运行姜饼和Froyo的几个不同的设备上尝试过了,但没有成功。
发布于 2014-12-30 11:51:06
如本文所示:https://plus.google.com/+Chainfire/posts/9NMemrKYnCd
MulticastSocket::setNetworkInterface()
将会是答案
您可以通过以下方式查找wlan0 eth:
public static NetworkInterface getWlanEth() {
Enumeration<NetworkInterface> enumeration = null;
try {
enumeration = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
}
NetworkInterface wlan0 = null;
StringBuilder sb = new StringBuilder();
while (enumeration.hasMoreElements()) {
wlan0 = enumeration.nextElement();
sb.append(wlan0.getName() + " ");
if (wlan0.getName().equals("wlan0")) {
//there is probably a better way to find ethernet interface
Log.i(TAG, "wlan0 found");
return wlan0;
}
}
return null;
}试一试,让我知道它是否在热点模式下工作。
发布于 2012-03-23 22:32:32
您是否拥有manifest权限,是否正在创建锁?
有关权限,请参阅:http://developer.android.com/reference/android/Manifest.permission.html中的'CHANGE_WIFI_MULTICAST_STATE‘
另外,要创建多播锁定...请参阅:http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
发布于 2017-02-24 06:43:09
我也遇到过同样的问题,我想出了一个解决方案,将@braden,@user707606和Chainfire在这个Link中的主要帖子结合在一起。
链接中的帖子很好,但没有提供任何代码示例,但这里是。首先你需要获取多播锁,这是一些Android设备所需要的,大多数设备都没有尝试,但在其他一些帖子中提到了它,所以我在我的代码中包含了它。
权限是必需的,因此首先,将权限添加到Manifest文件中。
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />然后第二步是在你的方法中获取多播锁。
/* Acquire MultiCast Lock */
WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();然后找到您的Wifi网络接口
/**
* Finds Network Interface of Wifi Ethernet.
*
* @return
*/
public static NetworkInterface findWifiNetworkInterface() {
Enumeration<NetworkInterface> enumeration = null;
try {
enumeration = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
}
NetworkInterface wlan0 = null;
while (enumeration.hasMoreElements()) {
wlan0 = enumeration.nextElement();
if (wlan0.getName().equals("wlan0")) {
return wlan0;
}
}
return null;
}稍后,使用可用的端口创建多播套接字,并设置您的Wifi NetworkInterface。
MulticastSocket multicastSocket = new MulticastSocket();
/* Set NetworkInterface of MultiCast Socket */
NetworkInterface wifiNetworkInterface = findWifiNetworkInterface();
if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface);然后,其余的实现保持不变。一旦你完成了多播锁,建议你释放它。
https://stackoverflow.com/questions/6550618
复制相似问题