首页 文章

发送消息时来自Azure IoT Hub Libary的错误

提问于
浏览
2

我使用Azure IoT Hub的Node.JS库发送一些遥测数据,并且间接地从库中抛出以下错误

未处理的拒绝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 \ 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在Promise._settlePromiseFromHandler的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._settlePromise(C: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) :\ 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:\来源\信使\ node_modules \蔚IOT设备\ node_modules \蔚IOT常见\ node_modules \ amqp10 \ node_modules \蓝鸟\ JS \发布\舞会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)

目前我正在永远运行我的脚本,以便在生成错误时恢复 .

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

我的代码如下所示

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

2 回答

  • 1

    Azure IoT Hub是Azure上的预览功能服务 . 而针对Node.js的Azure IoT设备SDK正在快速发展 .

    我试图让熟悉这个主题的人参与进一步研究这个问题 . 可能会有一些时间延迟 .

    感谢您的耐心等待 .

  • 0

    对于此问题,我建议您可以使用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,文件夹结构与此图片相同:
    enter image description here

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

    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传输的格式类似于“amqp://” . 希望这可以帮助 .

相关问题