Подтвердить что ты не робот

Поддержка многоадресной рассылки на Android в режиме "Точка доступа/модем"

У меня есть прототип Android-приложения, которое слушает многоадресные пакеты для обнаружения клиентов, с которыми можно связаться. Настройка сокета аналогична таковой:

InetAddress group = InetAddress.getByName("228.1.2.3");
MulticastSocket s = new MulticastSocket(4000);
s.joinGroup(group);

Это работает очень хорошо, когда все устройства подключены через WiFi. Я хотел бы поддержать это с телефоном, действующим как переносная точка доступа. Однако, хотя все мои устройства, похоже, правильно подключаются к точке доступа, я больше не получаю многоадресные данные. Мне интересно, существуют ли ограничения, запрещающие этот тип связи в режиме "горячей точки", или если есть какая-либо дополнительная сетевая конфигурация, необходимая для включения этого? Я пробовал это на нескольких разных устройствах, работающих с Gingerbread и Froyo, без везения.

4b9b3361

Ответ 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;
}

Попробуйте и дайте понять, работает ли он в режиме "Горячие точки"...

Ответ 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, рекомендуется его освободить.