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를 사용했고 속성 자체가 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
NodeJ가 이를 어떻게 처리하는지 잘 모르겠지만 wpa 요청자에서 인터페이스를 반복해서 생성할 수는 없습니다. wpa에 인터페이스를 등록하면 "create_interface"를 다시 호출할 때 오류가 발생합니다.
명확히 말하면 "인터페이스 생성"은 인터페이스를 처음 사용할 때만 작동하는 기능입니다. 예를 들어, 저는 Python에서 wpa supplicant를 사용했고, python wpa supplicant API에는 "create_interface"와 "get_interface"라는 두 가지 함수가 있습니다.
저는 IoT 장치에서 이를 사용하고 있으므로 Python 코드를 공유하겠습니다.
try:
wpa.create_interface('wlp2s0')
except:
wpa.get_interface('wlp2s0')
여기서 "wlp2s0"은 인터페이스 이름입니다.