После обновления 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