在安裝系統時,曾用手動的方式來配置WIFI網絡和密碼,但是在部署數據采集裝置時,需要現場配置,為了方便操作可以用串口來傳入數據,然后由Ptyhon程序去修改WIFI配置。
wpa_cli工具
wpa_supplicant是一個連接和配置WIFI的工具,主要包含wpa_supplicant與wpa_cli兩個程序。wpa_supplicant啟動后可以用wpa_cli來連接和配置WIFI。
wpa_cli的常用操作參考這篇文章:https://blog.csdn.net/z2066411585/article/details/78761753
- 掃描wlan
//搜索附近的wifi熱點 wpa_cli -i wlan0 scan //顯示搜索wifi熱點的結果 wpa_cli -i wlan0 scan_result
- 管理已有連接(/etc/network/interfaces 中保存的連接)
// 列舉已有的連接 wpa_cli -i wlan0 list_network // 連接指定的ssid wpa_cli -i wlan0 select_network <network id> // 使能指定的ssid wpa_cli -i wlan0 enable_network <network id>
- 添加新的網絡連接
返回新增網絡連接的id(例子:已有0、1,新增2)
wpa_cli -i wlan0 add_network
- 修改網絡連接的ssid(網絡名)、psk(密碼)
// 設置網絡<network id>的ssid/網絡名 wpa_cli -i wlan0 set_network 0 ssid '"ssid_set_by_wpa_cli"' // 設置網絡<network id>的psk/密碼 wpa_cli -i wlan0 set_network 0 psk '"psk_set_by_wpa_cli"' // 設置網絡<network id>的掃描方式 wpa_cli -i wlan0 set_network 0 scan_ssid 1 // 設置網絡<network id>的優先級 wpa_cli -i wlan0 set_network 0 priority 1 // 保存配置到wpa_supplicant.conf wpa_cli -i wlan0 save_config
以設置網絡0為例:
打開/etc/wpa_supplicant/wpa_supplicant.conf 查看結果。
pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
在Python中調用wpa_cli
上面是在命令行中使用wpa_cli,在Python中可以通過os.system()函數來執行命令行指令。
以這條指令為例:
wpa_cli -i wlan0 set_network 0 ssid '"ssid_set_by_wpa_cli"'
在Python中調用,就是把這條指令用字符串的形式傳遞給os.system()函數:
os.system('sudo wpa_cli -i wlan0 set_network 0 ssid '"ssid_set_by_wpa_cli"'')
各種引號比較繞,首先是最外層的單引號,然后"ssid_set_by_wpa_cli"外也有一層單引號。
實際使用時,用戶ssid是個字符串變量:
os.system('sudo wpa_cli -i wlan0 set_network 0 ssid ' + '\'"' + ssid + '"\'')
函數的括號內是個字符串,拆成了下面的這幾段:
sudo wpa_cli -i wlan0 set_network 0 ssid | 字符串 |
\'" | \'--轉義,代表單引號,這段相當於'" |
ssid | 用戶ssid字符串 |
"\' | \'--轉義,代表單引號,這段相當於"' |
創建test_wpa.py
pi@raspberrypi:~ $ sudo nano test_wpa.py
1 # -*- coding:utf-8 -*- 2 import os 3 4 def set_wifi_ssid_psk(ssid, psk): 5 os.system('sudo wpa_cli -i wlan0 set_network 0 ssid ' + '\'"' + ssid + '"\'') 6 os.system('sudo wpa_cli -i wlan0 set_network 0 psk ' + '\'"' + psk + '"\'') 7 os.system('sudo wpa_cli -i wlan0 enable_network 0') 8 os.system('sudo wpa_cli -i wlan0 save_config') 9 10 def main(): 11 set_wifi_ssid_psk('ssid_set_by_python', 'psk_set_by_python') 12 13 if __name__ == '__main__': 14 main()
運行test_wpa.py
pi@raspberrypi:~ $ python test_wpa.py
查看結果,第0個網絡連接修改成功,到這里就實現在Python中配置網絡連接的功能。
pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf