【问题标题】:Node dbus-native - Passing Passphrase while connecting to WiFi service using connManNode dbus-native - 在使用 connMan 连接到 WiFi 服务时传递密码
【发布时间】:2025-11-27 22:50:01
【问题描述】:

您好,过去几天我一直遇到这个问题,同时尝试使用 dbus 连接到受保护的 WiFi 网络。所以我目前开发的代码是:

注册代理

var dbus = require('dbus-native');
var bus = dbus.systemBus();
bus.invoke({
        destination: 'net.connman',
        path: '/',
        'interface': 'net.connman.Manager',
        member: 'RegisterAgent',
        type: dbus.messageType.methodCall,
        signature: 'o',
        body: [
                '/test/agent'
        ]
}, function(error, response) {
        if (error) {
                console.error('Error', error);
                //process.exit(1);
        } else {
                console.info('Success', response);
               // process.exit(0);
        }
});

输出

> Success

扫描 Wifi

var dbus = require('dbus-native');
var bus = dbus.systemBus();
bus.invoke({
        destination: 'net.connman',
        path: '/net/connman/technology/wifi',
        'interface': 'net.connman.Technology',
        member: 'Scan',
        type: dbus.messageType.methodCall,
}, function(error, response) {
        if (error) {
                console.error('Error', error);
                //process.exit(1);
        } else {
                console.info('Success', response);
                //process.exit(0);
        }
});

输出

> Success

连接到 WiFi 服务

var dbus = require('dbus-native');
var bus = dbus.systemBus();
bus.invoke({
        destination: 'net.connman',
        path: '/net/connman/service/wifi_00e04c81923e_4469676957494649_managed_psk',
        'interface': 'net.connman.Service',
        member: 'Connect',
        type: dbus.messageType.methodCall,
}, function(error, response) {
        if (error) {
                console.error('Error', error);
                //process.exit(1);
        } else {
                console.info('Success', response);
                //process.exit(0);
        }
});

输出

> Error ['Invalid Arguments']

从 connMan 日志输出

connmand[1899]: src/agent.c:agent_receive_message() 代理 0x55640fe8 请求 0x55644378

connmand[1899]: src/service.c:request_input_cb() RequestInput 返回, 0x55649ad0

connmand[1899]:src/service.c:request_input_cb()error:org.freedesktop.DBus.Error.UnknownService

connmand[1899]: src/service.c:__connman_service_return_error() 服务 0x55649ad0 error 22 user_data (nil)

connmand[1899]: src/service.c:__connman_service_set_hidden_​​data() 服务 0x55649ad0 待处理(无)

connmand[1899]: src/service.c:service_save() 服务 0x55649ad0 新 1

connmand[1899]: src/connection.c:update_order()

connmand[1899]: src/service.c:__connman_service_get_order() 服务 0x55640a08 name 有线订单1拆分0

connmand[1899]: src/connection.c:find_default_gateway() 默认 0x5563b250 订单 1

connmand[1899]: src/connection.c:__connman_connection_update_gateway() 默认0x5563b250

connmand[1899]: src/service.c:connman_service_unref_debug() 0x55649ad0 参考 1 由 src/service.c:6945:agent_context_unref()

所以基本上,如果有人能告诉我如何传回包含 WiFi 网络密码短语的用户数据,我将不胜感激。

任何帮助将不胜感激? (connMan 1.20 版)

谢谢

【问题讨论】:

  • 看来需要先注册代理:pythonhosted.org/pyconnman/…
  • 还要仔细检查路径是否拼写正确 - connmand[1899]:src/service.c:request_input_cb()error:org.freedesktop.DBus.Error.UnknownService 可疑
  • 查看 github.com/cfsghost/jsdx-connman 它使用 dbus 而不是 dbus-native 但无论如何应该是一个好的开始
  • 哎呀,您已经注册代理了。好的,问题来了:代理是处理来自 connman 的请求的服务。您需要在连接名称 + 代理路径(在您的情况下为“/”)创建 dbus 服务
  • 您好 Andrey,感谢您的帮助 cmets 您能否详细说明解决方案,或者提供代码示例以便我完全理解?

标签: javascript node.js wifi dbus connman


【解决方案1】:

我无法让 dbus-native 工作。

我的解决方案是在 /lib/connman/ 中创建一个 wifi.config 文件,其中包含每个服务的密码:

wifi.config 示例

[service_wifi_00e04c819295_4469679972434649_managed_psk] 
Type = wifi
Security = wpa2 
Name = [service_] 
Type = wifi 
Security = wpa2 
Name = WiFiAP
Passphrase = 12345

然后简单的使用 dbus-native 连接 WiFi 服务:

连接

var dbus = require('dbus-native');
var bus = dbus.systemBus();
bus.invoke({
        destination: 'net.connman',
        path: '/net/connman/service/wifi_48022aca514f_4469676957494649_managed_psk',
        'interface': 'net.connman.Service',
        member: 'Connect',
        type: dbus.messageType.methodCall,
}, function(error, response) {
        if (error) {
                console.error('Error', error);
                //process.exit(1);
        } else {
                console.info('Success', response);
                //process.exit(0);
        }
});

【讨论】: