
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'은 인터페이스 이름입니다.