電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>重訪The Things Industries (TTI) V3 Azure IoT連接器

重訪The Things Industries (TTI) V3 Azure IoT連接器

2023-06-14 | zip | 0.00 MB | 次下載 | 免費

資料介紹

描述

早在 2020 年 11 月,我就發(fā)布了我的 The Things Network V2 Azure IoT Hubs & IoT Central Gateway。該項目是關(guān)于構(gòu)建物聯(lián)網(wǎng) (TTN)HTTP 應(yīng)用程序集成,它啟用Azure IoT 中心Azure IoT CentralAzure IoT 中心設(shè)備供應(yīng)服務(wù) (DPS)供應(yīng)支持的連接。

該項目使用了“符合流行語”的Microsoft Azure服務(wù)選擇,但它不支持云到設(shè)備 (C2D) 消息,存在消息排序問題,并且部署和設(shè)置復(fù)雜。還有其他問題,但不值得在這里重新討論

然后在 2021 年 3 月,我再次嘗試使用我的 The Things Industries(TTI) V3 Azure IoT 連接器,它是一個TTI(消息隊列遙測傳輸)MQTT 集成,也使用了 TTI應(yīng)用程序終端設(shè)備 API

此版本使用MQTTNet (這是一個很棒的庫)和在應(yīng)用程序啟動時連接到Azure IoT HubAzure IoT Central的 TTI 設(shè)備。即使我使用多個線程并對 Application 和 EndDevice 請求進(jìn)行分頁,這個過程也很慢。

該應(yīng)用程序更容易調(diào)試,因為我可以在桌面上運行它,并且更容易配置,因為我將配置轉(zhuǎn)移回appsettings.json文件(我可能會重新考慮放棄Azure Key Vault支持的決定)。

此版本具有基本的Azure 數(shù)字孿生定義語言 (DTDL)支持,因此可以在Azure IoT Central中“自動”預(yù)配設(shè)備。

我還添加了對Azure IoT HubsAzure IoT Central的C2D 支持,并基于下行鏈路消息有效負(fù)載確認(rèn)標(biāo)志跟蹤消息傳遞。我發(fā)現(xiàn)TTI 交付進(jìn)度更新的順序可能有問題

在生產(chǎn)環(huán)境中使用基于MQTT的集成后,我發(fā)現(xiàn)它過于“有狀態(tài)”并且無法從意外事件中很好地恢復(fù)。還有其他問題,但不值得在這里重新討論

然后在 2021 年 10 月,我決定我的“學(xué)習(xí)之旅”還沒有結(jié)束,我將構(gòu)建另一個TTI 連接器,該連接器將 Azure 存儲隊列用于 C2D 和 D2C 消息。

