Поддержка многоадресной рассылки на Android в режиме "Точка доступа/модем"
У меня есть прототип Android-приложения, которое слушает многоадресные пакеты для обнаружения клиентов, с которыми можно связаться. Настройка сокета аналогична таковой:
InetAddress group = InetAddress.getByName("228.1.2.3");
MulticastSocket s = new MulticastSocket(4000);
s.joinGroup(group);
Это работает очень хорошо, когда все устройства подключены через WiFi. Я хотел бы поддержать это с телефоном, действующим как переносная точка доступа. Однако, хотя все мои устройства, похоже, правильно подключаются к точке доступа, я больше не получаю многоадресные данные. Мне интересно, существуют ли ограничения, запрещающие этот тип связи в режиме "горячей точки", или если есть какая-либо дополнительная сетевая конфигурация, необходимая для включения этого? Я пробовал это на нескольких разных устройствах, работающих с Gingerbread и Froyo, без везения.
Ответы
Ответ 1
Как показано в этой статье:
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;
}
Попробуйте и дайте понять, работает ли он в режиме "Горячие точки"...
Ответ 2
У вас есть разрешение манифеста и вы создаете блокировку?
Для получения разрешения см. "CHANGE_WIFI_MULTICAST_STATE" в http://developer.android.com/reference/android/Manifest.permission.html
Кроме того, чтобы создать блокировку многоадресной рассылки, см.:
http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
Ответ 3
У меня была такая же проблема, и я нашел решение с помощью комбинации @braden, @user707606 и главным образом сообщения Chainfire в этом Ссылка.
Сообщение в ссылке приятно, но на самом деле не предлагает никаких образцов кода, но вот оно. Сначала вам нужно приобрести Multicast Lock, это необходимо для некоторых 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" />
Затем вторым шагом будет получение блокировки многоадресной передачи в вашем методе.
/* 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;
}
Позже создайте сокет Multicast с доступным портом и установите Wifi NetworkInterface.
MulticastSocket multicastSocket = new MulticastSocket();
/* Set NetworkInterface of MultiCast Socket */
NetworkInterface wifiNetworkInterface = findWifiNetworkInterface();
if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface);
Тогда остальная часть вашей реализации останется прежней. И как только вы закончите с Multicast Lock, рекомендуется его освободить.