управление wpa_supplicant с помощью node.js

управление wpa_supplicant с помощью node.js

Я хотел бы контролировать wpa_supplicant с помощью модуля node.js. Самое главное, я хочу иметь возможность обнаруживать сбои соединения, чтобы я мог написать программу, которая может реагировать на них.

До сих пор настройка беспроводного соединения с помощью wpa_supplicant с командами терминала была успешной. Я пытался получить доступ к интерфейсу wlan0 с помощью модуля dbus-native, но не смог получить доступ к интерфейсу.

Я также открыт для использования других существующих узловых модулей или написания своего собственного, если мне укажут правильное направление.

Может ли кто-нибудь помочь мне продвинуться здесь?

Код, который я уже попробовал:

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:

Я использовал API свойств DBus для исследования свойств интерфейсов и обнаружил, что само свойство имеет значение 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.

(Я убедился, что настроил wlan0 с помощью wpa_supplicant, используя команды терминала)

Обновление 2:

Я постоянно пытаюсь понять, почему следующая часть моего кода постоянно выдает ошибку:

[ 'wpa_supplicant не смог захватить этот интерфейс.' ]

  iface.CreateInterface([
            ['Ifname',
                ['s', 'wlan0']
            ]
        ], function (err, iface3){
            console.log(err, iface3);
        });

решение1

Не уверен, как NodeJs с этим справляется, но не может снова и снова создавать интерфейс на wpa supplicant. После того, как вы зарегистрировали интерфейс на wpa, он выдает ошибку при повторном вызове "create_interface".

Для ясности, "Создать интерфейс" - это функционал, который используется только при первом использовании интерфейса. Например, я работал с wpa supplicant в python, и API python wpa supplicant имеет два функционала для этого, "create_interface" и "get_interface".

Я использовал это на устройстве IoT, поэтому поделюсь кодом Python:

try:
    wpa.create_interface('wlp2s0')
except:
    wpa.get_interface('wlp2s0')

где «wlp2s0» — имя интерфейса.

Связанный контент