試用該應(yīng)用程序后,我意識到消息排序和部署復(fù)雜性可能是一個問題(我忘記了我的 TTN V2 網(wǎng)關(guān)學(xué)習(xí)),所以我暫停了項目(雖然我確實認(rèn)為這個項目可能對一些集成項目有用

此時,我回顧了從多個 TTI 集成項目中學(xué)到的知識,并決定再次嘗試使用The Things Stack(TTS) 網(wǎng)絡(luò)掛鉤集成。

我的“The Things Industries(TTI) V3 connector revisited”項目是一個身份轉(zhuǎn)換云網(wǎng)關(guān),它將LoRaWAN EndDevices映射Azure IoT Hub Devices 。

連接器為每個LoRaWAN設(shè)備創(chuàng)建一個DeviceClient ,并且可以使用Azure 設(shè)備連接字符串或Azure 設(shè)備預(yù)配服務(wù) (DPS) 。

poYBAGNYzOGAcTfrAAECnxtH-Cg828.png
The Things Industries Azure IoT 集成架構(gòu)
?

在我所有的集成中,TTI 一直是設(shè)備配置的單一事實來源 (SSOT) ,因為LoRaWAN配置設(shè)置的數(shù)量和復(fù)雜性會使從其他應(yīng)用程序管理它成為一個難題。(我還考慮過使用TTSEndDevice 模板來創(chuàng)建我可能會回來的設(shè)備)

當(dāng)前版本的一個限制是,EndDevice 將連接到Azure IoT Hub (提供應(yīng)用程序配置連接字符串或Azure IoT Hub DPS ),并且只有在收到 TTI 上行鏈路或Azure IoT Hub D2C 消息后才會處理 C2D 消息。一體化。

poYBAGNYzOOAE3kXAACiA5yQL2s896.png
Azure IoT Hub 設(shè)備在第一個 TTI 上行鏈路上連接
?

這可能是一個問題(尤其是在重新啟動集成后)或配置了新設(shè)備。我考慮過添加幾個Azure HTTP 觸發(fā)器函數(shù),應(yīng)用程序調(diào)用這些函數(shù)可以檢查設(shè)備的連接狀態(tài)并可選擇啟動連接。(短期內(nèi)從 TTI EndDevice 用戶界面或 API 模擬上行鏈路應(yīng)該可以工作)

我從D2C 消息傳遞開始,然后添加了C2D 消息傳遞,然后添加了支持DTDLV2 的 Device Provisioning(DPS) ,然后擴展了C2D 消息傳遞,最后實現(xiàn)了Azure IoT Central D2CC2D (使用少參數(shù)、單值和JavaScript 對象表示法(JSON )有效載荷命令

poYBAGNYzOeAGhl3AAFd9pLQHAk861.jpg
Azure IoT Central 儀表板,用于我的測試環(huán)境中的 Seeeduino LoRaWAN 傳感器
?

該應(yīng)用程序的核心是五個Azure HTTP 觸發(fā)函數(shù)(已發(fā)送函數(shù)當(dāng)前未使用)和一個為 C2D 調(diào)用的方法(與SetReceiveMessageHandlerAsync方法連接)消息。

pYYBAGNYzOqAFz3XAAEZr8FBBVM795.png
Azure 門戶功能列表
?

Azure IoT 中心可以調(diào)用方法(同步)消息(異步)發(fā)送到設(shè)備進(jìn)行處理。Azure IoT 中心 DeviceClient兩個方法SetMethodDefaultHandlerAsyncSetReceiveMessageHandlerAsync ,它們可以處理直接方法和消息。

在對以前的 TTI 連接器進(jìn)行了一些實驗之后,我發(fā)現(xiàn)DirectMethods的同步特性不適用于LoRAWAN通常“不規(guī)則”的上行鏈路,因此目前不支持它們。

該集成廣泛使用了Microsoft.Extensions.Logging功能和Azure Application Insights ,因此調(diào)試、監(jiān)控和故障查找更省時。

poYBAGNYzOyAauTpAAH12E5TmNo741.png
Azure Application Insights(說明搜索功能)
?

我已將有用的“元數(shù)據(jù)”添加到各個日志項中,因此更容易跟蹤為處理事件而執(zhí)行的所有步驟,例如 ReceiveMessageCallback AbandonAsync 、CompleteAsyncRejectAsync C2D 消息處理中使用的 LockToken。

應(yīng)用程序配置概述

可以使用appsettings.json文件配置應(yīng)用程序(對桌面開發(fā)和調(diào)試很有用)

{
   "Values": {
      "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=...",
      "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
      "APPINSIGHTS_INSTRUMENTATIONKEY": "..."
      },
      "TheThingsIndustries": {
      "WebhookBaseURL": "https://....eu1.cloud.thethings.industries/api/v3/as/applicat      ions",
      "Applications": {
         "seeeduinolorawan": {
         "webhookId": "azure-iot-hub-connector",
         "APIKey": "..."
         },
         "Wisnode Devices": {
         "webhookId": "azure-iot-hub-connector",
         "APIKey": "..."
         },
         "dragino-lht65": {
         "webhookId": "azure-iot-hub-connector",
         "APIKey": "..."
         },
         "SeeeduinoLoRaWAN100": {
         "webhookId": "azure-iot-hub-connector",
         "APIKey": "..."
         },
         "rak3172": {
            "webhookId": "azure-iot-hub-connector",
            "APIKey": "..."
         },
       "application1": {
          "webhookId": "azure-iot-hub-connector",
          "APIKey": "..."
        }
      }
   },
   "AzureIoT": {
      "DeviceClientCacheSlidingExpiration": "P2H30M",
      "IoTHub": {
         "IoTHubConnectionString": "HostName=...",
         "Applications": {
            "SeeeduinoLoRaWAN": {
            "DtdlModelId": "dtmi:ttnv3connectorclient:SeeeduinoLoRaWAN4cz;1"
            },
            "Wisnode Devices": {
            },
            "Dragino LHT65": {
            }
         }
      },
      "DeviceProvisioningService": {
         "IdScope": "0ne..",
         "Applications": {
         "seeeduinolorawan": {
            "DtdlModelId": "dtmi:ttnv3connectorclient:SeeeduinoLoRaWAN4cz;1",
            "GroupEnrollmentKey": "...",
         },
         "Wisnode Devices": {
            "GroupEnrollmentKey": "..."
         },
         "dragino-lht65": {
            "GroupEnrollmentKey": "..."
         },
         "rak3172": {
            "GroupEnrollmentKey": "..."
         },
      "application1": {
         "DtdlModelId": "dtmi:ttnv3connectorclient:FezduinoWisnodeV14x8;4",
         "GroupEnrollmentKey": "..."
      }
   }
},
"IoTCentral": {
   "methods": {
      "LightsGoOn": {
         "Port": 10,
         "Payload": "{"value_1": 1}"
      },
      "LightsGoOff": {
         "Port": 10,
         "Payload": "{"value_1": 0}"
      },
      "value_0": {
         "Port": 20
      },
      "value_1": {
         "Port": 21
      },
      "value_2": {
         "Port": 22
      },
      "TemperatureOOBAlertMinimumAndMaximum": {
         "Port": 23
      },
   }
}

暫存和生產(chǎn)部署的首選方法)是使用Azure 門戶Azure 功能配置刀片

pYYBAGNYzO-Aa-SEAAKdZ3Fh_tg207.png
Azure 門戶 Azure Function 配置
?

Things Industries Webhook 集成配置

要發(fā)送下行鏈路和接收上行鏈路消息,必須配置 TTI 應(yīng)用程序和TTI 連接器并配置 API 密鑰。

注意 – TTN URL 和 Azure IoT 中心設(shè)備標(biāo)識符區(qū)分大小寫

poYBAGNYzPWAREuHAALngodwyP0595.png
Azure Function 配置 TTI webhook 配置設(shè)置
?

TTI 連接器需要webhookbaseURL ,然后是每個 TTI 應(yīng)用程序和一個API 密鑰,以及 WebhookId

pYYBAGNYzPiAZ8lbAAEjSkcSAOg368.png
Azure 功能配置應(yīng)用程序密鑰
?

當(dāng)調(diào)用 Azure Functions 時,Azure Function Host Key會在名為“x-functions-key”的HTTP 標(biāo)頭中傳遞

poYBAGNYzPqAH0iUAADHLPcEWyc812.png
Azure Function API Key TTI Webhook 消息處理進(jìn)度配置
?

使用TTI App Key保護下行鏈路消息處理

poYBAGNYzP2ADiANAACBjeNeImQ098.png
顯示所需權(quán)限的 TTI 應(yīng)用程序密鑰創(chuàng)建
?

當(dāng)調(diào)用TTI webhook 下行鏈路端點時, TTI 應(yīng)用程序密鑰在標(biāo)準(zhǔn)HTTP 授權(quán)標(biāo)頭中傳遞

poYBAGNYzQOAIj9rAACIlpf8IHU855.png
使用 Azure Function 端點作為基本 URL 創(chuàng)建 TTI Webhook 集成
?

Azure IoT 中心連接配置

TTI 連接器需要共享訪問簽名 (SAS) 設(shè)備策略連接字符串才能連接到Azure IoT 中心。

pYYBAGNYzQaAbmJZAAJFJikKiLk343.png
突出顯示 Azure IoT 中心配置的 Azure 函數(shù)配置
?
poYBAGNYzQmAHUyeAAGInG4Qun4095.png
Azure IoT 中心設(shè)備策略連接字符串配置刀片
?

Azure IoT Hub設(shè)備必須手動或通過Azure IoT Hub REST API進(jìn)行預(yù)配我已經(jīng)試用了一個Azure 邏輯應(yīng)用程序,它管理設(shè)備配置并且可以在操作失敗時穩(wěn)健地處理所需的補償事務(wù)。

poYBAGNYzQuAcK8UAAEth8zEceU341.png
Azure IoT 中心設(shè)備
?

如果同時配置了Azure IoT 中心/Azure IoT 中心設(shè)備預(yù)配 (DPS) 支持,則 TTI 連接器應(yīng)用程序?qū)⒉粫印?/font>

請注意:Azure IoT 中心設(shè)備 ID 是一個區(qū)分大小寫的字符串(最長 128 個字符),由 ASCII 7 位字母數(shù)字字符加上某些特殊字符組成:-。+ % _ # * ? ( ), : = @$ '

Azure IoT 中心設(shè)備預(yù)配服務(wù) (DPS) 配置

TTI 連接器支持用于獨立Azure IoT 中心應(yīng)用程序的Azure IoT 中心設(shè)備預(yù)配服務(wù) (DPS) 。TTI 連接器實現(xiàn)還支持用于設(shè)備配置的Azure IoT Central 數(shù)字孿生定義語言( DTDL V2 )。

Azure IoT 中心設(shè)備預(yù)配服務(wù)支持使用X.509證書、可信平臺模塊 (TPM)使用共享訪問簽名(SAS) 安全令牌的對稱密鑰進(jìn)行設(shè)備證明

Things Industries(TTI) V3 Azure IoT 連接器僅支持對稱密鑰設(shè)備證明。

如果Azure IoT 中心/ Azure IoT 中心設(shè)備預(yù)配 (DPS)支持兩者/兩者均未配置,則 TTI 連接器應(yīng)用程序?qū)⒉粫印?/font>

pYYBAGNYzQ-AZBoNAAIeq-DXUuA965.png
Azure 功能配置與 Azure IoT 中心設(shè)備預(yù)配服務(wù)配置
?

Azure IoT 中心設(shè)備預(yù)配服務(wù) (DPS)具有確定設(shè)備分配方式的服務(wù)級別設(shè)置。有四種支持的分配策略:

  • 均勻加權(quán)分布:鏈接的物聯(lián)網(wǎng)中心同樣可能有設(shè)備配置給它們。默認(rèn)設(shè)置。如果您僅將設(shè)備預(yù)配到一個 IoT 中心,則可以保留此設(shè)置。
  • 最低延遲:將設(shè)備預(yù)配到設(shè)備延遲最低的 IoT 中心。如果多個鏈接的 IoT 集線器將提供相同的最低延遲,則供應(yīng)服務(wù)會在這些集線器之間散列設(shè)備
  • 通過注冊列表進(jìn)行靜態(tài)配置:注冊列表中所需 IoT 中心的規(guī)范優(yōu)先于服務(wù)級別分配策略。
  • 自定義(使用 Azure 函數(shù))自定義分配策略使您可以更好地控制如何將設(shè)備分配給 IoT 中心。這是通過使用 Azure 函數(shù)中的自定義代碼將設(shè)備分配給 IoT 中心來實現(xiàn)的。設(shè)備預(yù)配服務(wù)調(diào)用您的 Azure 函數(shù)代碼,提供有關(guān)設(shè)備和代碼注冊的所有相關(guān)信息。您的函數(shù)代碼將執(zhí)行并返回用于預(yù)配設(shè)備的 IoT 中心信息。

在我的測試環(huán)境中,我使用均勻加權(quán)分布,當(dāng)我預(yù)置 1000 臺設(shè)備時,它們分布在我的五個Azure IoT 中心

pYYBAGNYzRKAX1gwAAEhJo3m_5c814.png
Azure IoT 中心設(shè)備預(yù)配服務(wù) Azure IoT 中心配置
?
pYYBAGNYzRWAHe27AAGk_px_ISU214.png
Azure IoT Hub DPS 設(shè)備分發(fā)
?

Azure IoT Central DPS 配置

TTI 連接器支持Azure IoT Central應(yīng)用程序所需的Azure IoT 中心設(shè)備預(yù)配服務(wù) (DPS) (有一種預(yù)配單個設(shè)備的方法) 。TTI 連接器實現(xiàn)還支持用于“自動”設(shè)備預(yù)配的Azure IoT Central 數(shù)字孿生定義語言( DTDL V2 )。

如果同時配置了Azure IoT 中心/Azure IoT 中心設(shè)備預(yù)配 (DPS) 支持,則 TTI 連接器應(yīng)用程序?qū)⒉粫印?/font>

