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

NodeJs がこれをどのように処理するかはわかりませんが、wpa サプリカントでインターフェイスを何度も作成することはできません。wpa にインターフェイスを登録すると、再度 "create_interface" を呼び出すとエラーがスローされます。

明確に言うと、「インターフェイスの作成」は、インターフェイスを初めて使用するときにのみ使用される機能です。たとえば、私は Python で wpa サプリカントを操作しましたが、Python wpa サプリカント API には、このための 2 つの機能、「create_interface」と「get_interface」があります。

私はこれを IoT デバイスで使用しているので、Python コードを共有します。

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

ここで、「wlp2s0」はインターフェース名です。

関連情報