The Things Network V2 Azure物聯(lián)網(wǎng)中心和物聯(lián)網(wǎng)中心網(wǎng)關(guān)
資料介紹
描述
背景
在客戶放棄概念證明( PoC )項目后,我在我桌子下面的盒子。
在過去幾年中,我構(gòu)建了一系列Windows 10 IoT Core現(xiàn)場網(wǎng)關(guān)應用程序,用于將LoRa設(shè)備連接到Azure IoT 中心、Azure IoT Central和Adafruit.IO 。這些運行良好,但現(xiàn)在我需要一個基于Microsoft Azure 云的解決方案,將連接到物聯(lián)網(wǎng) (TTN)的LoRaWAN設(shè)備連接到在Microsoft Azure中運行的應用程序。
我一直在為 .NET nanoFramework和GHI Electronics TinyCLR設(shè)備開發(fā)庫的另一個項目,以啟用與RAK811 LPWAN 模塊( PoC 的Wisduino外形)的LoRaWAN連接。
在新西蘭有兩個全國性的網(wǎng)絡(luò)(Spark IoT 、KotahiNet ),但我一直想探索 TTN 和The Things Industries的功能,它們看起來有足夠的診斷功能來滿足我的目的。
我假設(shè)如果您正在閱讀這個項目故事,那么您熟悉為 Microsoft Azure 開發(fā)應用程序,尤其是 IoT 服務。TTN 應用程序和設(shè)備的配置在其他幾個Hackster.IO項目中已經(jīng)詳細介紹過,這里不再贅述。
這個項目是我博客上一系列帖子的總結(jié),我在其中更詳細地介紹了解決方案的構(gòu)建。
在一開始的時候
我最初連接了RAK WisGate 開發(fā)者網(wǎng)關(guān)并配置了 RAK7200 Track Lite 設(shè)備。在 TTN 應用程序設(shè)備數(shù)據(jù)選項卡中,我可以看到從設(shè)備接收到上行鏈路消息,并且大部分有效負載都被解碼,這是一個好的開始。
建立聯(lián)系
我配置了我的 Arduino IDE,以便我可以訪問 Seeeduino、LoRaWAN 示例,然后編譯并將它們下載到我的設(shè)備。我使用本地網(wǎng)關(guān)測試了個性化激活 (ABP) 和空中激活 (OTAA)示例的修改版本,以確認我的設(shè)備配置良好。在我記得我需要打開我的Seeeduino Grove I2C 溫度和濕度傳感器連接器的電源之后,設(shè)備代碼第二次工作了。
反序列化 TTN 消息
我為我的一個 TTN 應用程序配置了TTN HTTP集成,因此它將上行鏈路消息發(fā)布到帶有 HTTP 觸發(fā)端點的 Azure 函數(shù)。

我使用JSON2Csharp和從 TTN 網(wǎng)站下載的示例上行鏈路有效負載來生成一些C#類的初始版本,以對上行鏈路消息進行反序列化。
由于 JSON2CSharp 無法確定數(shù)字字段是整數(shù)還是無符號長整數(shù),因此生成的代碼存在一些問題。
TTN 文檔指出,在成功解碼上行鏈路消息時填充了 payload_fields 屬性。TTN 有一個內(nèi)置的Cayenne 低功耗有效負載 (LPP)消息解碼器,RAK7200 Wisnode 軌道燈部分支持該解碼器(還提供具有增強功能的定制解碼器/編碼器)。
我在我的Seeeduino LoRaWAN 設(shè)備上使用了第 3 方庫(來自 Electronic Cats 的 CayenneLPP 庫)來對包含溫度和濕度信息的有效載荷進行編碼。
超越自己
解壓payload_fields 屬性讓我有些痛苦。我嘗試了許多不同的方法,但都失敗了。經(jīng)過大量實驗后,我發(fā)現(xiàn)使用C# 對象是最簡單的方法(盡管該字段的后處理更為復雜)。
public class PayloadV4
{
public string app_id { get; set; }
public string dev_id { get; set; }
public string hardware_serial { get; set; }
public int port { get; set; }
public int counter { get; set; }
public bool is_retry { get; set; }
public string payload_raw { get; set; }
//public JsonObject payload_fields { get; set; }
//public JObject payload_fields { get; set; }
//public JToken payload_fields { get; set; }
//public JContainer payload_fields { get; set; }
//public dynamic payload_fields { get; set; }
public Object payload_fields { get; set; }
public MetadataV4 metadata { get; set; }
public string downlink_url { get; set; }
}
我還必須在我的 PoC 應用程序中添加一些代碼來解壓縮具有嵌套字段的 RAK Wisnode 7200 Tracker 加速度計、陀螺儀和位置值。
然后,我使用Microsoft.Azure.Devices.Client庫連接到Azure IoT Hub或Azure IoT Central (使用 DPS-KeyGen 生成連接字符串)并上傳了我可以在Azure IoT explorer中看到的遙測消息。