pYYBAGNYzQ-AZBoNAAIeq-DXUuA965.png
Azure 功能配置與 Azure IoT 中心設(shè)備預(yù)配服務(wù)配置
?

第一步是配置Azure IoT Central 注冊組(確保“自動連接該組中的設(shè)備”為“零接觸”配置)并將IDScope組注冊密鑰復(fù)制到 TTI 連接器配置

poYBAGNYzR6AGi-eAADsoRNAUkE603.png
RAK3172 設(shè)備連接配置
?

然后,我為我的RAK3172 分線板基于 .Net Core 供電的測試設(shè)備創(chuàng)建了一個 Azure IoT Central 模板

pYYBAGNYzSCAE2kLAAD3d8M7ht8562.png
RAK3172 設(shè)備模板
?
poYBAGNYzSOAFwe9AAEJdHLmI6g896.png
RAK3172 設(shè)備注冊組
?
pYYBAGNYzSWAdJ9TAADgw9ydDE4677.png
將設(shè)備組與組注冊配置關(guān)聯(lián)
?
poYBAGNYzSmAcFdyAAD2g049uFo336.png
復(fù)制 RAK3172 DTDL V2 模板 ID
?

還可以使用在 TTI 連接器配置中指定的可選 dtdlmodelid 為 TTI 應(yīng)用程序設(shè)置設(shè)備模板 @Id。

