简体   繁体   English

发送消息时 Azure IoT 中心库出错

[英]Error from Azure IoT Hub library when sending a message

Im using the Node.JS libraries for Azure IoT Hub to send some telemetry data, and intermittently I get the following error thrown from the libraries.我使用 Azure IoT 中心的 Node.JS 库来发送一些遥测数据,并且间歇性地从库中抛出以下错误。

Unhandled rejection TypeError: Cannot read property 'on' of undefined at C:\\Source\\Messenger\\app.js:156:17 at Amqp.未处理的拒绝类型错误:无法在 Amqp 读取 C:\\Source\\Messenger\\app.js:156:17 处未定义的属性“on”。 (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\\prom (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:157:17) 在 C:\\Source\\Messenger\\node_modules\\azure-iot-device\\ node_modules\\azure-iot-common\\lib\\amqp.js:54:19 在 C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\lib\\amqp.js:84:17在 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) 在 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) 在 Promise._settlePromise0 (C:\\ Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\prom ise.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 [as _onImmediate] (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async.js:16:14) ise.js:591:10) 在 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) 在 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) 在 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) 在 Immediate.Async.drainQueues [as _onImmediate] (C:\\Source\\Messenger\\node_modules\\azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10\\node_modules\\bluebird\\js\\release\\async. js:16:14)

At the moment im running my scripts through forever so it recovers when the error is generated.目前我一直在运行我的脚本,以便在生成错误时恢复。

Has anyone else had this issue and managed to resolve it ?有没有其他人遇到过这个问题并设法解决了它?

My code looks like as follows我的代码如下所示

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();
    }                        
});          

For this issue, I recommend you can use the AMQPWS or HTTP transport to send and receive messages.对于这个问题,我建议您可以使用 AMQPWS 或 HTTP 传输来发送和接收消息。 Please refer to my steps to achieve to send and receive the message:请参考我的步骤来实现发送和接收消息:

Firstly, we should create a device and get the device id and SAS.首先,我们应该创建一个设备并获取设备 ID 和 SAS。 After created the IOT hub on Azure new portal, I ran those command on node.js command line: create IOT hub on new portal.在 Azure 新门户上创建 IOT 中心后,我在 node.js 命令行上运行这些命令:在新门户上创建 IOT 中心。

npm install -g iothub-explorer
iothub-explorer HostName=****.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=****/****= create mydevice --connection-string

I got the result as following:我得到的结果如下:

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=****/****=

Secondly, I installed the SDK on node.js project, the folder structure is same as this picture:其次,我在node.js项目上安装了SDK,文件夹结构和这张图一样: 在此处输入图片说明

Thirdly, I run this code on my project:第三,我在我的项目上运行此代码:

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);

    };

}

it works fine.它工作正常。 Also if you used the "Http" transport, it also works fine.此外,如果您使用“Http”传输,它也可以正常工作。 You need use this code:您需要使用此代码:

var client = device.Client.fromConnectionString(connectionString);

This is the reason why I recommend you use the AMQPWS, because of this code in "azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10-transport-ws":这就是我推荐您使用 AMQPWS 的原因,因为"azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10-transport-ws":的这段代码"azure-iot-device\\node_modules\\azure-iot-common\\node_modules\\amqp10-transport-ws":

if (this.uri.startsWith('wss')) {
    var wsTransport = require('amqp10-transport-ws');
    wsTransport.register(amqp10.TransportProvider);
  }

If the URI is format with 'wss', it will be register the AMQP transport.如果 URI 的格式为“wss”,则将注册 AMQP 传输。 But AMQP transport's format is like "amqp://".但是 AMQP 传输的格式类似于“amqp://”。 Hope this helps.希望这可以帮助。

The Azure IoT Hub was by far a preview feature service on Azure.到目前为止,Azure IoT 中心是 Azure 上的一项预览功能服务。 And the Azure IoT device SDK for Node.js is on the fast development.用于 Node.js 的 Azure IoT 设备 SDK 正在快速开发中。

I am trying to involve someone familiar with this topic to further look at this issue.我试图让熟悉这个主题的人进一步研究这个问题。 There might be some time delay.可能会有一些时间延迟。

Appreciate your patience.感谢您的耐心。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 Azure IoT 中心收到消息时触发函数 - Trigger a function when message received in Azure IoT Hub Azure IOT 集线器:发送遥测数据“无效传输配置”的参考错误 - Azure IOT Hub: ReferenceError sending Telemetry Data 'Invalid transport configuration' Azure 物联网和事件中心? - Azure ioT and Event Hub? 为Azure IoT中心运行节点server.js时,``向RegExp构造函数提供了无效标志''错误 - 'Invalid flags supplied to RegExp constructor' error when running node server.js for Azure IoT Hub 无法从 Azure IOT 集线器下载容器中的所有 Blob 并出现错误:无法读取未定义的属性“on” - Unable to Download all the Blobs in a container from Azure IOT Hub and getting error: Cannot read property 'on' of undefined Azure IOT Hub 设备“暂停” - Azure IOT Hub Device “Suspension” 如何使用 Azure IOT HUB 订阅 mqtt 代理上的主题,因为我希望在发布主题时将数据存储在 Azure iot hub 中 - How to subscribes to topic on mqtt broker with Azure IOT HUB as i want the data to be stored in Azure iot hub when I published my topic 物联网Hub AMQP协议错误 - IOT Hub AMQP protocol error Azure function 触发器与物联网中心“EntityPath” - Azure function trigger with IoT-Hub "EntityPath" Microsoft Azure IoT中心和不带DeviceId的connectionString - Microsoft Azure IoT Hub and connectionString without DeviceId
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM