节点dbus-native

时间:2014-01-29 19:22:33

标签: node.js dbus

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

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

我试图调用的"Invalid struct data"方法有一个参数签名SetProperty - name,value。我试图设置的特定属性本身就是一个值(据我所知 - 这方面也有很少的文档)"sv"。也就是说,property是属性名称和值的哈希值。我最初尝试调用此函数是:

"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... }); 错误。我已经尝试过man以其他方式将数据包装在数组,哈希等中,似乎无法找到正确的答案。我正在尝试模拟这个有效的Python代码:

"Invalid struct data"

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我最近开始使用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条目的ARRAY)。 每个嵌套数组都包含一个键值对(DICT ENTRY)。索引0处的键和索引1处的值。 这些值是一个变体,它总是被编码为一个数组,索引0处的“签名”和索引1处的实际值。

希望它有所帮助。

答案 1 :(得分:0)

正确的编码方式{sv}'是[ ['string', ['signature', 'value']], ... ]

数组(a)被编码为普通的JS数组以及结构/哈希(() / {})。我可能会添加快捷方式以允许使用JS对象代替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}',
            [  // a 
               [ // {
                 'Method', [ 's', 'dhcp' ] // sv
               ]
            ]
        ]
    ],
    type: dbus.messageType.methodCall
}, function (err, res) {
    // etc...
});