Azure IoT Hub 設(shè)備到云 (D2C)

LoRaWAN設(shè)備使用共享訪問簽名 (SAS) 設(shè)備策略連接字符串連接到Azure IoT 中心。我正在使用Device Twin Explorer顯示遙測數(shù)據(jù)并向我的傳感器節(jié)點發(fā)送消息。

poYBAGNYzSyAXyr1AAEXMpbrU2w884.jpg
顯示來自我的 Seeeduinolorawan2 設(shè)備的遙測數(shù)據(jù)的設(shè)備資源管理器
?

如果有效負(fù)載已被有效負(fù)載格式化程序解碼,則將對其進(jìn)行后處理,然后包含在消息有效負(fù)載中。

try
{
	JObject telemetryEvent = new JObject
	{
		{ "ApplicationID", applicationId },
		{ "DeviceEUI" , payload.EndDeviceIds.DeviceEui},
		{ "DeviceID", deviceId },
		{ "Port", port },
		{ "Simulated", payload.Simulated },
		{ "ReceivedAtUtc", payload.UplinkMessage.ReceivedAtUtc.ToString("s", CultureInfo.InvariantCulture) },
		{ "PayloadRaw", payload.UplinkMessage.PayloadRaw }
	};

	// If the payload has been decoded by payload formatter, put it in the message body.
	if (payload.UplinkMessage.PayloadDecoded != null)
	{
		EnumerateChildren(telemetryEvent, payload.UplinkMessage.PayloadDecoded);
	}

	// Send the message to Azure IoT Hub
	using (Message ioTHubmessage = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(telemetryEvent))))
	{
		// Ensure the displayed time is the acquired time rather than the uploaded time. 
		ioTHubmessage.Properties.Add("iothub-creation-time-utc", payload.UplinkMessage.ReceivedAtUtc.ToString("s", CultureInfo.InvariantCulture));
		ioTHubmessage.Properties.Add("ApplicationId", applicationId);
		ioTHubmessage.Properties.Add("DeviceEUI", payload.EndDeviceIds.DeviceEui);
		ioTHubmessage.Properties.Add("DeviceId", deviceId);
		ioTHubmessage.Properties.Add("port", port.ToString());
		ioTHubmessage.Properties.Add("Simulated", payload.Simulated.ToString());

		await deviceClient.SendEventAsync(ioTHubmessage);

		logger.LogInformation("Uplink-DeviceID:{deviceId} SendEventAsync success", deviceId);
	}
}
catch( Exception ex)
{
	logger.LogError(ex, "Uplink-DeviceID:{deviceId} SendEventAsync failure", deviceId);

	// If retries etc fail remove from the cache and it will get tried again on the next message
	_DeviceClients.Remove(deviceId);
}

