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)場(chǎng)網(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ā)庫(kù)的另一個(gè)項(xiàng)目,以啟用與RAK811 LPWAN 模塊( PoC 的Wisduino外形)的LoRaWAN連接。
在新西蘭有兩個(gè)全國(guó)性的網(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)測(cè)試了個(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)長(zhǎng)整數(shù),因此生成的代碼存在一些問題。
TTN 文檔指出,在成功解碼上行鏈路消息時(shí)填充了 payload_fields 屬性。TTN 有一個(gè)內(nèi)置的Cayenne 低功耗有效負(fù)載 (LPP)消息解碼器,RAK7200 Wisnode 軌道燈部分支持該解碼器(還提供具有增強(qiáng)功能的定制解碼器/編碼器)。
我在我的Seeeduino LoRaWAN 設(shè)備上使用了第 3 方庫(kù)(來自 Electronic Cats 的 CayenneLPP 庫(kù))來對(duì)包含溫度和濕度信息的有效載荷進(jìn)行編碼。
超越自己
解壓payload_fields 屬性讓我有些痛苦。我嘗試了許多不同的方法,但都失敗了。經(jīng)過大量實(shí)驗(yàn)后,我發(fā)現(xiàn)使用C# 對(duì)象是最簡(jiǎn)單的方法(盡管該字段的后處理更為復(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庫(kù)連接到Azure IoT Hub或Azure IoT Central (使用 DPS-KeyGen 生成連接字符串)并上傳了我可以在Azure IoT explorer中看到的遙測(cè)消息。
使用 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)行處理。
這段代碼故意保持盡可能小和盡可能簡(jiǎ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ā)和測(cè)試而言,能夠預(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)行壓力和浸泡測(cè)試。
我的物聯(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ì)稱密鑰證明的組注冊(cè)
Azure IoT 中心集成
盡管可以在Azure IoT 中心預(yù)配單個(gè)設(shè)備,但Azure 設(shè)備預(yù)配服務(wù) (DPS)是首選方法。
scopeID 和主要/次要注冊(cè)密鑰在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)的貨物溫度和濕度,因此可以將遙測(cè)事件路由到正確的應(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) 組注冊(cè)對(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 注冊(cè)組對(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)過一些測(cè)試后,我將其替換為 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ù)顯著減少
“市場(chǎng)結(jié)構(gòu)”圖
哎呀我把自己畫到一個(gè)角落里
在對(duì)上行鏈路消息的處理進(jìn)行擴(kuò)展和浸泡測(cè)試后,我意識(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) 59次下載
- 物聯(lián)網(wǎng)到底是什么物聯(lián)網(wǎng)的簡(jiǎn)介和三項(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)品的射頻測(cè)試資料概述 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) 989次閱讀
- 物聯(lián)網(wǎng)網(wǎng)關(guān)的類型和功能 1804次閱讀
- 使用工業(yè)物聯(lián)網(wǎng)網(wǎng)關(guān)的八大好處 3380次閱讀
- 一文詳談物聯(lián)網(wǎng)網(wǎng)關(guān)的工作模式和作用 2944次閱讀
- 物聯(lián)網(wǎng)的三大核心是哪些 3w次閱讀
- 面向服務(wù)的物聯(lián)網(wǎng)網(wǎng)關(guān)是怎樣設(shè)計(jì)的 727次閱讀
- 物聯(lián)網(wǎng)智能網(wǎng)關(guān)的應(yīng)用場(chǎng)景 3316次閱讀
- 什么是工業(yè)物聯(lián)網(wǎng)?物聯(lián)網(wǎng)和工業(yè)物聯(lián)網(wǎng)的區(qū)別 1.1w次閱讀
- 物聯(lián)網(wǎng)的工作原理及發(fā)展的展望和如何應(yīng)用物聯(lián)網(wǎng)的資料概述 4690次閱讀
- 物聯(lián)網(wǎng)的介紹和物聯(lián)網(wǎng)發(fā)展的未來展望詳細(xì)概述 1.2w次閱讀
- 物聯(lián)網(wǎng)是什么?你了解它的原理嗎 3552次閱讀
- 物聯(lián)網(wǎng)無線模塊:什么是組合模塊 1.8w次閱讀
- 農(nóng)業(yè)物聯(lián)網(wǎng)的意義_農(nóng)業(yè)物聯(lián)網(wǎng)的功能_農(nóng)業(yè)物聯(lián)網(wǎng)的應(yīng)用 9619次閱讀
- 基于STM32F417的物聯(lián)網(wǎng)嵌入式網(wǎng)關(guān)的設(shè)計(jì) 1w次閱讀
- 什么是霧計(jì)算?與物聯(lián)網(wǎng)有何關(guān)系? 1473次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 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)用手冊(cè)
- 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電氣工程師手冊(cè)免費(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語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多