发送消息时从Azure IoT Hub Libary发生错误

Im使用Node.JS库供Azure IoT Hub发送一些遥测数据,而且我得到了从库中抛出的以下错误

未处理的拒绝TypeError:无法在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)在C:\ Source \ Messenger \ node_modules \ azure-iot-device \在C:\ Source \ Messenger \ node_modules \ azure-iot-device \ node_modules \ azure-iot-common \ lib \ amqp.js:84:17下的node_modules \ azure-iot-common \ lib \ amqp.js:54:19 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:\来源\信使\ node_modules \蔚IOT设备\ node_modules \蔚IOT常见\ node_modules \ amqp10 \ node_modules \蓝鸟\ JS \发布\舞会 (C:\ Source \ Messenger \ node_modules \ azure-iot-device \ node_modules \ azure-iot-common \ node_modules \ amqp10 \ node_modules \ bluebird \ js \ release \ promise中的ise.js:591:10)。 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:在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)

此刻即时通过永久运行我的脚本,以便在错误生成时恢复。

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

我的代码如下所示

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

对于这个问题,我build议您可以使用AMQPWS或HTTP传输来发送和接收消息。 请参考我的步骤来实现发送和接收消息:

首先,我们应该创build一个设备并获取设备ID和SAS。 在Azure新门户上创build了IOT中心后,我在node.js命令行上运行了这些命令:在新门户上创buildIOT中心。

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

我得到的结果如下:

 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,其文件夹结构与此图相同: 在这里输入图像描述

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

 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”传输,它也可以正常工作。 你需要使用这个代码:

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

这就是为什么我build议你使用AMQPWS的原因,因为这个代码在"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); } 

如果URI格式为'wss',则将注册AMQP传输。 但AMQP传输的格式就像“amqp://”。 希望这可以帮助。

Azure物联网中心迄今为止是Azure上的预览function服务。 针对Node.js的Azure IoT设备SDK正在快速发展。

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

感谢您的耐心。