本文介紹:世紀互聯Azure IoT Hub的一種獲取設備上線通知的方案
視頻介紹:
您可在B站觀看視頻介紹:https://www.bilibili.com/video/BV1dp4y1X7X3/
或在作者博客觀看:https://www.51azure.cloud/post/2020/4/30/azure-iot-hub-device-on-line-report
圖文介紹:
對於Global Azure IoT Hub, 通過集成的和Event Grid的綁定即可獲得物聯網設備的上線下線事件,再通過配合邏輯應用或者Azure Function等其他paas服務可以實時的通知到自己的業務系統。
但是事件訂閱的的功能截止到2020年4月,由世紀互聯運營的Azure 尚不支持此功能,本文演示了一種在世紀互聯運營的Azure IoT Hub中獲取設備上線的方案,方案是開放的,其中的組件也是可以替換的,可根據實際業務架構進行調整。
本方案主要主要利用了消息路由功能,設備上線時發送特定的屬性的消息,比如設定message.properties.add('messageType', 'onlinereport'), 根據該消息屬性設定路由後,則可以將設備上線通知發送到特定隊列或主題中,之後可以通過Functions 或者Logic APP或者 Service Bus的SDK將結果寫入到特定的數據庫中或者調用特定的Webhook。
重點步驟:
創建Service Bus及隊列:
輸入資源名稱,本例中選擇標準層級即可,選擇區域,點擊 審閱+創建:
點擊創建:
創建完成點擊“轉到資源”
點擊添加隊列按鈕,創建隊列用於存放 設備上線消息:
創建隊列輸入一個隊列名稱,本例中其餘保持不變
創建如下消息路由:
在Azure IoT Hub 消息路由中添加自定義終結點:
輸入一個名稱,然後選擇剛創建好的Service Bus和隊列:
點擊添加路由:
輸入一個名稱,在下拉列表中選擇剛創建的終結點,輸入路由條件:
messageType="onlinereport"
修改示例代碼(node js):
關於Node.js示例代碼的下載及使用,請參見如下文章:
'use strict';// Using the Azure CLI:// az iot hub device-identity show-connection-string --hub-name {YourIoTHubName} --device-id MyNodeDevice --output tablevar connectionString = 'HostName=sean-iot-hub-v.azure-devices.cn;DeviceId=device001;SharedAccessKey=UfXj/60sNrwaCDbqjtcI3FIZsk60bfse1lizLLxuMUM=';var Mqtt = require('azure-iot-device-mqtt').Mqtt;var DeviceClient = require('azure-iot-device').Clientvar Message = require('azure-iot-device').Message;var client = DeviceClient.fromConnectionString(connectionString, Mqtt);// send telemetry message every 10 seconds.setInterval(function(){ // Simulate telemetry. var temperature = 20 + (Math.random() * 15); var message = new Message(JSON.stringify({ temperature: temperature, humidity: 60 + (Math.random() * 20) })); // Add a custom application property to the message. // An IoT hub can filter on these properties without access to the message body. message.properties.add('temperatureAlert', (temperature > 30) ? 'true' : 'false'); message.properties.add('messageType', 'telemetry'); console.log('Sending telemetry message: ' + message.getData()); // Send the message. client.sendEvent(message, function (err) { if (err) { console.error('send telemetry error: ' + err.toString()); } else { console.log('telemetry message sent'); } }); }, 10000);// send heartbeat message every 30 seconds.setInterval(function(){ var message = new Message(JSON.stringify({ messageType: 'heartbeat' })); message.properties.add('messageType', 'heartbeat'); console.log('Sending heartbeat message: ' + message.getData()); // Send the message. client.sendEvent(message, function (err) { if (err) { console.error('send heartbeat error: ' + err.toString()); } else { console.log('heartbeat message sent'); } }); }, 30000);//send Online report when device startvar message = new Message(JSON.stringify({ messageType: 'onlinereport' })); message.properties.add('messageType', 'onlinereport');console.log('Sending onlinereport message: ' + message.getData());// Send the message.client.sendEvent(message, function (err) { if (err) { console.error('send onlinereport error: ' + err.toString()); } else { console.log('onlinereport message sent'); } });
在隊列中驗證設備上線消息:
在工具中查看設備上線通知:
實際環境中,將該消息從消息隊列取出使用Functions或Logic APP對該消息進行處理即可。