В Android для входа в сеть используется странная IP-маршрутизация? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь, чтобы устройство IoT (ESP32) использовало режим Wi-Fi AP, чтобы я мог подключить к нему свой мобильный телефон и посетить веб-страницу, размещенную на устройстве, чтобы увидеть некоторые данные.

Проведя некоторые DNS-махинации, я получаю всплывающее окно «Войти в сеть».

Когда я нажимаю на всплывающее окно «Войти», страница с моего IoT-устройства отображается правильно.

Если я использую любой обычный браузер для просмотра IP-адреса устройства, мой телефон отказывается подключаться.

Если я отключу мобильные данные, я могу подключиться к своему устройству с помощью браузеров.

Похоже, что Android отказывается направлять трафик в сеть Wi-Fi, которая, по-видимому, не обеспечивает подключение к Интернету.

Я посмотрел таблицы маршрутизации (ip route show table 0), и маршрут по умолчанию, похоже, относится к моему устройству, но все браузеры, кажется, игнорируют его.

Я предполагаю, что это некоторая защита от спуфинга от мошеннических точек доступа Wi-Fi - но как веб-просмотр во всплывающем окне 'входа в систему' обходит это?

Должен ли я взломать какую-нибудь пользовательскую оболочку для веб-просмотра, чтобы иметь возможность подключаться к устройству IoT (через локальную сеть IP через Wi-Fi) и к Интернету (3G / 4G) одновременно?

Я пытался сказать устройству IoT, чтобы он выдавал 0.0.0.0 в качестве gw по умолчанию, но это только привело к отключению всплывающего окна входа в систему.

1 Ответ

0 голосов
/ 02 мая 2018

Изучите использование ConnetivityManager.requestNetwork(). Это позволяет вам привязать процесс к определенному сетевому интерфейсу. Что-то вроде

   NetworkRequest.Builder request = new NetworkRequest.Builder();
   request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
   request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

   connectivityManager.requestNetwork(request.build(), ...);

Посмотрите на документы, но вторым аргументом является обратный вызов, когда сеть доступна. Что-то вроде

        @Override
        public void onAvailable(Network network) {
            if (connectivityManager.bindProcessToNetwork(network)) {
                // success
            } else {
                // fail
            }
        }

Отменить привязку с ConnectivityManager.unregisterNetworkCallback() и .bindProcessToNetwork(null). Например.,

protected void releaseTransport() {
    if (requestTransportCallback != null) {
        connectivityManager.unregisterNetworkCallback(requestTransportCallback);
        requestTransportCallback = null;
        connectivityManager.bindProcessToNetwork(null);
    }
}

Удачи.

...