【问题标题】:Error from Azure IoT Hub library when sending a message发送消息时来自 Azure IoT 中心库的错误
【发布时间】:2015-12-18 08:41:16
【问题描述】:

我正在使用 Azure IoT Hub 的 Node.JS 库来发送一些遥测数据,但我间歇性地从库中收到以下错误。

未处理的拒绝类型错误:无法读取未定义的属性“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) 在 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();
    }                        
});          

【问题讨论】:

    标签: node.js azure iot


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      到目前为止,Azure IoT Hub 是 Azure 上的一项预览功能服务。 Node.js 的 Azure IoT 设备 SDK 正在快速开发中。

      我正在尝试让熟悉该主题的人来进一步研究此问题。可能会有一些时间延迟。

      感谢您的耐心。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      相关资源
      最近更新 更多