IoT Central 裝置橋接器是開放原始碼解決方案,可將其他 IoT 雲端 ( 例如 Sigfox、 Particle Device Cloud 和 The Things Network ) 連線到您的 IoT Central 應用程式。 裝置橋接器的運作方式是將資料從連線到其他 IoT 雲端的裝置轉送至您的 IoT Central 應用程式。 裝置橋接器只會將資料轉送至 IoT Central,不會將命令或屬性更新從 IoT Central 傳送回裝置。
裝置橋接器可讓您將 IoT Central 的強大功能與裝置結合,例如:
- 資產追蹤設備連接到 Sigfox 的低功耗廣域網路。
- Particle Device Cloud 上的空氣質量監測設備。
- The Things Network 上的土壤濕度監測設備。
您可以使用 IoT Central 應用程式功能,例如對資料進行規則和分析、在 Power Automate 和 Azure Logic Apps 中建立工作流程,或匯出資料。
裝置橋接器解決方案會將數個 Azure 資源佈建至您的 Azure 訂用帳戶,這些資源會一起運作,以轉換裝置訊息並將其轉送至 IoT Central。
先決條件
若要完成本操作指南中的步驟,您需要:
有效的 Azure 訂用帳戶。 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
從 自訂應用程式 範本建立的 IoT Central 應用程式。 若要深入瞭解,請參閱 建立 IoT Central 應用程式 和 如何取得應用程式的相關資訊?。
概觀
IoT Central 裝置橋接器是 GitHub 中的開放原始碼解決方案。 它會使用自訂 Azure Resource Manager 範本,將數個資源部署至 Azure 訂用帳戶,包括 Azure Functions 中的函式應用程式。
函式應用程式是裝置橋接器的核心部分。 它透過簡單的 Webhook 接收來自其他物聯網平台的 HTTP POST 請求。 Azure IoT Central 裝置橋接器存放庫包含範例,示範如何連線 Sigfox、Particle 和 The Things Network 雲端。 如果您的平台可以將 HTTP POST 要求傳送至函式應用程式,您可以擴充此解決方案以連線到自訂 IoT 雲端。
函式應用程式會將資料轉換成 IoT Central 接受的格式,並使用裝置布建服務和裝置用戶端 API 轉送資料:
如果您的 IoT Central 應用程式辨識轉送訊息中的裝置識別碼,則來自裝置的遙測會顯示在 IoT Central 中。 如果您的 IoT Central 應用程式無法辨識裝置識別碼,函式應用程式會嘗試使用裝置識別碼註冊新裝置。 新裝置會在 IoT Central 應用程式的 [裝置] 頁面上顯示為 [未指派的裝置]。 從 [裝置] 頁面,您可以將新裝置指派給裝置範本,然後檢視遙測。
部署裝置橋接器
若要將裝置橋接器部署至您的訂用帳戶:
在您的 IoT Central 應用程式中,流覽至 [許可權裝置 > 連線群組 ] 頁面。
記下 ID 範圍。 部署裝置橋接器時,您會使用此值。
在相同的頁面中,開啟 SAS-IoT-Devices 註冊群組。 在 SAS-IoT-裝置 群組頁面上,複製 主索引鍵。 部署裝置橋接器時,您會使用此值。
使用下列 [部署至 Azure ] 按鈕來開啟將函式應用程式部署至訂用帳戶的自訂 Resource Manager 範本。 使用上一個步驟中的 ID 範圍 和 主索引鍵 :
部署完成後,需要安裝函數所需的npm套件:
在 Azure 入口網站中,開啟已部署至訂用帳戶的函式應用程式。 然後,前往 開發工具>主控台。 在主控台中,執行下列命令來安裝套件:
cd IoTCIntegration npm install這些命令可能需要幾分鐘的時間才能執行。 您可以放心地忽略任何警告訊息。
套件安裝完成之後,請在函式應用程式的 [概觀] 頁面上選取 [重新啟動]:
該功能現在可以使用了。 外部系統可以使用 HTTP POST 要求,透過裝置橋接器將裝置資料傳送至 IoT Central 應用程式。 若要取得函式 URL,請流覽至 [函式 > IoTCIntegration > 程式碼 + 測試 > 取得函式 URL]:
傳送至裝置橋接器的訊息內文必須具有下列格式:
"device": {
"deviceId": "my-cloud-device"
},
"measurements": {
"temp": 20.31,
"pressure": 50,
"humidity": 8.5,
"ledColor": "blue"
}
物件中的 measurements 每個索引鍵都必須符合 IoT Central 應用程式中裝置範本中遙測類型的名稱。 此解決方案不支援在訊息本文中指定介面識別碼。 因此,如果兩個不同的介面具有相同名稱的遙測類型,則測量會出現在 IoT Central 應用程式的兩個遙測資料流程中。
您可以在內文中包含欄位 timestamp ,以指定訊息的 UTC 日期和時間。 此欄位必須採用 ISO 8601 格式。 例如: 2020-06-08T20:16:54.602Z 。 如果您未包含時間戳記,則會使用目前的日期和時間。
您可以在內文中包含欄位 modelId 。 使用此欄位可在佈建期間將裝置指派給裝置範本。
deviceId 必須是小寫的英數字,並且可以包含連字號。
如果您未包含欄位 modelId ,或 IoT Central 無法辨識模型識別碼,則具有無法辨識 deviceId 的訊息會在 IoT Central 中建立新的 未指派裝置 。 操作員可以手動將裝置移轉至正確的裝置範本。 若要深入瞭解,請參閱 管理 Azure IoT Central 應用程式 > 中的裝置將裝置移轉至範本。
備註
在將裝置指派給範本之前,所有對函式的 HTTP 呼叫都會傳回 403 錯誤狀態。
若要使用 Application Insights 開啟函數應用程式的記錄功能,請在 Azure 入口網站中瀏覽至函數應用程式中的 [監視] > [記錄]。 選取 [開啟 Application Insights]。
配置的資源
Resource Manager 範本會在 Azure 訂用帳戶中佈建下列資源:
- 函式應用程式
- App Service 方案
- 記憶體帳戶
- 金鑰保存庫
金鑰保存庫會儲存 IoT Central 應用程式的 SAS 群組金鑰。
函式應用程式會在 取用方案上執行。 雖然此選項不提供專用的運算資源,但它可讓裝置橋接器每分鐘處理數百則裝置訊息,適用於較小的裝置機群或傳送訊息頻率較低的裝置。 如果您的應用程式相依於串流大量裝置訊息,請將取用方案取代為專用的 App Service 方案。 該計劃提供專用計算資源,可提供更快的服務器響應時間。 使用標準 App Service 方案時,此存放庫中 Azure 函式的最大觀察效能約為每分鐘 1,500 則裝置訊息。 若要深入瞭解,請參閱 Azure Functions 裝載選項。
若要使用專用的 App Service 方案,而不是取用方案,請在部署之前編輯自訂範本。 選取 [編輯範本]。
取代下列區段:
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2015-04-01",
"name": "[variables('planName')]",
"location": "[resourceGroup().location]",
"properties": {
"name": "[variables('planName')]",
"computeMode": "Dynamic",
"sku": "Dynamic"
}
},
取代為:
{
"type": "Microsoft.Web/serverfarms",
"sku": {
"name": "S1",
"tier": "Standard",
"size": "S1",
"family": "S",
"capacity": 1
},
"kind": "app",
"name": "[variables('planName')]",
"apiVersion": "2016-09-01",
"location": "[resourceGroup().location]",
"tags": {
"iotCentral": "device-bridge",
"iotCentralDeviceBridge": "app-service-plan"
},
"properties": {
"name": "[variables('planName')]"
}
},
接下來,請編輯範本,將 "alwaysOn": true 包含在 functionapp 底下的 "properties": {"SiteConfig": {...}} 資源設定中。alwaysOn 設定可確保函數應用程式永遠處於執行狀態。
範例
下列範例概述如何為各種 IoT 雲端設定裝置橋接器:
範例 1:透過裝置橋接器連接 Particle 裝置
若要透過裝置橋接器將 Particle 裝置連線到 IoT Central,請移至 Particle 主控台並建立新的 Webhook 整合。 將請求格式設定為 JSON。 在 進階設定下,使用下列自訂內文格式:
{
"device": {
"deviceId": "{{{PARTICLE_DEVICE_ID}}}"
},
"measurements": {
"{{{PARTICLE_EVENT_NAME}}}": "{{{PARTICLE_EVENT_VALUE}}}"
}
}
從函數應用程式貼上函式 URL,您會看到 Particle 裝置在 IoT Central 中顯示為未指派的裝置。 若要深入瞭解,請參閱 以下是如何將 Particle 支援的專案與 Azure IoT Central 整合 部落格文章。
範例 2:透過裝置網橋連接 Sigfox 裝置
某些平台可能不允許您指定透過 Webhook 傳送的裝置訊息格式。 對於這類系統,您必須先將訊息承載轉換成預期的內文格式,然後裝置橋接器才能處理它。 您可以在執行裝置橋接器的相同函式中執行轉換。
本節說明如何將 Sigfox Webhook 整合的承載轉換為裝置橋接器預期的內文格式。 Sigfox 雲以十六進位字符串格式傳輸設備數據。 為了方便起見,裝置橋接器已包含此格式的轉換函式,可接受 Sigfox 裝置承載中的一小組可能欄位類型:int 及 uint (8、16、32 或 64 位元);float (32 位或 64 位元);little-endian 和 big-endian。 若要處理來自 Sigfox Webhook 整合的訊息,請對函式應用程式中的 IoTCIntegration/index.js 檔案進行下列變更。
若要轉換訊息負載,請在第 21 行呼叫 handleMessage 之前新增下列程式碼,並將 payloadDefinition 替換為您的 Sigfox 負載定義:
const payloadDefinition = 'gforce::uint:8 lat::uint:8 lon::uint:16'; // Replace this with your payload definition
req.body = {
device: {
deviceId: req.body.device
},
measurements: require('./converters/sigfox')(payloadDefinition, req.body.data)
};
Sigfox 裝置預期回應 204 碼。 在第 21 行呼叫
context.res = {
status: 204
};
範例 3:透過裝置橋接器從 The Things Network 連接裝置
若要將 The Things Network 裝置連線到 IoT Central:
- 在 The Things Network 中將新的 HTTP 整合新增至您的應用程式:應用程式 > 新增整合 > 整合 > HTTP 整合。
- 請確定您的應用程式包含解碼器函式,可在將裝置訊息的承載傳送至函式之前,自動將裝置訊息的承載轉換為 JSON: 應用程式 > 承載函式 > 解碼器。
下列範例顯示 JavaScript 解碼器函式,可用來從二進位資料解碼常見的數值類型:
function Decoder(bytes, port) {
function bytesToFloat(bytes, decimalPlaces) {
var bits = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
var sign = (bits >>> 31 === 0) ? 1.0 : -1.0;
var e = bits >>> 23 & 0xff;
var m = (e === 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000;
var f = Math.round((sign * m * Math.pow(2, e - 150)) * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces);
return f;
}
function bytesToInt32(bytes, signed) {
var bits = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
var sign = 1;
if (signed && bits >>> 31 === 1) {
sign = -1;
bits = bits & 0x7FFFFFFF;
}
return bits * sign;
}
function bytesToShort(bytes, signed) {
var bits = bytes[0] | (bytes[1] << 8);
var sign = 1;
if (signed && bits >>> 15 === 1) {
sign = -1;
bits = bits & 0x7FFF;
}
return bits * sign;
}
return {
temperature: bytesToFloat(bytes.slice(0, 4), 2),
presscounter: bytesToInt32(bytes.slice(4, 8), true),
blueLux: bytesToShort(bytes.slice(8, 10), false)
};
}
定義整合之後,請在函數應用程式 handleMessage 檔案的 呼叫 (第 21 行) 之前新增下列程式碼。 此程式碼會將 HTTP 整合的內文轉譯為預期的格式。
req.body = {
device: {
deviceId: req.body.end_device_ids.device_id.toLowerCase()
},
measurements: req.body.uplink_message.decoded_payload
};
備註
上一個程式碼片段會使用人類易記的裝置識別碼。 Things Network 訊息也包含技術 ID,您可以使用req.body.dev_eui.toLowerCase()來存取。 若要進一步了解,請參閱 Things Network - 資料格式。
局限性
裝置橋接器只會將訊息轉送至 IoT Central,不會將訊息傳回裝置。 此限制是屬性和命令不適用於透過此裝置橋接器連線到 IoT Central 的裝置的原因。 由於不支援裝置雙胞作業,因此無法透過裝置橋更新裝置屬性。 若要使用這些功能,裝置必須使用其中一個 Azure IoT 裝置 SDK 直接連線到 IoT Central。