使用 Azure 存儲隊列處理消息和失敗
對于我的HTTP 集成,我需要可靠地將上行鏈路消息轉(zhuǎn)發(fā)到Azure IoT 中心或Azure IoT Central ,因此我使用Azure 存儲隊列在我的Azure Function HTTPTrigger端點和消息處理器之間提供彈性緩沖區(qū)。
我的解決方案需要強大且不會丟失任何消息,即使系統(tǒng)的某些部分由于故障或入站流量突然激增而無法使用。
用于接收物聯(lián)網(wǎng) (TTN) HTTP 集成 JSON 消息的代碼使用了 Azure 函數(shù) HTTPTrigger。(使用APIKey 保護),然后將它們放入Azure 存儲隊列以進行處理。
這段代碼故意保持盡可能小和盡可能簡單,這樣就不會出錯。經(jīng)過一些實驗,只用了不到兩打 C# 行就創(chuàng)建了一個安全端點來接收上行鏈路消息并將它們放入Azure 存儲隊列。
通過存儲來自 TTN 的原始上行鏈路事件 JSON,應用程序可以在無法反序列化時恢復(消息格式已更改或生成類問題)當隊列處理器無法處理上行鏈路事件消息時(引發(fā)異常)重試幾次后,它將最終進入有毒消息隊列(以防故障是暫時的)。
上行鏈路消息隊列處理器使用Azure 函數(shù)隊列觸發(fā)器從隊列中提取消息,并在需要時預配設(shè)備,檢索 Azure IoT 中心/Azure IoT 中央連接字符串或使用緩存的 DeviceClient。
“自動”供應
對于開發(fā)和測試而言,能夠預配單個設(shè)備確實很有用,盡管對于Azure IoT Central來說這并不容易(尤其是在棄用 DPS-KeyGen 的情況下)。通過Azure IoT Hub設(shè)備連接字符串在門戶中可用,這很方便,但可擴展性不是很好。

Azure IoT 中心與 Azure IoT Central集成,并且Azure IoT Central強制使用設(shè)備預配服務 (DPS)。DPS 旨在支持管理 1000 臺設(shè)備,這些設(shè)備需要一些自定義應用程序來進行壓力和浸泡測試。
我的物聯(lián)網(wǎng)HTTP 集成(TTN)旨在支持許多設(shè)備并與Azure IoT Central集成。DPS 支持使用可信平臺模塊 (TPM)進行設(shè)備認證,但這種方法不適用于我的應用程序。我的 TTN 應用程序集成使用具有對稱密鑰證明的組注冊

Azure IoT 中心集成
盡管可以在Azure IoT 中心預配單個設(shè)備,但Azure 設(shè)備預配服務 (DPS)是首選方法。

scopeID 和主要/次要注冊密鑰在Azure Key Vault中配置,Azure QueueTrigger 函數(shù)可以安全地訪問它們。

對于更復雜的部署,可以使用基于 applicationID(或 applicationID + 端口號)的不同 GroupEnrollment 密鑰來配置物聯(lián)網(wǎng) (TTN)設(shè)備。這方面的一個例子是卡車上的跟蹤設(shè)備報告位置數(shù)據(jù),其中一個端口號和另一個端口號的貨物溫度和濕度,因此可以將遙測事件路由到正確的應用程序。
然后,在處理設(shè)備的第一條上行鏈路消息時,它會在 DPS 和 Azure IoT Hub 中“自動”創(chuàng)建。

Azure IoT 中心集成
物聯(lián)網(wǎng) (TTN) HTTP 集成上行鏈路消息必須進行配置,然后進行后處理,以便 Azure IoT Central 顯示它們。
第一步是從 Administration\Device 連接復制 IDScope 和一個主/輔助密鑰,并將它們存儲在Azure Key Vault中。

