node.js를 사용하여 wpa_supplicant 제어

node.js를 사용하여 wpa_supplicant 제어

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

관련 정보