Проблема: Android не подключается к локальной точке доступа

После обновления Android до версии 5.1.1 обнаружилась очень серьёзная проблема: при попытке подключения к локальной точке доступа WiFi (на которой нет интернета) — соединение автоматически закрывалось с сообщением «Отсутствует подключение к сети Интернет», далее в разделе доступные сети против SSID этой точки доступа появляется надпись: «Сохранено, защищено» либо «Подключение запрещено». Дальнейшие  манипуляции и попытки подключения к точке доступа не приводят к положительному эффекту.

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

Что-же случилось? Оказывается — это своего рода ноу-хау Google, которое было внедрено без возможности отключения начиная с версии 5.1.1. Это ноу-хау  — встроенный в Android ConnectivityManager, который служит для определения подключения к Интернету и в случае его отсутствия инициирует отключение от сети WiFi. Сделано это для экономии ресурсов телефона (батареи) пользователей, которые видимо не знают, что wifi можно физически отключить из меню «Настройки», если в нём нет необходимости. Частые обращения пользователей о быстром разряде телефонов и планшетов при посещении общественных мест сподвигли Гугл пойти на этот шаг.

Как это работает:

При подключении к сети WiFi мобильное Android -устройство ломится по URL: http://connectivitycheck.android.com/generate_204

GET — запрос:

GET /generate_204 HTTP/1.1

User-Agent:

Host: connectivitycheck.android.com

Accept: */*

и если не получает ответ вида:

HTTP/1.1 204 No Content

Content-Length: 0

,то происходит дисконнект.

Однако вместо  HTTP/1.1 204 No Content с определённого сайта достаточно ответа любого http-сервера. Таким образом, если у нас есть в локальной сети http-сервер на 80 порту (это может быть wifi-роутер), то в настройках Android «WiFi->Добавить сеть->Дополнительно» — просто необходимо указать вручную в качестве прокси-сервера наш wifi-роутер либо любой имеющийся http-сервер (proxy порт = 80). После таких настроек Android начинает работать в локальной сети без интернета!

Самодельные девайсы, имеющие wifi-модули и работающие в режиме WiFi AP, например на ESP8266, придётся модернизировать и дописать в их firmware функцию, которая будет отвечать на GET-запрос:

GET /generate_204 HTTP/1.1

ответом HTTP/1.1 204 No Content или HTTP/1.1 200 OK.

Если WiFi модуль работает как http-сервер, то просто прописываем в Android proxy с IP-адресом нашего WiFi-модуля и портом 80. 

Автор: BlackMore Black