从 dotnet 核心程序调用时 wpa_cli 导致失败

时间:2021-03-05 14:06:54

标签: .net-core raspberry-pi wpa

背景:

我在外围设备中使用了 raspberry-pi 3。外围设备最初没有 WIFI 设置。最终用户需要使用自己的 WIFI SSID 和密码进行配置,以便外围设备可以访问网络。这是通过移动应用程序完成的。为此,我使用 .NET Core 5 for ARM 编写了一个服务,该服务使用蓝牙与移动应用程序进行通信。

计划说明

该服务使用蓝牙从移动应用程序接受 WIFI 配置(SSID/密码),然后执行多个 wpa_cli 命令在树莓上设置 WIFI 网络。

我运行以下命令序列在 raspberry-pi 上配置 WIFI:

wpa_cli -i "wlan0" list_networks

解析上述命令的输出并通过以下方式删除现有网络(如果有):

wpa_cli -i "wlan0" remove_network <<id>>

其中 <> 是从解析第一个命令的输出中获得的网络的 id。上述命令工作正常。下一个我跑

wpa_cli -i "wlan0" add_network

输出被解析为新网络的id。也工作正常。

wpa_cli -i "wlan0" set_network <<id>> ssid '"<<ssid of network>>"'
wpa_cli -i "wlan0" set_network <<id>> psk '"<<network password>>"'
wpa_cli -i "wlan0" enable_network <<id>>
wpa_cli -i "wlan0" save_config
wpa_cli -i "wlan0" reconfigure

问题

从 bash 调用这些命令的结果是 OK(save_config 命令除外,它总是导致 FAIL)。

当我从 .NET Core 调用确切命令时,set_network 命令总是导致 FAIL 结果。 C# 代码如下所示:

// Code to validate ssid doesn't contain any weird chars here
var startupInfo = new ProcessStartInfo
{
    FileName = "wpa_cli",
    Arguments = $"-i \"wlan0\" set_network {id} ssid '\"{ssid}\"'",
    RedirectStandardError = true,
    RedirectStandardOutput = true,
};
using var process = Process.Start(startupInfo);
// Code to parse output here.

我用于测试的 SSID 值只有英文大写字母和数字(没有空格或特殊字符)。

所以从 bash 手动运行命令是有效的。从 .NET 核心程序运行命令会导致 FAIL。 但 WIFI 设置更改已应用且功能有效。只是 wpi_cli 返回误导性的“FAIL”结果而不是“OK”。没有写入 stderr。

我尝试运行 wpa_cli log_level debug,但没有显示其他信息。 syslog 中也没有任何内容。

目前,我更改了服务代码以忽略返回的“FAIL”。这种工作,但我认为如果代码实际上失败,这可能是未来的问题,我需要告诉用户更新网络设置失败,而不是在移动应用程序中显示成功消息。

提前感谢您的帮助:)

0 个答案:

没有答案