controlando wpa_supplicant usando node.js

controlando wpa_supplicant usando node.js

Gostaria de controlar o wpa_supplicant usando um módulo node.js. Mais importante ainda, quero ser capaz de detectar falhas de conexão para poder escrever um programa que possa agir sobre elas.

Até agora, a configuração de uma conexão sem fio usando wpa_supplicant com comandos de terminal foi bem-sucedida. Tentei acessar a interface wlan0 usando o módulo nativo dbus, mas não consegui acessar a interface.

Também estou aberto a usar outros módulos de nó existentes ou escrever os meus próprios, se puder ser apontado na direção certa.

Alguém poderia me ajudar a avançar aqui?

Código que tentei até agora:

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);
        });

    });

Atualização 1:

Usei a API de propriedades do DBus para investigar as propriedades das Interfaces e descobri que a propriedade em si era nula.

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;
}

Minha única conclusão é que o wpa_supplicant nunca registra nenhuma nova interface no dbus.

(Garanti que configurei meu wlan0 usando wpa_supplicant usando comandos de terminal)

Atualização 2:

Tenho tentado continuamente descobrir por que a seguinte parte do meu código continua apresentando o erro:

[ 'wpa_supplicant não conseguiu capturar esta interface.' ]

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

Responder1

Não tenho certeza sobre como o NodeJs lida com isso, mas não é possível criar uma interface repetidamente no suplicante wpa. Depois de registrar uma interface no wpa, ocorre um erro ao chamar "create_interface" novamente.

Para esclarecer, "Criar interface" é uma funcionalidade usada apenas na primeira vez que você usa a interface. Por exemplo, trabalhei com suplicante wpa em python, e a API suplicante wpa python tem duas funcionalidades para isso, "create_interface" e "get_interface".

Tenho usado isso em um dispositivo IoT, então, compartilhando o código Python:

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

onde 'wlp2s0' é o nome da interface.

informação relacionada