使用node.js控制wpa_supplicant

使用node.js控制wpa_supplicant

我想使用 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”是接口名称。

相关内容