Android在热点/栓系模式下的多播支持
我有一个Android原型应用程序,它正在监听多播数据包以“发现”与之通信的客户端。插座设置与此类似:Android在热点/栓系模式下的多播支持,android,wifi,android-wifi,multicast,Android,Wifi,Android Wifi,Multicast,我有一个Android原型应用程序,它正在监听多播数据包以“发现”与之通信的客户端。插座设置与此类似: InetAddress group = InetAddress.getByName("228.1.2.3"); MulticastSocket s = new MulticastSocket(4000); s.joinGroup(group); 当所有设备都通过WiFi连接时,此功能非常有效。我想通过手机作为便携式热点来支持这一点。然而,虽然我的所有设备似乎都正确连接到热点,但我不再接收多播
InetAddress group = InetAddress.getByName("228.1.2.3");
MulticastSocket s = new MulticastSocket(4000);
s.joinGroup(group);
当所有设备都通过WiFi连接时,此功能非常有效。我想通过手机作为便携式热点来支持这一点。然而,虽然我的所有设备似乎都正确连接到热点,但我不再接收多播数据。我想知道是否有限制不允许在热点模式下进行这种类型的通信,或者是否需要任何额外的网络配置来启用此功能?我在运行Gingerbread和Froyo的两个不同设备上尝试了这一点,但没有成功。您是否拥有清单权限,是否正在创建锁 有关权限,请参阅中的“更改无线网络\u多播\u状态” 另外,要创建多播锁。。。请参阅: 如本文所示: 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;
}
publicstaticnetworkinterface getWlanEth(){
枚举=空;
试一试{
枚举=NetworkInterface.getNetworkInterfaces();
}捕获(SocketException e){
e、 printStackTrace();
}
网络接口wlan0=null;
StringBuilder sb=新的StringBuilder();
while(枚举.hasMoreElements()){
wlan0=枚举.nextElement();
sb.append(wlan0.getName()+);
if(wlan0.getName().equals(“wlan0”)){
//可能有更好的方法找到以太网接口
Log.i(标记“找到wlan0”);
返回wlan0;
}
}
返回null;
}
尝试一下,让我知道它是否在热点模式下工作…我也遇到了同样的问题,并通过结合@braden、@user707606和这篇文章中主要是通过Chainfire发布的文章,提出了一个解决方案 链接中的帖子很好,但没有提供任何代码示例,但在这里。首先,你需要获得多播锁,这是一些Android设备所需要的,大多数设备没有尝试过,但在其他一些帖子中提到过,所以我在代码中包含了它 权限是必需的,因此首先,将权限添加到清单文件中
<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" />
然后,找到您的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;
}
然后,其余的实现保持不变。完成多播锁后,建议您释放它。我很想知道您是否解决了这个问题。我的理解是,您需要一个多播锁才能让多播工作。唯一的办法就是通过wifimanager。不幸的是,将设备设置为热点时,多播锁似乎是在eth0接口上创建的,而实际的通信是在wl0.1上进行的。这是我所能解决的问题,不确定我是否在正确的轨道上。这里的情况大致相同。这两台设备都在广播,但它们无法相互“看到”。我很想告诉你们,我已经完成了解决方案。:)通过热点进行多播。想在这里发布吗,甘地先生?
/**
* 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;
}
MulticastSocket multicastSocket = new MulticastSocket();
/* Set NetworkInterface of MultiCast Socket */
NetworkInterface wifiNetworkInterface = findWifiNetworkInterface();
if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface);