Изменить диапазон WiFi-Direct IP? Принудительно использовать IPv6 в Android WiFi-Direct?

У меня есть два телефона Android KitKat, оба используют группы WiFi-Direct в качестве владельцев групп, назовем их GO1 и GO2

Мне удалось подключить GO1 как унаследованного клиента к GO2, не нарушая ни одну из (ранее установленных) групп WiFi-direct.

Проблема в том, что, как вы, возможно, знаете, IP-адрес GO жестко задан в источнике Android и установлен в 192.168.49.1.

Поэтому оба моих устройства, GO1 и GO2, имеют одинаковый IP-адрес (**)... каждое в своей локальной сети.

Мое приложение одновременно и клиент, и сервер. Но обе сети используют один и тот же диапазон IP (192.168.49.XXX), который, видимо, я не могу изменить.

В результате я не могу создать TCP-соединение между ними, если они оба используют группу WiFi-Direct, так как любое устройство будет подключаться к себе при попытке подключения к 192.168.49.1.

Итак, вопросы:

  • Есть ли способ изменить диапазон IP, используемый в Wifi-Direct?
  • Есть ли способ использовать IPv6 вместо IPv4 в Wifi-Direct?
  • Можно ли это сделать без рута телефона?
  • Любое другое предложение?

**: На самом деле, поскольку GO1 подключается как устаревший клиент к GO2, то GO1 известен как 192.168.49.227 (например) для GO2, а GO2 известен как 192.168.49.1 для GO1. Но поскольку GO1 ТАКЖЕ GO, он также известен как 192.168.49.1 своим клиентам (и себе).

3 ответа

Решение

Невозможно изменить диапазон IP-адресов, поскольку, как вы правильно указали, он жестко закодирован в системной службе Android Wi-Fi Direct. Лично я не знаю, включен ли IPv6 на интерфейсе Wi-Fi P2P, и даже если бы это было так, это, вероятно, был бы жестко закодированный адрес IPv6.

Если GO1 и GO2 должны быть подключены друг к другу, когда оба находятся в режиме GO, то, возможно, обратите внимание на использование Bluetooth или другого транспорта, чтобы позволить им общаться. Если связь между GO1 и GO2 может быть отложена, то кэшируйте любую информацию, подлежащую обмену, и отправьте ее между этими двумя устройствами, когда одно может быть клиентом другого, например, когда GO1 может перестать быть GO и может быть клиентом GO2.

Способ обойти это без рутирования телефона - это посылать ваши пакеты через многоадресный UDP*. Эти пакеты будут отправлены из GO1 в GO2.

Есть некоторые побочные эффекты:

  • Чтобы использовать это для работы в сети, необходимо выполнить инкапсуляцию и маршрутизацию на уровне приложений OSI (неэффективно).

  • Вам также нужно будет маршрутизировать на основе MAC-адресов, поскольку каждое устройство имеет один и тот же адрес 192.168.49.1.

  • "Важно отметить, что многоадресный сокет инкапсулирует одноадресную связь один-ко-многим и в результате этого не может полностью использовать общую доступную пропускную способность WiFi и WiFi Direct" *

Что-то еще стоит отметить:

  • По мере увеличения количества GO вы столкнетесь с проблемой всех узлов, работающих на одном и том же канале Wi-Fi. Это не проблема с несколькими устройствами, но с сотнями устройств это будет огромной проблемой.

* Этот метод упоминался в статье Колина Фунаи, Криштиану Таппарелло и Венди Хайнцельман под названием "Поддержка многопролетных сетей от устройства к устройству через прямую многогрупповую сеть WiFi", которая находится здесь: https://arxiv.org/pdf/1601.00028.pdf

На самом деле это можно обойти, используя локальный адрес ссылки IPv6 (где группа — это группа WifiP2pGroup, полученная из широковещательной рассылки или по запросу):

      val interfaceName = group?.`interface`
val linkInterface = NetworkInterface.getNetworkInterfaces().toList()
            .firstOrNull {
                it.name == interfaceName
            }

val linkLocalAddr = linkInterface?.inetAddresses?.toList()
            ?.firstOrNull { it.isLinkLocalAddress && it is Inet6Address } as? Inet6Address

Адрес IPv6 «привязывается» к определенному сетевому интерфейсу. Используя локальный адрес канала IPv6, вы можете отправлять трафик в/из GO1 и GO2. Подключающееся устройство не сможет найти локальный адрес ссылки после автоматического подключения, поэтому вам придется передать его другим способом (например, с помощью txt- записей обнаружения локальной службы ).

Другие вопросы по тегам