我正在为Ubuntu Linux创建一个需要连接WiFi AP的软件。WiFi网络不是预先定义的,在一次软件运行过程中可以多次更改(用户是命令更改的人)。其思想是:给定一组ssid及其WPA或WEP密码短语,软件应该能够随心所欲地在网络之间切换,而无需更改系统中任何位置的任何配置文件。
看起来,最大的问题是将密码传递给连接。到目前为止,我一直在操作的是:
起初,我以为可以通过d-bus将密码传递给connman,但是这个版本的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特权、额外的时间,并增加了发生所有“现在可能出错的事情”的风险。然后我想密码可以通过某种方式传递给wpa_请求者d-bus API,但是我没有找到任何东西。
谷歌搜索也让我失望。好像从来没有人试过这样做。
命令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保护的WiFi网络?
我还想知道在这里使用connman是不是一个好方法,我是否不应该返回到网络管理器,这是Ubuntu的默认设置。
这显示了如何为WPA执行此操作。
首先,抛弃connman,使用NetworkManager。下面的示例脚本演示如何启用无线支持、检查具有给定SSID的网络是否可用、使用WPA密码短语连接到该SSID,然后断开与网络的连接并禁用无线。我很肯定这个脚本可以改进,但是当前版本足够作为一个例子:
相关问题 更多 >
编程相关推荐