2015-12-18 51 views
2

1m,並intermitently我收到以下錯誤從libaries錯誤從Azure的物聯網中心Libary當使用Azure的物聯網中心Node.js的libaries發送一些遙測數據發送消息

Unhandled rejection TypeError: Cannot read property 'on' of undefined at C:\Source\Messenger\app.js:156:17 at Amqp. (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\promise.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)

拋出此刻即時通過永久運行我的腳本,以便在錯誤生成時恢復。

有沒有其他人有這個問題,並設法解決它?

我的代碼看起來像如下

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

Azure的物聯網中心是在Azure上的遠預覽功能服務。用於Node.js的Azure IoT設備SDK正在快速發展。

我想讓熟悉這個主題的人來進一步研究這個問題。可能會有一些時間延遲。

感謝您的耐心等待。

+0

謝謝你的回覆,我已經發布在github問題頁面上的問題以及 https://github.com/Azure/azure-iot-sdks/issues/191 – Bearington

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,文件夾結構是一樣的這樣的畫面: 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); 

    }; 

} 

it工作正常。此外,如果您使用「Http」傳輸,它也可以正常工作。 您需要使用此代碼:

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

這就是爲什麼我建議你在"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); 
    } 

使用AMQPWS,因爲這個代碼如果URI格式「WSS」的原因,將註冊AMQP運輸。但AMQP傳輸的格式與「amqp://」類似。希望這可以幫助。

相關問題