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

Posted hotwater99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派中用Python配置WIFI账号密码相关的知识,希望对你有一定的参考价值。

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


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

image


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

image

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

image

  • 添加新的网络连接

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

wpa_cli -i wlan0 add_network

image

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

image

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

pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

image


在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

image

以上是关于树莓派中用Python配置WIFI账号密码的主要内容,如果未能解决你的问题,请参考以下文章

树莓派配置wifi的几种方法.md

树莓派(Raspberry Pi 3) 使用wifi模块连接网络

树莓派配置wifi链接

树莓派用户账号

树莓派,接收两个wifi 怎么设置

树莓派开启 SSH 和 WiFi(无需键盘显示器)