電子發(fā)燒友App

硬聲App

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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 | 次下載 | 免費(fèi)

資料介紹

描述

早在 2020 年 11 月,我就發(fā)布了我的 The Things Network V2 Azure IoT Hubs & IoT Central Gateway。該項(xiàng)目是關(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)支持的連接。

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

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

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

該應(yīng)用程序更容易調(diào)試,因?yàn)槲铱梢栽谧烂嫔线\(yùn)行它,并且更容易配置,因?yàn)槲覍⑴渲棉D(zhuǎn)移回appsettings.json文件(我可能會(huì)重新考慮放棄Azure Key Vault支持的決定)。

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

我還添加了對(duì)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)建另一個(gè)TTI 連接器,該連接器將 Azure 存儲(chǔ)隊(duì)列用于 C2D 和 D2C 消息。

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

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

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

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

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

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

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

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

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

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

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

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

pYYBAGNYzOqAFz3XAAEZr8FBBVM795.png
Azure 門戶功能列表
?

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

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

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

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

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

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

可以使用appsettings.json文件配置應(yīng)用程序(對(duì)桌面開發(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)識(shí)符區(qū)分大小寫

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

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

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

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

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

使用TTI App Key保護(hù)下行鏈路消息處理

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

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

poYBAGNYzQOAIj9rAACIlpf8IHU855.png
使用 Azure Function 端點(diǎn)作為基本 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è)備必須手動(dòng)或通過Azure IoT Hub REST API進(jìn)行預(yù)配我已經(jīng)試用了一個(gè)Azure 邏輯應(yīng)用程序,它管理設(shè)備配置并且可以在操作失敗時(shí)穩(wěn)健地處理所需的補(bǔ)償事務(wù)。

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

如果同時(shí)配置了Azure IoT 中心/Azure IoT 中心設(shè)備預(yù)配 (DPS) 支持,則 TTI 連接器應(yīng)用程序?qū)⒉粫?huì)啟動(dòng)。

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

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

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

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

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

如果Azure IoT 中心/ Azure IoT 中心設(shè)備預(yù)配 (DPS)支持兩者/兩者均未配置,則 TTI 連接器應(yīng)用程序?qū)⒉粫?huì)啟動(dòng)。

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

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

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

在我的測(cè)試環(huán)境中,我使用均勻加權(quán)分布,當(dāng)我預(yù)置 1000 臺(tái)設(shè)備時(shí),它們分布在我的五個(gè)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ù)配單個(gè)設(shè)備的方法) 。TTI 連接器實(shí)現(xiàn)還支持用于“自動(dòng)”設(shè)備預(yù)配的Azure IoT Central 數(shù)字孿生定義語言( DTDL V2 )。

如果同時(shí)配置了Azure IoT 中心/Azure IoT 中心設(shè)備預(yù)配 (DPS) 支持,則 TTI 連接器應(yīng)用程序?qū)⒉粫?huì)啟動(dòng)。

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

第一步是配置Azure IoT Central 注冊(cè)組(確?!白詣?dòng)連接該組中的設(shè)備”為“零接觸”配置)并將IDScope組注冊(cè)密鑰復(fù)制到 TTI 連接器配置

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

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

pYYBAGNYzSCAE2kLAAD3d8M7ht8562.png
RAK3172 設(shè)備模板
?
poYBAGNYzSOAFwe9AAEJdHLmI6g896.png
RAK3172 設(shè)備注冊(cè)組
?
pYYBAGNYzSWAdJ9TAADgw9ydDE4677.png
將設(shè)備組與組注冊(cè)配置關(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顯示遙測(cè)數(shù)據(jù)并向我的傳感器節(jié)點(diǎn)發(fā)送消息。

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

如果有效負(fù)載已被有效負(fù)載格式化程序解碼,則將對(duì)其進(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 消息傳遞僅需要端口號(hào)、TTI 確認(rèn)、隊(duì)列和優(yōu)先級(jí)(如果未提供)使用默認(rèn)值。

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

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

如果負(fù)載無效,則假定JSONBase64編碼的(需要額外驗(yàn)證)并復(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)過廣泛測(cè)試),以便它可以被Azure IoT Central攝取.

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

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

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

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

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

pYYBAGNYzUKATIRkAADNm0nMt3I672.png
?

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

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

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

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

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

我的集成僅使用離線排隊(duì)命令,因?yàn)橄⑼ǔ2粫?huì)立即傳遞到傳感器節(jié)點(diǎn),特別是如果傳感器節(jié)點(diǎn)僅每半小時(shí)/小時(shí)/天發(fā)送一條消息。

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

每個(gè) TTI 應(yīng)用程序都有零個(gè)或多個(gè)Azure IoT Central 命令配置,這些配置指定 LoRaWAN 端口號(hào),以及可選的有效負(fù)載、已確認(rèn)的 TTI 下行鏈路消息、優(yōu)先級(jí)和隊(duì)列設(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ù)命令啟動(dòng)
?

枚舉參數(shù)

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

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

單值參數(shù)

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

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

JSON 參數(shù)

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

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

交貨確認(rèn)

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

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

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

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

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

未確認(rèn)的消息

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

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ù)),則會(huì)調(diào)用CompleteAsync方法(使用 TTI CorrelationIDs 列表中的 LockToken)從 Azure IoT 中心設(shè)備隊(duì)列中刪除消息。

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

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

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

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

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

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

謹(jǐn)防

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

執(zhí)行摘要

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

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

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

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

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


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

評(píng)論

查看更多

下載排行

本周

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

本月

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

總榜

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