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

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

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

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

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

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

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

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

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

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

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

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

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

TTN LPP 解碼器生成的位置有效負(fù)載的格式與 Azure IoT Central 所需的格式不同。我添加了臨時(shí)代碼(“一種具有成本效益的加速部署修改”又名黑客)來格式化 TelemetryEvent 有效負(fù)載,以便顯示它。
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)并修改每個(gè)設(shè)備的屬性后,我可以創(chuàng)建一個(gè)儀表板來查看我的Seeeduino LoRaWAN 設(shè)備返回的溫度和濕度信息。

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

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

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

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

因此,經(jīng)過一番研究,我決定啟用高級(jí)消息隊(duì)列協(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)”圖

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