Azure IoT Hub 云到設(shè)備 (C2D)

基本 Azure IoT 中心 C2D 消息傳遞僅需要端口號、TTI 確認(rèn)、隊列和優(yōu)先級(如果未提供)使用默認(rèn)值。

  • 確認(rèn) - 真/
  • 隊列 - 推送/替換
  • 優(yōu)先級 - 最低/低/低于正常/正常/高于正常/高/最高

這些選項在消息屬性中指定。為了測試此功能,我使用了Azure Device Explorer Twin應(yīng)用程序,該應(yīng)用程序還顯示消息傳遞進(jìn)度。

如果負(fù)載無效,則假定JSONBase64編碼的(需要額外驗證)并復(fù)制到下行鏈路消息的 payload_raw 字段中。

pYYBAGNYzS6AL6-tAADFC8wNbCA676.jpg
Azure 設(shè)備資源管理器 RAW 有效負(fù)載
?
poYBAGNYzTGASEbNAADbST3YReU601.jpg
Arduino 串行監(jiān)視器 RAW Payload
?

如果有效載荷是有效的JSON ,它被“嫁接”(想不出更好的詞)到TTI 下行鏈路消息 decoded_pa??yload 字段中。

poYBAGNYzTSALNYjAADqGCT16N8236.jpg
Arduino 串行監(jiān)視器 JSON 有效負(fù)載
?

