Как подключиться к определенной сети Wi-Fi в Android программно?
Я хочу создать приложение, которое показывает список доступных сетей Wi-Fi и подключается к любой сети, выбранной пользователем.
я реализовал часть, показывающую результаты сканирования. Теперь я хочу подключиться к определенной сети, выбранной пользователем из списка результатов сканирования.
Как мне это сделать?
10 ответов:
затем, для WEP сети вам нужно сделать это:
для сети WPA вам нужно добавить парольную фразу следующим образом:
для открытой сети вам нужно сделать это:
затем вам нужно добавить его в Настройки Android wifi manager:
и, наконец, вам может потребоваться включить его, поэтому Android подключается к это:
UPD: в случае WEP, если ваш пароль находится в hex, вам не нужно окружать его кавычками.
на более ранний ответ работает, но решение на самом деле может быть проще. Цикл по списку настроенных сетей не требуется, так как вы получаете идентификатор сети при добавлении сети через WifiManager.
Итак полное, упрощенное решение будет выглядеть примерно так:
перед подключением Wi-Fi сети вам нужно проверить тип безопасности Wi-Fi сети ScanResult класс имеет возможности. Это поле дает вам тип сети
здесь три типа сетей WIFI.
сначала создайте экземпляр объекта WifiConfiguration и заполните SSID сети (обратите внимание, что он должен быть заключен в двойные кавычки), установить начальное состояние отключено и указать приоритет сети (номера вокруг 40, похоже, работают хорошо).
теперь более сложная часть: нам нужно заполнить несколько членов WifiConfiguration, чтобы указать режим безопасности сети. Для открытых сетей.
для сетей, использующих WEP; обратите внимание, что ключ WEP также заключен в двойные кавычки.
для сетей используя WPA и WPA2, мы можем установите одинаковые значения для любого из них.
наконец, мы можем добавить сеть в известный список WifiManager
решение, которое сработало для меня, — это комбинация вышеуказанных участников в этой теме.
и ScanResult здесь процесс.
вам нужно будет подкласс этого действия и реализовать его методы:
Если ваше устройство знает конфигурации Wifi (уже сохраненные), мы можем обойти ракетостроение. Просто пройдите через конфигурации и проверьте, соответствует ли SSID. Если да, то подключитесь и возвращение.
Я сломал голову, чтобы понять, почему ваши ответы на WPA / WPA2 не работают. после часа попыток, я нашел то, что вам не хватает:
требуется для информационной безопасности.
попробовать этот метод. Это очень просто:
Я также пытался подключиться к сети. Ни одно из предложенных выше решений не работает для hugerock t70. WiFiManager, с помощью функции.disconnect (); не отключается от текущей сети. И поэтому не удается повторно подключиться к указанной сети. Я изменил приведенный выше код. Для меня код bolow работает отлично:
Источник
SSID для сети WiFi на Android
Идентификатор Wi-Fi необходим для подключения системы Android к беспроводной сети. Для более четкого понимания структуры взаимодействия гаджета, на котором установлен Android, с Wi-Fi-сетью, рассмотрим основные понятия и особенности.
SSID – если дословно с английского это идентификатор сервиса. Если по-русски , это сетевое имя, которое создаёт пользователь, когда регистрирует WiFi точку/сеть на своем роутере . Бывают видимые сети и скрытые, но у каждой есть свое имя, с помощью которого другие пользователи (их устройства) могут найти сеть и подключиться к ней.
Если, например, взять смартфон с системой Android и открыть настройки Wi-Fi, можно увидеть список доступных подключений. В первую очередь мы видим их имена. Нажимаем на интересующее, вводим пароль, если он предусмотрен, коннектимся. Наше устройство подключается к сети, и начинает передавать и получать данные.
Но SSID можно скрывать! Если имя беспроводной точки скрыто, то и подключиться, соответственно, к такой сети не удастся, потому что ее не будет в списке доступных.
В параметрах роутера есть раздел «Настройка беспроводной связи». В зависимости от модели роутера, название опции может быть иным. В этом пункте можно присвоить любое название WiFi сети, которое будет удобным для пользователя, и также сделать SSID невидимым.
Ищем беспроводную связь на Android
В конфигурации маршрутизатора, как было обозначено выше, можно скрыть название сети. Тогда не удастся найти точку подключения стандартным путем. В системе Android можно зайти в раздел настроек беспроводной сети – там будет отображаться доступный перечень. Для этого ничего дополнительно делать не нужно – достаточно зайти в соответствующий раздел настроек и включить Wi-Fi – идентификация маршрутизаторов осуществляется автоматически.
Далее нужно сделать выбор сети, ориентируясь на необходимое имя, ввести пароль (в случае с незапароленными сетями этот шаг пропускается), нажать на кнопку подключения.
Проблемой становится ситуация, когда известно, что в определенном месте, где находится пользователь, есть скрытая сеть. Рассмотрим, что нужно сделать, чтобы ее найти.
Ищем и подключаемся к скрытой точке
Зачем вообще скрывать точку WiFi? Объяснение этому одно – сеть не видно, а значит, ее не будут взламывать. Даже при выборе длинного пароля есть вероятность, что она будет атакована. А вот спрятанные точки обычно никто не трогает.
Технически ничего не меняется. Прекращается только трансляция роутером имени точки доступа (SSID). Интернет по беспроводной сети продолжает раздаваться в обычном режиме, на типичной для оборудования скорости. При этом устройства видят точку доступа, но не отображают её в списке из-за отсутствия имени.
На самом деле такие меры не останавливают злоумышленников, которые подкованы современными утилитами, способными легко обойти подобные приемы. Найти сеть без имени возможно, достаточно иметь установленную ОС Kali Linux на вашем ПК и набор утилит из него для мониторинга WiFi сетей. Для ОС Windows также существуют аналоги этих утилит.
Как защититься? Если говорить о том, какая системы защиты эффективней – сложный пароль или скрытие сети, то первый вариант куда лучше. Рекомендуется создать такой пароль, в котором будет минимум 12 символов, буквы с разным, возможно чередующимся регистром, цифры. В таком случае взломать систему почти невозможно – для этого нужно иметь мощные утилиты, потратить массу времени, что обычно абсолютно не оправдано.
Найти скрытую сеть можно с помощью дополнительных аппов из Play Store гугла, устанавливаемых на Android гаджет, с которого и предстоит подключаться. Например, можно использовать Wifi Analyzer
После установки программы на телефон интересующие SSID печатаются в виде звездочек(*). Но чтобы подключиться, все равно придется ввести пароль, если он предусмотрен настройками точки.
Какая информация нужна, чтобы найти скрытую точку доступа и подключиться к ней в ОС Android?
Обязательным является наличие SSID, а вот пароль может быть не предусмотрен, если точка открытая.
Все данные настроек нужно проверять – они должны совпадать с данными маршрутизатора. Если есть разница и ошибки, то поиск и подключение будут безрезультатными.
Источник
Вопрос Переподключение к wifi
Member
nikolz
Well-known member
Member
enjoynering
Well-known member
зачем изобретать велосипед. все уже есть в arduino core
enjoynering
Well-known member
WiFi.softAPdisconnect(false) — не выключает передатчик, тупо обрывает связь c клиентами путем установления пароля и юзера в NULL. а вот WiFi.softAPdisconnect(true) вызывает WiFi.enableAP(false) которая красиво вызывает WiFi.mode() и отключает AP на совсем.
WiFi.softAPdisconnect(false) достаточно для безглючной смены паролей, ip и тд. То есть не надо дополнительно выключать передатчик командой WiFi.mode(WIFI_OFF).
Уж если хотите временно выключить wifi то делайте так:
Member
зачем изобретать велосипед. все уже есть в arduino core
enjoynering
Well-known member
вас в гугле забанили? один из первых запросов поиске выдал это
ну и так как происходит постоянная запись этих параметров во flash при их вызове, то лучше вызывать так
enjoynering
Well-known member
ну и еще не надо вызывать WiFi.mode(WIFI_STA) перед WiFi.begin(ssid, password).
WiFi.begin(ssid, password) в своем теле вызывает WiFi.enableSTA(true) которая красиво вызывает WiFi.mode(WIFI_STA).
тоже самое с точкой доступа — не надо вызывать WiFi.WiFi.enableAP(true) перед WiFi.softAP(ssid, password).
в WiFi.softAP(ssid, password) все уже есть.
Member
вас в гугле забанили? один из первых запросов поиске выдал это
ну и так как происходит постоянная запись этих параметров во flash при их вызове, то лучше вызывать так
Активный участник сообщества
Интересно, а почему происходит постоянная запись параметров, когда это дополнительное действие и любой стандартный пример Arduino начинается с установок режимов WiFi?
Т.е. функции по настройке WiFi у ESP8266 не соответствует базовым стандартам Arduino?
Каков смысл этой встроенной функциональности по сохранению настроек, если она нигде не используется и её надо отлючать?
В чем красота когда существуют параметры по умолчанию, которых вы не знаете, т.к. они берутся из ранее сохраненных от какой-то сессии работы с WiFi?
Всё это похоже введено для усложнения, а не красоты.
Причина разнообразия примеров по настройке WiFi строиться из описанного выше и последующих исправлений в SDK Espressif, с попыткой оставить совместимость с более старыми вариантами кода. Т.е. теперь, в текущей версии, требуются дополнительные костыли для привода кода к базовому варианту функционирования в среде Arduino. В следующей версии это может быть заменено и удалено.
Викопедия и Гугл этого не описывает и посылка туда не даст правильных ответов.
Вам как пример:
WiFi.begin() без параметров должно включать WiFi, после чего должны быть доступны функции сканирования сети без организации какой-либо точки доступа или станции.
В ESP8266 вы лишены этой функциональности.
enjoynering
Well-known member
вы скорее всего правы. весь этот зоопарк из вызова одной функциии через другую с дублированием самих себя очень похоже на костыль-совместимости с предудущими версиями arduino esp8266 core. Надо отдать должное, они вняли вашей критике и теперь перед сохранием пароля и ssid проверяют его с сохраненным на флешке и не перезаписывают зря. ну и для самых продвинутых внедрили запрет на запись путем вызова функции WiFi.persistent(false). вот пример WiFi.begin(ssid, password) для запуска клиента:
Активный участник сообщества
enjoynering
Well-known member
теперь понятно, спасибо. для мня очень странно почему при вызове функции WiFi.mode() они не делают проверку конфига на флешке? тут спасение только в вызове WiFi.persistent(false) иначе после каждого изменения будет перезаписываться конфиг и лет через 5 флешке настанет каюк. спасибо хоть проверку на совпадение с текущим знвчением сделали.
Активный участник сообщества
теперь понятно, спасибо. для мня очень странно почему при вызове функции WiFi.mode() они не делают проверку конфига на флешке? тут спасение только в вызове WiFi.persistent(false) иначе после каждого изменения будет перезаписываться конфиг и лет через 5 флешке настанет каюк. спасибо хоть проверку на совпадение с текущим знвчением сделали.
wifi_get_opmode() — это функция, вызывающая другую функцию (назовем _get_opmode) с параметром _get_opmode(1)
wifi_get_opmode_default() — это функция, вызывающая другую функцию с параметром _get_opmode(0)
_get_opmode() в зависимости от параметра:
0) выделяет в heap 1172 байта (размер блока параметров WiFi для SDK2.0), и вызывает считывание в полученный блок памяти (system_param_load()) области сохранения во Flash, считывает из полученного блока один байт, освобождает блок в heap.
1) обращается к структуре wifi_store, считывает и выдает из неё байт номера режима.
Драйвер WiFi, обычно, может может работать в разных режимах. Т.к. у нас два основных типа — AP и STA, то драйвер WiFi делиться на два типа работы. Т.е. фактически при AP+STA загружены и включены два драйвера. Проверить какой драйвер и в каком режиме сейчас активен по данным из flash не выйдет, если установка его произошла без сохранения параметров во flash.
wifi_set_opmode(x) — это тоже функция, с вызывающая другую _set_opmode(x, 1)
wifi_set_opmode_current(x) — это тоже функция, с вызывающая другую _set_opmode(x, 0)
_set_opmode(x, flag) примерно то-же самое — в зависимости от flag вызывает считывание из flash (system_param_load(. ), system_param_save_with_protect(. ) ) структуры wifi_store[1172] с запросом размещения в heap pvPortMalloc(1172, id функции для отладки).
Миллион ненужных действий и диких китайских алгоритмов. Описывать даже не охота.
Что примечательного в этом всём:
system_param_save_with_protect() вызывает wifi_param_save_protect_with_check() в которой
pvPortZalloc(), (#) spi_flash_erase_sector(), spi_flash_write(), spi_flash_read(), ets_memcmp() и если не равно — возврат к началу стирания и записи (#) без какого либо счета неудач, в конце — vPortFree().
Если у вас упало или плавает питание, то процесс стирания и записи происходит до победного конца — дыры в Flash.
Первые варианты SDK у Espressif писал какой-то школьник, не проходивший программ обучения программированию (наверно денег у Espressif не было нанять проф.программиста). К версии SDK2.0 осталось 40% его алгоритмов. Остальные, более ужасные, были исправлены. Но множество «фич» так и осталось. К примеру SDK собирается только с выключенными всеми wraning у компилятора. Иначе образуется большой список ошибок по поводу не проинициализированных переменных, неверных вызовов пр параметрам функций и т.д. По этому от версии к версии разные баги в SDK и потом выдают новые патчи (назвав это оптимаза ). Так-же был прикол — на вопрос что была за ошибка и почему патч, программист ответил — пересобрал заново либы и оно исправилось.
На таком материале и сделана Arduino на ESP8266 другими, в основном энтузиастами. Ну и никогда не получите исходников SDK — это будет шоу.
По этому когда указываете какой код — надо приводить номер версии SDK и патчей.
Источник