node.js - Node dbus-native

标签 node.js dbus

Node 模块 dbus-native 的文档很薄弱,并且许多示例都不适用于我的用例,这看起来应该很简单。

我的问题是尝试对“connman”网络管理器进行简单的方法调用。我可以很好地发出请求(调用 GetProperties 方法),并返回一个复杂的结构,并大致弄清楚如何从中获取数据。但是,当我尝试使用 SetProperty 发回某些内容时,我就是不知道如何将数据转换成它想要的形式。 实际上并没有任何关于如何在 DBus 的类型系统和 Node 之间进行转换的文档。我从源头收集到,变体类型是带有签名和值的数组,例如 [ 's', 'string ],但无论我如何尝试修改要发送到 SetProperty 的数据,我都会收到 “无效的结构数据” 错误。

我尝试调用的 SetProperty 方法有一个参数签名 "sv"--name, value。我试图设置的特定属性本身有一个值(据我所知——这一侧也几乎没有宝贵的文档)“a{sv}”。也就是说,属性是属性名称和值的哈希值。我最初尝试调用此函数是:

var sysbus = require('dbus-native').systemBus();    
sysbus.invoke({
    path: '/net/connman/service/ethernet_1cba8cfa0e57_cable',
    destination: 'net.connman',
    'interface': 'net.connman.Service',
    member: 'SetPropertry',
    signature: 'sv',
    body: [
        'IPv4.Configuration', [
            'a{sv}',
            { 'Method': [ 's', 'dhcp' ] }
        ]
    ],
    type: dbus.messageType.methodCall
}, function (err, res) {
    // etc...
});

这给了我“无效的结构数据”错误。我尝试过其他方法将数据包装在数组、哈希等中,但似乎找不到正确的答案。我正在尝试模拟这个有效的 Python 代码:

import dbus
bus = dbus.SystemBus()
service = dbus.Interface(bus.get_object("net.connman",
    "/net/connman/service/ethernet_1cba8cfa0e57_cable",
    "net.connman.Service");
conf = { "Method": make_string_variant("dhcp") }
service.SetProperty("IPv4.Configuration", conf);

有什么想法吗?

最佳答案

我最近开始使用 dbus-native 进行 connman,并且所有嵌套数组也遇到问题。我将改进项目分支中的编码/解码 https://github.com/Digisoft-tv/node-dbus - 你可能想看看。希望我的更改能够被上游接受。

无论如何,要使其正常工作,您需要传入的参数格式如下:

mgr.CreateSession([ [ 'key', [ 's', 'value' ] ], [ 'key2', [ 'i', 2 ] ] ], '/object/path', function(error, response) {      
  if (error) {
    return console.error('SetProperty error:', error);
  }
  console.info('SetProperty response', response);
});

最外面的数组是“对象”(字典条目的数组)。 每个嵌套数组都包含一个键值对 (DICT ENTRY)。键位于索引 0 处,值位于索引 1 处。 这些值是一个变体,始终编码为数组,“签名”位于索引 0 处,实际值位于索引 1 处。

希望有帮助。

关于node.js - Node dbus-native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440589/

相关文章:

node.js - npm 卡在 fetchMetadata -> 网络上

sql - MSSQL 在 SSMS 和 Node JS 脚本中返回不同的结果

PHP Dbus 稳定实现

javascript - 捕获我导出的 async/await 函数的错误

node.js - 对象 #<Promise> 没有方法 'catch'

c++ - 使用系统 DBus 的 registerService 失败(但适用于 session DBus)

dbus - 使用gdbus启动systemd服务

python - Python DBus 异步方法的实现

python-3.x - 在 Python 3 中从 dbus 迁移到 GDbus

node.js - Express Session store.on 不是一个函数