首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送消息时来自Azure IoT集线器库的错误

发送消息时来自Azure IoT集线器库的错误
EN

Stack Overflow用户
提问于 2015-12-18 08:41:16
回答 2查看 2.5K关注 0票数 2

我使用用于Azure IoT集线器的IoT库发送一些遥测数据,并且间歇性地从库中抛出以下错误。

未处理的拒绝TypeError:无法读取属性“on”的未定义在C:\Source\Messenger\app.js:156:17在Amqp。(C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\lib\amqp.js:157:17) at C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\lib\amqp.js:54:19 at C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\lib\amqp.js:84:17 at tryCatcher (C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\util.js:11:23) at Promise._settlePromiseFromHandler (C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\promise.js:489:31) at Promise._settlePromise (C:\Source\Messenger\node_modules\ )azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\promise.js:546:18) at Promise._settlePromise0 (C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\promise.js:591:10) at Promise._settlePromises (C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\promise.js:670:18) at Async._drainQueue (C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\async.js:129:16) at Async._drainQueues (C:\Source\Messenger\node_modules\azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10\node_modules\bluebird\js\release\async.js:139:10) at Immediate.Async.drainQueues onImmediate

目前,我将永远运行我的脚本,因此在生成错误时它就会恢复。

有没有其他人有过这个问题,并设法解决了?

我的代码如下所示

代码语言:javascript
复制
azureClient = azureDevice.Client.fromConnectionString(connectionString, azureDevice.Amqp);

var message = new azureDevice.Message(JSON.stringify('TEST MESSAGE'));

azureClient.sendEvent(message, function (err) {
    if (err != null) {
        Configure();
    }                        
});          
EN

回答 2

Stack Overflow用户

发布于 2016-01-12 03:11:47

对于此问题,我建议您可以使用AMQPWS或HTTP传输来发送和接收消息。请参阅我发送和接收信息的步骤:

首先,我们应该创建一个设备,并得到设备id和SAS。在Azure新门户上创建IOT之后,我在node.js命令行上运行了以下命令:在新门户上创建IOT。

代码语言:javascript
复制
npm install -g iothub-explorer
iothub-explorer HostName=****.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=****/****= create mydevice --connection-string

我得到的结果如下:

代码语言:javascript
复制
Created device mydevice

-
  deviceId:                   mydevice
  generationId:               635881160181557968
  etag:                       MA==
  connectionState:            Disconnected
  status:                     enabled
  statusReason:               null
  connectionStateUpdatedTime: 0001-01-01T00:00:00
  statusUpdatedTime:          0001-01-01T00:00:00
  lastActivityTime:           0001-01-01T00:00:00
  cloudToDeviceMessageCount:  0
  authentication:
    SymmetricKey:
      primaryKey:   ****/****=
      secondaryKey: ****/****=
-
  connectionString: HostName=****.azure-devices.net;DeviceId=mydevice;SharedAccessKey=****/****=

其次,我在node.js项目上安装了SDK,文件夹结构与下图相同:

第三,我在我的项目上运行这个代码:

代码语言:javascript
复制
var device = require('azure-iot-device');
var connectionString = 'HostName=****.azure-devices.net;DeviceId=mydevice;SharedAccessKey=****/****=';
var client = device.Client.fromConnectionString(connectionString,device.AmqpWS);
setInterval(function () {
    var windSpeed = 10 + (Math.random() * 4); // range: [10, 14] 
    var data = JSON.stringify({ deviceId: 'mydevice', windSpeed: windSpeed });
    var message = new device.Message(data);
    message.properties.add('myproperty', 'myvalue');
    console.log("Sending message: " + message.getData());
    client.sendEvent(message, printResultFor('send'));   
}, 1000);

client.getReceiver(function (err, receiver) {
    receiver.on('message', function (msg) {
        console.log('Id: ' + msg.properties.messageId + ' Body: ' + msg.body);
        receiver.complete(msg, function () {
            console.log('completed');


             // receiver.reject(msg, function() { 
             //   console.log('rejected'); 
             // }); 
             // receiver.abandon(msg, function() { 
             //   console.log('abandoned'); 
             // }); 

        });
        receiver.on('errorReceived', function (err) {
            console.warn(err);

        });
    });
});

function printResultFor(op) {
    return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res);

    };

}

效果很好。另外,如果您使用"Http“传输,它也可以正常工作。您需要使用以下代码:

代码语言:javascript
复制
var client = device.Client.fromConnectionString(connectionString);

这就是我建议您使用AMQPWS的原因,因为这是"azure-iot-device\node_modules\azure-iot-common\node_modules\amqp10-transport-ws":中的代码。

代码语言:javascript
复制
if (this.uri.startsWith('wss')) {
    var wsTransport = require('amqp10-transport-ws');
    wsTransport.register(amqp10.TransportProvider);
  }

如果URI格式为“wss”,则将注册AMQP传输。但是AMQP传输的格式类似于"amqp://“。希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-12-22 13:48:11

到目前为止,Azure IoT集线器是Azure的预览功能服务。而用于IoT的Azure Node.js设备SDK正处于快速开发阶段。

我正试图让熟悉这个话题的人进一步研究这个问题。可能会有时间延迟。

感谢你的耐心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34351539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档