Я создаю программное обеспечение для Ubuntu Linux, которому необходимо подключиться к WiFi AP. Сеть WiFi не является предопределенной и может несколько раз меняться в течение одного запуска программного обеспечения (пользователь - тот, кто заказывает изменение). Идея такова: с учетом набора SSID и их кодовых фраз WPA или WEP программное обеспечение должно иметь возможность переключаться между сетями по прихоти, без необходимости изменять какие-либо файлы конфигурации в любой точке системы.
Огромная проблема, по-видимому, заключается в передаче парольной фразы в соединение. Вот что я до сих пор работал:
- Машина Ubuntu 12.10 оснащена Wi-Fi-ключом.
- Python, который запускает программное обеспечение и который будет использоваться для запроса соединений
- connman 0.79
- wpa_supplicant v1.0
- D-Bus
Сначала я подумал, что можно передать кодовую фразу на connman через d-bus, но ни эта версия connman, ни 1.11, похоже, не раскрывает для нее какой-либо метод. Затем я узнал, что можно выгрузить файл service_<SSID>.conf
в каталог /var/lib/connman/
. Содержимое файла очень простое и выглядит следующим образом:
[service_SSID]
Type=wifi
Name=Network-SSID
Passphrase=here-goes-the-passphrase
После создания этого файла подключение к сети требует простого вызова метода net.connman.Service.Connect() в соответствующей службе. Проблема в том, что connman не будет анализировать конфигурационный файл, если он не перезапустится. Это требует привилегий sudo, дополнительного времени и повышает риск для всего, что может произойти сейчас. Затем я понял, что парольная фраза может быть каким-то образом передана API-интерфейсу dpa-шины wpa_supplicant, но мне ничего не удалось найти.
Поиски Google тоже меня не подвели. Как будто никто никогда не пытался сделать это раньше.
Команда sudo iwconfig wlan0 essid <SSID> key s:<PASSPHRASE>
приводит к ошибке SET failed on device wlan0 ; Invalid argument.
. Кроме того, для этого требуется sudo, которого я бы хотел избежать.
Я попытался понять, как программа wpa_gui делает свою магию. Прежде всего я обнаружил, что он также требует sudo, и он отправляет кучу команд непосредственно на /var/run/wpa_supplicant/wlan0
. Репликация этого поведения будет для меня последней инстанцией, если я не выясню ничего проще.
Итак, большой вопрос заключается в следующем: как использовать Python для подключения к WEP/WPA-защищенной сети Wi-Fi?
Мне также интересно, является ли использование connman хорошим подходом здесь, и если я не вернусь к Network Manager, то есть по умолчанию Ubuntu.