對于更復雜的部署,可以根據(jù)啟動配置的第一個上行鏈路消息中的 applicationid(或 applicationID + 端口號)使用不同的GroupEnrollment密鑰來配置物聯(lián)網(wǎng) (TTN)設(shè)備。
在處理來自 TTN 設(shè)備的第一條上行鏈路消息后不久,它將在“未關(guān)聯(lián)設(shè)備”選項卡中列出。

然后可以將設(shè)備與Azure IoT Central Device Template關(guān)聯(lián)。

設(shè)備模板提供上行消息有效載荷字段到設(shè)備屬性的映射。在此示例中,有效載荷字段已由TTN 應用集成 Cayenne 低功耗協(xié)議 (LPP)解碼器生成。許多LoRaWAN設(shè)備使用 LPP 來最小化網(wǎng)絡(luò)負載的大小。

一旦設(shè)備與模板相關(guān)聯(lián),就可以配置用戶友好的設(shè)備名稱等。

Azure IoT Central 具有映射功能,可用于顯示設(shè)備的位置。

TTN LPP 解碼器生成的位置有效負載的格式與 Azure IoT Central 所需的格式不同。我添加了臨時代碼(“一種具有成本效益的加速部署修改”又名黑客)來格式化 TelemetryEvent 有效負載,以便顯示它。
if (token.First is JValue)
{
// Temporary dirty hack for Azure IoT Central compatibility
if (token.Parent is JObject possibleGpsProperty)
{
if (possibleGpsProperty.Path.StartsWith("GPS", StringComparison.OrdinalIgnoreCase))
{
if (string.Compare(property.Name, "Latitude", true) == 0)
{
jobject.Add("lat", property.Value);
}
if (string.Compare(property.Name, "Longitude", true) == 0)
{
jobject.Add("lon", property.Value);
}
if (string.Compare(property.Name, "Altitude", true) == 0)
{
jobject.Add("alt", property.Value);
}
}
}
jobject.Add(property.Name, property.Value);
}
在配置設(shè)備模板、將一些設(shè)備與模板關(guān)聯(lián)并修改每個設(shè)備的屬性后,我可以創(chuàng)建一個儀表板來查看我的Seeeduino LoRaWAN 設(shè)備返回的溫度和濕度信息。

保守秘密
應用程序集成配置包含敏感信息,例如設(shè)備預配服務 (DPS) 組注冊對稱密鑰和Azure IoT 中心連接字符串。
Azure Key Vault旨在保護連接字符串等敏感信息,因此我在資源組中添加了一個。

我編寫了一個包裝器,它根據(jù)上行鏈路消息有效負載中的物聯(lián)網(wǎng) (TTN)應用程序標識符和端口信息解析配置設(shè)置。resolve 方法首先查找 applicationId 和 port 的配置(由 – 分隔),然后是 applicationId,最后返回到默認值。
此功能用于 AzureIoTHub 連接字符串、DPS IDScopes、DPS 注冊組對稱密鑰,也用于格式化緩存密鑰。
Azure 函數(shù)配置設(shè)置(如 Azure 存儲連接字符串)的值被替換為對 Azure Key Vault 中機密的引用。

在 Azure Key Vault“訪問策略”中,我配置了“應用程序訪問策略”,因此我的 Azure TTNAzureIoTHubMessageV2Processor 函數(shù)標識可以檢索機密。
去大或回家
在我最初的實現(xiàn)中,我使用ConcurrentDictionary來存儲Azure IoT Hub連接,以減少對設(shè)備預配服務 (DPS) 的調(diào)用次數(shù)。經(jīng)過一些測試后,我將其替換為 a. Net ObjectCache位于System.Runtime.Caching命名空間中。

我使用緩存來存儲Azure IoT Hub連接以減少對設(shè)備預配服務 (DPS)的調(diào)用次數(shù),但連接數(shù)仍然太高。

因此,經(jīng)過一番研究,我決定啟用高級消息隊列協(xié)議(AMQP)連接池。
return DeviceClient.Create(result.AssignedHub,
authentication,
new ITransportSettings[]
{
new AmqpTransportSettings(TransportType.Amqp_Tcp_Only)
{
PrefetchCount = 0,
AmqpConnectionPoolSettings = new AmqpConnectionPoolSettings()
{
Pooling = true,
}
}
}
);
在此之后,連接數(shù)顯著減少