Azure IoT Central 設(shè)備到云 (D2C)

連接器“轉(zhuǎn)換”了The Things Industries(TTI) MyDevices Cayenne 低功耗協(xié)議 (LPP) 有效負(fù)載格式化程序的輸出(它還支持自定義編碼器/解碼器,但尚未經(jīng)過廣泛測試),以便它可以被Azure IoT Central攝取.

用于處理TTI 上行鏈路消息Azure 函數(shù)首先反序列化JSON負(fù)載,丟棄任何LoRaWAN 控制消息和具有空負(fù)載的消息。

poYBAGNYzTeAG07PAAFpehk3pkk470.png
Azure IoT Central Device Raw Data 選項卡,其中包含成功解碼的 GPS 位置有效負(fù)載
?
pYYBAGNYzTqAV4vWAADDpUwi9wM730.png
使用基本數(shù)據(jù)類型的簡單 Seeeduino LoRaWAN 模板
?
poYBAGNYzT2AAeBPAAE_z9uFLiI949.png
Dragino LHT65 模板使用一系列基本數(shù)據(jù)類型
?

為了測試更復(fù)雜的場景,我創(chuàng)建了一個Azure IoT Central 設(shè)備模板,該模板具有“功能類型”的位置。

poYBAGNYzT-AVS2BAADgvu0et3I503.png
帶有溫度、濕度和位置數(shù)據(jù)類型的 Seeeduino LoRaWAN/GPS 模板
?

如果消息已由有效負(fù)載格式化程序成功解碼,則 PayloadDecoded 內(nèi)容將被“嫁接”到Azure IoT Central 遙測消息中。

pYYBAGNYzUKATIRkAADNm0nMt3I672.png
?

Azure IoT Central 位置遙測消息的格式與 TTI Cayenne LPP Payload格式化程序的輸出格式略有不同,因此必須對有效負(fù)載進(jìn)行“后處理”(使用新的Azure IoT Central 地圖遙測入口功能,這可能不是必需的) .

poYBAGNYzUaAKkppAADj0rmQKAg249.png
適用于 Azure IoT Central 的“后處理”TTI JSON GPS 位置數(shù)據(jù)
?
poYBAGNYzUmAH61MAAH7C6JZOSk094.png
突出顯示設(shè)備位置的 Azure IoT Central 地圖
?

我可能必須擴展后處理以支持其他Cayenne LPP 或第三方有效負(fù)載格式化程序。

Azure IoT Central 云到設(shè)備 (C2D)

要發(fā)送下行鏈路消息,TTI 需要一個無法通過 Azure IoT Central 命令設(shè)置提供的LoRaWAN 端口號(加上可選隊列、確認(rèn)和優(yōu)先級值),因此這些值在集成配置中進(jìn)行配置。

我的集成僅使用離線排隊命令,因為消息通常不會立即傳遞到傳感器節(jié)點,特別是如果傳感器節(jié)點僅每半小時/小時/天發(fā)送一條消息。

