树莓派中用Python配置WIFI账号密码

LowisLucifer 2020-04-23

>> [目录] 数据远程采集 Step by Step

安装系统时,曾用手动的方式来配置WIFI网络和密码,但是在部署数据采集装置时,需要现场配置,为了方便操作可以用串口来传入数据,然后由Ptyhon程序去修改WIFI配置。

树莓派中用Python配置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

树莓派中用Python配置WIFI账号密码

  • 管理已有连接(/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>

树莓派中用Python配置WIFI账号密码

  • 添加新的网络连接

返回新增网络连接的id(例子:已有0、1,新增2)

wpa_cli -i wlan0 add_network

树莓派中用Python配置WIFI账号密码

  • 修改网络连接的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为例:

树莓派中用Python配置WIFI账号密码

打开/etc/wpa_supplicant/wpa_supplicant.conf 查看结果。

[email protected]:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

树莓派中用Python配置WIFI账号密码

在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

[email protected]:~ $ sudo nano test_wpa.py

# -*- coding:utf-8 -*-
import os

def set_wifi_ssid_psk(ssid, psk):
  os.system(‘sudo wpa_cli -i wlan0 set_network 0 ssid ‘ + ‘\‘"‘ + ssid + ‘"\‘‘)
  os.system(‘sudo wpa_cli -i wlan0 set_network 0 psk ‘ + ‘\‘"‘ + psk + ‘"\‘‘)
  os.system(‘sudo wpa_cli -i wlan0 enable_network 0‘)
  os.system(‘sudo wpa_cli -i wlan0 save_config‘)

def main():
  set_wifi_ssid_psk(‘ssid_set_by_python‘, ‘psk_set_by_python‘)

if __name__ == ‘__main__‘:
  main()

运行test_wpa.py

[email protected]:~ $ python test_wpa.py

查看结果,第0个网络连接修改成功,到这里就实现在Python中配置网络连接的功能。

[email protected]:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

树莓派中用Python配置WIFI账号密码

相关推荐