“市場結(jié)構(gòu)”圖

哎呀我把自己畫到一個角落里
在對上行鏈路消息的處理進行擴展和浸泡測試后,我意識到我所做的一些設(shè)計和實現(xiàn)選擇意味著處理下行鏈路消息并不容易。
如果您的應用程序只需要接收來自 LoRaWAN 設(shè)備的消息,此解決方案將是理想的。
為了支持下行消息,我很可能必須轉(zhuǎn)換到MQTT 數(shù)據(jù) API并刪除一些高級配置選項。
這將需要一段時間,所以如果您有興趣,請關(guān)注我的博客,我將在其中發(fā)布我的進展。
- Azure?物聯(lián)網(wǎng)的門鎖示例
- DSGW-030 多協(xié)議可編程網(wǎng)關(guān) 快速指南
- 用于安全物聯(lián)網(wǎng)的Azure Sphere和Azure云服務
- Azure物聯(lián)網(wǎng)農(nóng)業(yè)
- 【涂鴉物聯(lián)網(wǎng)足跡】物聯(lián)網(wǎng)常見通信協(xié)議
- 基于LORA+4G網(wǎng)關(guān)的油田物聯(lián)網(wǎng)系統(tǒng) 11次下載
- 基于物聯(lián)網(wǎng)平臺的智能家居中心控制系統(tǒng) 61次下載
- 物聯(lián)網(wǎng)到底是什么物聯(lián)網(wǎng)的簡介和三項關(guān)鍵技術(shù)詳細說明 16次下載
- 物聯(lián)網(wǎng)的體系架構(gòu)的詳細資料概述 16次下載
- JavaScript與物聯(lián)網(wǎng)設(shè)備有什么關(guān)系
- 物聯(lián)網(wǎng)無線連接技術(shù)是什么?物聯(lián)網(wǎng)產(chǎn)品的射頻測試資料概述 26次下載
- 物聯(lián)網(wǎng)架構(gòu)及EPC物聯(lián)網(wǎng) 10次下載
- 物聯(lián)網(wǎng)的含義及GSMA Association與物聯(lián)網(wǎng) 7次下載
- 基于ZigBee技術(shù)的物聯(lián)網(wǎng)網(wǎng)關(guān)設(shè)計趙慧然 5次下載
- 物聯(lián)網(wǎng)應用與展望 115次下載
- 物聯(lián)網(wǎng)的體系架構(gòu) 1438次閱讀
- 物聯(lián)網(wǎng)網(wǎng)關(guān)的類型和功能 2350次閱讀
- 物聯(lián)網(wǎng)是什么和物聯(lián)網(wǎng)基本架構(gòu) 6087次閱讀
- 使用工業(yè)物聯(lián)網(wǎng)網(wǎng)關(guān)的八大好處 3479次閱讀
- 一文詳談物聯(lián)網(wǎng)網(wǎng)關(guān)的工作模式和作用 3059次閱讀
- 物聯(lián)網(wǎng)的三大核心是哪些 3.1w次閱讀
- 面向服務的物聯(lián)網(wǎng)網(wǎng)關(guān)是怎樣設(shè)計的 770次閱讀
- 物聯(lián)網(wǎng)智能網(wǎng)關(guān)的應用場景 3584次閱讀
- 什么是工業(yè)物聯(lián)網(wǎng)?物聯(lián)網(wǎng)和工業(yè)物聯(lián)網(wǎng)的區(qū)別 1.2w次閱讀
- 物聯(lián)網(wǎng)的工作原理及發(fā)展的展望和如何應用物聯(lián)網(wǎng)的資料概述 4817次閱讀
- 物聯(lián)網(wǎng)的介紹和物聯(lián)網(wǎng)發(fā)展的未來展望詳細概述 1.2w次閱讀
- 物聯(lián)網(wǎng)是什么?你了解它的原理嗎 3603次閱讀
- 物聯(lián)網(wǎng)無線模塊:什么是組合模塊 1.8w次閱讀
- 基于STM32F417的物聯(lián)網(wǎng)嵌入式網(wǎng)關(guān)的設(shè)計 1w次閱讀
- 什么是霧計算?與物聯(lián)網(wǎng)有何關(guān)系? 1521次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論