节点 dbus-native

Posted

技术标签:

【中文标题】节点 dbus-native【英文标题】:Node dbus-native 【发布时间】:2014-02-21 19:36:52 【问题描述】:

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

我的问题是尝试对“connman”网络管理器进行简单的方法调用。我可以提出一个请求(调用GetProperties 方法)就好了,然后得到一个复杂的结构,并通常弄清楚如何从中获取数据。但是当我尝试用SetProperty 发回一些东西时,我就是不知道如何将我的数据转换成它想要的形式。 实际上并没有任何关于如何在 DBus 的类型系统和节点之间进行转换的文档。我从源代码中收集到变体类型是具有签名和值的数组,例如[ 's', 'string ],但无论我如何尝试处理我试图发送到SetProperty 的数据,我都会收到"Invalid struct data" 错误。

我试图调用的SetProperty 方法有一个参数签名"sv"--name, value。我试图设置的特定属性本身具有一个值(据我所知——这方面也有宝贵的小文档)"asv"。也就是说,property 是属性名称和值的散列。我最初调用这个函数的尝试是:

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', [
            'asv',
             'Method': [ 's', 'dhcp' ] 
        ]
    ],
    type: dbus.messageType.methodCall
, function (err, res) 
    // etc...
);

这给了我"Invalid struct data" 错误。我已经尝试过其他方法将数据包装在数组、哈希等中,但似乎找不到正确的答案。我正在尝试模拟这个工作 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);

有什么想法吗?

【问题讨论】:

【参考方案1】:

我最近开始将 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 处。

希望对你有帮助。

【讨论】:

【参考方案2】:

编码'asv'的正确方法是[ ['string', ['signature', 'value']], ... ]

数组(a)被编码为普通的 JS 数组以及结构/哈希(()/)。我可能会添加快捷方式以允许使用 JS 对象代替 asv,但目前输入必须非常冗长。

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', [
            'asv',
            [  // a 
               [ // 
                 'Method', [ 's', 'dhcp' ] // sv
               ]
            ]
        ]
    ],
    type: dbus.messageType.methodCall
, function (err, res) 
    // etc...
);

【讨论】:

以上是关于节点 dbus-native的主要内容,如果未能解决你的问题,请参考以下文章

给出一个二叉树的节点,返回该节点的前驱节点

给出一个二叉树的节点,返回该节点的前驱节点

web前端练习25----Dom1,元素节点(自己,父节点,子节点,兄弟节点),属性节点,文本节点

获取TreeView单击节点父节点的ID

DOM节点和DOM元素的区别

二叉树