pYYBAGNYzUyAOm77AAJJGbGzZ10765.png
Azure IoT Function 連接器配置顯示命令設(shè)置選項
?

每個 TTI 應(yīng)用程序都有零個或多個Azure IoT Central 命令配置,這些配置指定 LoRaWAN 端口號,以及可選的有效負(fù)載、已確認(rèn)的 TTI 下行鏈路消息、優(yōu)先級和隊列設(shè)置。

poYBAGNYzU6AQE2lAAEkhVC1Sf8619.png
Azure IoT Central 設(shè)備模板,包含支持的命令類型示例
?

無參數(shù)命令

即使該命令沒有參數(shù),也必須配置下行鏈路消息負(fù)載(當(dāng)前只有JSON編碼的負(fù)載,考慮到原始Base64負(fù)載支持)

此示例說明如何使用內(nèi)置的Cayenne LPP 有效負(fù)載格式化程序配置打開和關(guān)閉燈的命令。

poYBAGNYzVGAca-6AAHf6HmAFOw123.png
Azure IoT Central 命令 LoRaWAN 端口分配
?
poYBAGNYzVaAOqnIAAHrCZQngcQ596.png
Azure IoT Central 無參數(shù)命令 JSON 有效負(fù)載配置
?
pYYBAGNYzViAA4W-AAEgUvdADkU891.png
Azure IoT Central 無參數(shù)命令模板配置
?
pYYBAGNYzVuAeG_rAADfSCq_FFg765.png
Azure IoT Central 無參數(shù)命令啟動
?

枚舉參數(shù)

此示例顯示如何通過從選項列表中選擇所需狀態(tài)來配置打開和關(guān)閉風(fēng)扇的命令。

poYBAGNYzV6AfV97AAFVeOpPRCg292.png
Azure IoT Central 枚舉命令模板配置
?
poYBAGNYzWaATaciAABGdXU4gms769.png
Azure IoT Central Enumeration 命令枚舉值配置
?
pYYBAGNYzWiAbr60AAD_WtAy6zc232.png
Azure IoT Central 枚舉命令啟動
?
pYYBAGNYzWyAJsZ4AAGoU_bimTE677.png
Azure IoT Central 枚舉命令交付
?

單值參數(shù)

此示例顯示如何配置用于設(shè)置警報的最低溫度的命令。

poYBAGNYzXGAWtMqAAE1EvoSrfY040.png
Azure IoT Central 單參數(shù)命令模板配置
?
pYYBAGNYzXSAK48IAADmwlSMS-I789.png
Azure IoT Central 單參數(shù)命令啟動
?
poYBAGNYzXeAHMF5AAHyekH5NNk048.png
Azure IoT Central 單參數(shù)命令傳輸
?
poYBAGNYzXmAAAqFAADKRJ4uDbE545.png
Azure IoT Central 單參數(shù)命令交付
?

JSON 參數(shù)

此示例說明如何配置命令以設(shè)置警報的最低和最高溫度。

poYBAGNYzX6ASWkVAAErBj8j3K4234.png
Azure IoT Central JSON 參數(shù)命令模板配置
?
pYYBAGNYzYGAU9d2AABo8tF3JyI211.png
Azure IoT Central JSON 參數(shù)命令有效負(fù)載格式配置
?
poYBAGNYzYSAAF1pAAD3g5sIhtI854.png
Azure IoT Central JSON 參數(shù)命令啟動
?

交貨確認(rèn)

為了處理消息傳遞確認(rèn),將包含消息LockToken 的相關(guān)標(biāo)識符添加到下行鏈路有效負(fù)載中的相關(guān) ID 。

唯一需要的消息屬性是 LoRaWAN 端口號,確認(rèn)、隊列、優(yōu)先級和有效負(fù)載字段是可選的。

如果端口號屬性或任何其他屬性不正確,則調(diào)用DeviceClient.RejectAsync ,這會從設(shè)備隊列中刪除消息并向服務(wù)器指示無法處理該消息。

使用存儲在 TTI CorrelationID 中的 Azure 令牌跟蹤消息傳遞確認(rèn)過程。

poYBAGNYzYqAB7aoAAGKv_1lXT4884.jpg
下行鏈路消息中的 Azure CorrelationID
?

