
Ich möchte wpa_supplicant mithilfe eines node.js-Moduls steuern. Am wichtigsten ist, dass ich Verbindungsfehler erkennen kann, damit ich ein Programm schreiben kann, das darauf reagieren kann.
Bisher war das Einrichten einer drahtlosen Verbindung mit wpa_supplicant und Terminalbefehlen erfolgreich. Ich habe versucht, mit dem dbus-native-Modul auf die Schnittstelle wlan0 zuzugreifen, konnte jedoch nicht auf die Schnittstelle zugreifen.
Ich bin auch offen dafür, andere vorhandene Knotenmodule zu verwenden oder meine eigenen zu schreiben, wenn ich in die richtige Richtung gelenkt werde.
Kann mir jemand helfen, hier weiterzukommen?
Code, den ich bisher ausprobiert habe:
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);
});
});
Aktualisierung 1:
Ich habe die DBus-Eigenschaften-API verwendet, um die Schnittstelleneigenschaften zu untersuchen, und festgestellt, dass die Eigenschaft selbst null war.
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;
}
Meine einzige Schlussfolgerung ist, dass der wpa_supplicant nie neue Schnittstellen beim Dbus registriert.
(Ich habe sichergestellt, dass ich mein WLAN0 mit wpa_supplicant mithilfe von Terminalbefehlen eingerichtet habe.)
Aktualisierung 2:
Ich habe ständig versucht herauszufinden, warum der folgende Teil meines Codes immer wieder den Fehler anzeigt:
[ 'wpa_supplicant konnte diese Schnittstelle nicht erfassen.' ]
iface.CreateInterface([
['Ifname',
['s', 'wlan0']
]
], function (err, iface3){
console.log(err, iface3);
});
Antwort1
Ich bin mir nicht sicher, wie NodeJs damit umgeht, kann aber nicht immer wieder eine Schnittstelle auf dem WPA-Supplicant erstellen. Sobald Sie eine Schnittstelle auf dem WPA registriert haben, wird beim erneuten Aufruf von „create_interface“ ein Fehler ausgegeben.
Zur Klarstellung: „Schnittstelle erstellen“ ist eine Funktion, die nur beim ersten Verwenden der Schnittstelle verwendet wird. Ich habe beispielsweise mit WPA-Supplicant in Python gearbeitet, und die Python-API für WPA-Supplicant verfügt hierfür über zwei Funktionen: „create_interface“ und „get_interface“.
Ich habe dies auf einem IoT-Gerät verwendet und teile daher den Python-Code:
try:
wpa.create_interface('wlp2s0')
except:
wpa.get_interface('wlp2s0')
wobei „wlp2s0“ der Schnittstellenname ist.