我想使用 node.js 模块控制 wpa_supplicant 。最重要的是,我希望能够检测连接故障,以便我可以编写一个可以对它们采取行动的程序。
到目前为止,使用 wpa_supplicant 和终端命令设置无线连接已经成功。我尝试使用 dbus-native 模块访问 wlan0 接口,但无法访问该接口。
如果我能得到正确的指导,我也愿意使用其他现有的节点模块或编写我自己的模块。
有人可以帮助我在这里进步吗?
我迄今为止尝试过的代码:
var dbus = require('dbus-native');
var util = require('util');
var bus = dbus.systemBus();
var wpas = bus.getService('fi.w1.wpa_supplicant1');
var wpai = wpas.getInterface('/fi/w1/wpa_supplicant1'
, 'fi.w1.wpa_supplicant1', function (err, iface) {
//console.log(err, iface);
iface.on('PropertiesChanged', function(dict) {
console.log('interface properties have changed!');
console.log(dict);
});
iface.on('InterfaceAdded', function(path, dict) {
console.log('interface has been added!');
console.log(path, dict);
});
iface.on('InterfaceRemoved', function(path) {
console.log('interface has been removed!');
console.log(path);
});
// wpa_supplicant denies knowledge of the interface
iface.GetInterface('wlan0', function (err, iface2) {
console.log( arguments );
console.log(err, iface2);
});
//error couldn't grab interface
iface.CreateInterface([
['Ifname',
['s', 'wlan0']
]
], function (err, iface3){
console.log(err, iface3);
});
//error couldn't grab interface
iface.CreateInterface([
['Ifname',
['s', 'wlan0']
],
['Driver',
['s', 'nl80211']
],
['ConfigFile',
['s', '~/etc/wpa_supplicant/wpa_supplicant.conf']
]
], function (err, iface3){
console.log(err, iface3);
});
});
更新1:
我使用 DBus 属性 api 来调查 Interfaces 属性,发现该属性本身为 null。
wpas.getInterface('/fi/w1/wpa_supplicant1', 'org.freedesktop.DBus.Properties', function(err, device) {
device.GetAll('fi.w1.wpa_supplicant1', function(err, prop) {
var props = arrToMap(prop);
console.log(err,props);
});
});
function arrToMap(arr) {
var output = {};
for (var i = 0; i < arr.length; i++) {
output[arr[i][0]] = arr[i][1][1][0];
}
return output;
}
我唯一的结论是 wpa_supplicant 从未向 dbus 注册任何新接口。
(我已确保使用终端命令使用 wpa_supplicant 设置了 wlan0)
更新2:
我一直试图找出为什么我的代码的以下部分不断给我错误:
[“wpa_supplicant 无法获取此接口。” ]
iface.CreateInterface([
['Ifname',
['s', 'wlan0']
]
], function (err, iface3){
console.log(err, iface3);
});
答案1
不确定 NodeJs 如何处理这个问题,但无法在 wpa 请求者上一次又一次地创建接口。一旦你在 wpa 上注册了一个接口,它就会在再次调用“create_interface”时抛出错误。
澄清一下,“创建界面”是一项仅在您第一次使用该界面时使用的功能。例如,我在 python 中使用过 wpa 请求者,并且 python wpa 请求者 API 有两个功能,“create_interface”和“get_interface”。
我一直在 IoT 设备上使用它,所以分享一下 Python 代码:
try:
wpa.create_interface('wlp2s0')
except:
wpa.get_interface('wlp2s0')
其中“wlp2s0”是接口名称。