未確認(rèn)的消息

TTI 連接器調(diào)用CompleteAsync方法(使用 TTI CorrelationIDs 列表中的 LockToken),該方法在調(diào)用“排隊”Azure 函數(shù)時從Azure IoT 中心設(shè)備隊列中刪除消息。

pYYBAGNYzY2AaoBaAAEdwWzyzks123.png
Azure IoT Explorer 云到設(shè)備消息,未確認(rèn)傳遞
?
pYYBAGNYzZCADiOJAAIJADSaxSg885.png
Azure 應(yīng)用程序洞察未確認(rèn)的下行鏈路消息事件
?
poYBAGNYzZSAfEl9AAJw7Sbdq8g862.png
Azure 應(yīng)用洞察未確認(rèn)的下行消息事件序列
?
pYYBAGNYzZqAHrpRAAGZVxPMYzc267.png
未確認(rèn)的下行消息傳遞
?

確認(rèn)消息

pYYBAGNYzZyAOVy0AADsk8NCb8o393.png
Azure IoT Explorer Cloud 到設(shè)備的消息并確認(rèn)交付
?
pYYBAGNYzZ-AE2YEAAGZR6h0tRg845.png
未確認(rèn)的下行消息傳遞
?
poYBAGNYzaOAOOdkAAGstxc21LY531.png
Azure 應(yīng)用程序洞察未確認(rèn)的下行鏈路消息事件
?

如果消息傳遞成功(調(diào)用 Ack 函數(shù)),則會調(diào)用CompleteAsync方法(使用 TTI CorrelationIDs 列表中的 LockToken)從 Azure IoT 中心設(shè)備隊列中刪除消息。

poYBAGNYzaeAfnW2AAEVcxoSN3o859.png
已確認(rèn)的下行鏈路消息傳遞
?
pYYBAGNYzaqAB3A3AAHqlE3PxbA750.png
Azure 應(yīng)用洞察未確認(rèn)的下行消息 Ack 事件
?

如果消息傳遞失?。ㄕ{(diào)用失敗的函數(shù)),則調(diào)用AbandonAsync方法(使用 TTI CorrelationIDs 列表中的 LockToken)將下行鏈路消息放回 Azure IoT 中心設(shè)備隊列。

pYYBAGNYza2AJgZgAAH7SNS55Jo876.png
Azure 應(yīng)用洞察確認(rèn)下行消息事件序列 Nack 成功
?

如果消息傳遞不成功(調(diào)用 Nack 函數(shù)),則會調(diào)用RejectAsync方法(使用 CorrelationIDs 列表中的 LockToken),該方法從設(shè)備隊列中刪除消息并向服務(wù)器指示無法處理該消息。

poYBAGNYzbCADQ5nAAH9Rh0ucGA513.png
Azure 應(yīng)用洞察確認(rèn)下行消息事件序列 Nack 超時
?

消息 Failed( AbandonAsync )、Ack( CompleteAsync ) 和 Nack( RejectAsync ) 的處理方式需要進(jìn)行更多測試,以確認(rèn)我對 TTI 確認(rèn)消息傳遞順序的理解。

謹(jǐn)防

當(dāng)Azure IoT 中心下行鏈路消息超時并重新發(fā)送時,將確認(rèn)消息與不定期發(fā)送上行鏈路消息的設(shè)備一起使用可能會導(dǎo)致奇怪的問題。

執(zhí)行摘要

這個項目已經(jīng)付出了一年多的努力。我學(xué)到了很多關(guān)于LoRaWAN以及The Things Industries如何運作的知識

有時是一些愚蠢的事情,比如拖慢進(jìn)度的錯字

pYYBAGNYzbOAQzYoAAA1Z5TFv_s523.png
我生命中失去了 1 小時 DevEUI Typo
?

在我確信它已準(zhǔn)備好投入生產(chǎn)之前,我對該軟件進(jìn)行了一個月的浸泡測試,但有幾次我達(dá)到了我的Azure 支出限制,這禁用了我的所有服務(wù),因此我不得不重新運行浸泡測試。

如果您有任何問題或反饋給我留言,我在Twitter上,我的博客上有更多關(guān)于我的“學(xué)習(xí)之旅”的詳細(xì)信息。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學(xué)會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費