我使用Azure IoT Hub的Node.JS库来发送一些遥测数据,并且间接地从库中抛出以下错误
未处理的拒绝TypeError:无法读取未定义的属性'on' 在C:\ Source \ Messenger \ app.js:156:17 在Amqp。 (C:\源\信使\ node_modules \天青-IOT装置\ node_modules \天青-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) 在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 \ promise.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)
目前我一直在运行我的脚本,以便在生成错误时恢复。
是否还有其他人遇到此问题并设法解决了这个问题?
我的代码如下所示
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();
}
});
答案 0 :(得分:1)
对于此问题,我建议您可以使用AMQPWS或HTTP传输来发送和接收邮件。 请参阅我的步骤来实现发送和接收消息:
首先,我们应该创建一个设备并获取设备ID和SAS。在Azure新门户上创建IOT中心后,我在node.js命令行上运行了这些命令: 在新门户上创建IOT中心。
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);
这就是我建议您使用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传输的格式就像是#am; amqp://"。希望这可以帮助。
答案 1 :(得分:0)
Azure IoT Hub是Azure上的预览功能服务。用于Node.js的Azure IoT设备SDK正在快速发展。
我试图让熟悉这个主题的人参与进一步研究这个问题。可能会有一些时间延迟。
感谢您的耐心等待。