wpa_cli命令行工具使用——用于Linux命令行连接WiFi


前言

  1. wpa_cli工作的前提就是wpa_supplicant要在后台正常运行——可以通过ps、pgrep等Linux命令行工具查看后台进程是否有wpa_supplicant。
  2. 运行wpa_supplicant——wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf,如果/etc/wpa_supplicant.conf文件里面已经配置保存了WiFi名称与密码,那命令执行完成后会成功连接WiFi。

一、运行wpa_cli,进行终端交互使用

  1. 终端执行wpa_cli,进入交互模式,如下图:wpa_cli正常进入交互
  2. 输入status——显示当前wlan0的连接状态,连接成功会看到Wifi密码、名称等系列信息;连接不成功会显示。
  3. 输入scan——扫描WiFi。等待返回OK;再执行scan_results,查看WiFi扫描结果。
  4. 输入list_networks——列出/etc/wpa_supplicant.conf文件里的配置保存网络,并可以看到配置文件里的WiFi网络当前状态(有没有处于当前连接)、所分配的网络ID数字。
  5. 连接WiFi步骤:
#1、输入:add_network——会返回一个ID数字,下面会用到
#2、输入:set_network <ID> ssid "WiFi名称"
#3、输入:set_network <ID> psk "WiFi密码"
#4、输入:enable_network <ID>——尝试连接使能为ID配置的网络
#5、输入:save_config——保存当前配置到/etc/wpa_supplicant.conf文件里
  1. 断开WiFi:
#输入:disable_network <ID>——禁用指定的网络
#输入:disconnect——断开当前连接的网络
  1. 重连WiFi:
#输入:reassociate——尝试重新连接当前配置的网络。
#输入:reconfigure——让 wpa_supplicant 重新加载配置文件并尝试连接
  1. 输入quit——退出wpa_cli交互模式

二、wpa_cli命令行非交互模式使用

代码示例:

 #cmd:status、scan、scan_results、list_networks...
 >>wpa_cli -i wlan0 <cmd>

总结

  • 简单罗列一下最常用的几种命令,后续有其他命令再添加上…
  • 我的开发板(buildroot系统)在wpa_supplicant启动之前,需要先使用ifconfig wlan0 downifconfig eth0 down关闭wlan0、eth0网卡,这样wpa_supplicant在启动后(自动打开wlan0网卡)才成功连接WiFi并配置上ip地址。
可以使用QProcess类和wpa_cli命令行工具来自动连接附近的WiFi。 首先,需要在Qt项目中添加以下代码来启动QProcess并执行wpa_cli命令: ```cpp QProcess process; QStringList arguments; arguments << "-i" << "wlan0" << "scan_results"; process.start("wpa_cli", arguments); process.waitForFinished(); QString output = process.readAllStandardOutput(); ``` 这将执行wpa_cli命令的scan_results选项,并将结果存储在output字符串中。 接下来,可以使用正则表达式来提取输出中的WiFi名称和信号强度,并将它们添加到一个QStringList中: ```cpp QStringList networks; QRegExp rx("([a-zA-Z0-9_-]+)\t(-[0-9]+)"); int pos = 0; while ((pos = rx.indexIn(output, pos)) != -1) { QString network = rx.cap(1); QString strength = rx.cap(2); networks << network; pos += rx.matchedLength(); } ``` 现在,可以将这些网络显示在应用程序中,并使用QInputDialog类来让用户选择要连接的网络: ```cpp bool ok; QString network = QInputDialog::getItem(this, "Select Network", "Networks", networks, 0, false, &ok); if (ok) { QStringList arguments; arguments << "-i" << "wlan0" << "add_network"; process.start("wpa_cli", arguments); process.waitForFinished(); output = process.readAllStandardOutput(); QString network_id = output.trimmed(); arguments.clear(); arguments << "-i" << "wlan0" << "set_network" << network_id << "ssid" << "\"" + network + "\""; process.start("wpa_cli", arguments); process.waitForFinished(); output = process.readAllStandardOutput(); arguments.clear(); arguments << "-i" << "wlan0" << "set_network" << network_id << "key_mgmt" << "NONE"; process.start("wpa_cli", arguments); process.waitForFinished(); output = process.readAllStandardOutput(); arguments.clear(); arguments << "-i" << "wlan0" << "enable_network" << network_id; process.start("wpa_cli", arguments); process.waitForFinished(); output = process.readAllStandardOutput(); arguments.clear(); arguments << "-i" << "wlan0" << "reassociate"; process.start("wpa_cli", arguments); process.waitForFinished(); output = process.readAllStandardOutput(); qDebug() << "Connected to network: " << network; } ``` 这将使用wpa_cli命令连接用户选择的网络。请注意,这里使用的是没有密码保护的网络,如果要连接有密码保护的网络,需要在代码中添加适当的选项和参数。 这就是使用Qt和wpa_cli命令行工具自动连接附近的WiFi的基本过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_52326454

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值