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

我使用JSON2Csharp和從 TTN 網(wǎng)站下載的示例上行鏈路有效負(fù)載來(lái)生成一些C#類的初始版本,以對(duì)上行鏈路消息進(jìn)行反序列化。
由于 JSON2CSharp 無(wú)法確定數(shù)字字段是整數(shù)還是無(wú)符號(hào)長(zhǎng)整數(shù),因此生成的代碼存在一些問(wèn)題。
TTN 文檔指出,在成功解碼上行鏈路消息時(shí)填充了 payload_fields 屬性。TTN 有一個(gè)內(nèi)置的Cayenne 低功耗有效負(fù)載 (LPP)消息解碼器,RAK7200 Wisnode 軌道燈部分支持該解碼器(還提供具有增強(qiáng)功能的定制解碼器/編碼器)。
我在我的Seeeduino LoRaWAN 設(shè)備上使用了第 3 方庫(kù)(來(lái)自 Electronic Cats 的 CayenneLPP 庫(kù))來(lái)對(duì)包含溫度和濕度信息的有效載荷進(jìn)行編碼。
超越自己
解壓payload_fields 屬性讓我有些痛苦。我嘗試了許多不同的方法,但都失敗了。經(jīng)過(guò)大量實(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)用程序中添加一些代碼來(lái)解壓縮具有嵌套字段的 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)的某些部分由于故障或入站流量突然激增而無(wú)法使用。
用于接收物聯(lián)網(wǎng) (TTN) HTTP 集成 JSON 消息的代碼使用了 Azure 函數(shù) HTTPTrigger。(使用APIKey 保護(hù)),然后將它們放入Azure 存儲(chǔ)隊(duì)列以進(jìn)行處理。
這段代碼故意保持盡可能小和盡可能簡(jiǎn)單,這樣就不會(huì)出錯(cuò)。經(jīng)過(guò)一些實(shí)驗(yàn),只用了不到兩打 C# 行就創(chuàng)建了一個(gè)安全端點(diǎn)來(lái)接收上行鏈路消息并將它們放入Azure 存儲(chǔ)隊(duì)列。
通過(guò)存儲(chǔ)來(lái)自 TTN 的原始上行鏈路事件 JSON,應(yīng)用程序可以在無(wú)法反序列化時(shí)恢復(fù)(消息格式已更改或生成類問(wèn)題)當(dāng)隊(duì)列處理器無(wú)法處理上行鏈路事件消息時(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ì)于開(kāi)發(fā)和測(cè)試而言,能夠預(yù)配單個(gè)設(shè)備確實(shí)很有用,盡管對(duì)于Azure IoT Central來(lái)說(shuō)這并不容易(尤其是在棄用 DPS-KeyGen 的情況下)。通過(guò)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)用程序來(lái)進(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ù)可以安全地訪問(wèn)它們。

對(duì)于更復(fù)雜的部署,可以使用基于 applicationID(或 applicationID + 端口號(hào))的不同 GroupEnrollment 密鑰來(lái)配置物聯(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密鑰來(lái)配置物聯(lián)網(wǎng) (TTN)設(shè)備。
在處理來(lái)自 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 來(lái)最小化網(wǎng)絡(luò)負(fù)載的大小。

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

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

TTN LPP 解碼器生成的位置有效負(fù)載的格式與 Azure IoT Central 所需的格式不同。我添加了臨時(shí)代碼(“一種具有成本效益的加速部署修改”又名黑客)來(lái)格式化 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è)儀表板來(lái)查看我的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“訪問(wèn)策略”中,我配置了“應(yīng)用程序訪問(wèn)策略”,因此我的 Azure TTNAzureIoTHubMessageV2Processor 函數(shù)標(biāo)識(shí)可以檢索機(jī)密。
去大或回家
在我最初的實(shí)現(xiàn)中,我使用ConcurrentDictionary來(lái)存儲(chǔ)Azure IoT Hub連接,以減少對(duì)設(shè)備預(yù)配服務(wù) (DPS) 的調(diào)用次數(shù)。經(jīng)過(guò)一些測(cè)試后,我將其替換為 a. Net ObjectCache位于System.Runtime.Caching命名空間中。

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

因此,經(jīng)過(guò)一番研究,我決定啟用高級(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)用程序只需要接收來(lái)自 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)常見(jiàn)通信協(xié)議
- 基于LORA+4G網(wǎng)關(guān)的油田物聯(lián)網(wǎng)系統(tǒng) 11次下載
- 基于物聯(lián)網(wǎng)平臺(tái)的智能家居中心控制系統(tǒng) 63次下載
- 物聯(lián)網(wǎng)到底是什么物聯(lián)網(wǎng)的簡(jiǎn)介和三項(xiàng)關(guān)鍵技術(shù)詳細(xì)說(shuō)明 16次下載
- 物聯(lián)網(wǎng)的體系架構(gòu)的詳細(xì)資料概述 16次下載
- JavaScript與物聯(lián)網(wǎng)設(shè)備有什么關(guān)系
- 物聯(lián)網(wǎng)無(wú)線連接技術(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次下載
- 探討移動(dòng)通信技術(shù)與物聯(lián)網(wǎng)的融合 86次下載
- 物聯(lián)網(wǎng)應(yīng)用與展望 115次下載
- 物聯(lián)網(wǎng)的體系架構(gòu) 2.5k次閱讀
- 物聯(lián)網(wǎng)網(wǎng)關(guān)的類型和功能 3.5k次閱讀
- 使用工業(yè)物聯(lián)網(wǎng)網(wǎng)關(guān)的八大好處 3.9k次閱讀
- 一文詳談物聯(lián)網(wǎng)網(wǎng)關(guān)的工作模式和作用 3.4k次閱讀
- 物聯(lián)網(wǎng)的三大核心是哪些 3.2w次閱讀
- 面向服務(wù)的物聯(lián)網(wǎng)網(wǎng)關(guān)是怎樣設(shè)計(jì)的 1k次閱讀
- 物聯(lián)網(wǎng)智能網(wǎng)關(guān)的應(yīng)用場(chǎng)景 4.4k次閱讀
- 什么是工業(yè)物聯(lián)網(wǎng)?物聯(lián)網(wǎng)和工業(yè)物聯(lián)網(wǎng)的區(qū)別 1.3w次閱讀
- 物聯(lián)網(wǎng)的工作原理及發(fā)展的展望和如何應(yīng)用物聯(lián)網(wǎng)的資料概述 5.6k次閱讀
- 物聯(lián)網(wǎng)的介紹和物聯(lián)網(wǎng)發(fā)展的未來(lái)展望詳細(xì)概述 1.3w次閱讀
- 物聯(lián)網(wǎng)是什么?你了解它的原理嗎 4k次閱讀
- 物聯(lián)網(wǎng)無(wú)線模塊:什么是組合模塊 1.9w次閱讀
- 工業(yè)物聯(lián)網(wǎng)的意義_工業(yè)物聯(lián)網(wǎng)前景分析 1.6w次閱讀
- 基于STM32F417的物聯(lián)網(wǎng)嵌入式網(wǎng)關(guān)的設(shè)計(jì) 1.1w次閱讀
- 什么是霧計(jì)算?與物聯(lián)網(wǎng)有何關(guān)系? 1.8k次閱讀
下載排行
本周
- 1新一代網(wǎng)絡(luò)可視化(NPB 2.0)
- 3.40 MB | 1次下載 | 免費(fèi)
- 2冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 1次下載 | 10 積分
- 3MDD品牌三極管MMBT3906數(shù)據(jù)手冊(cè)
- 2.33 MB | 次下載 | 免費(fèi)
- 4MDD品牌三極管S9012數(shù)據(jù)手冊(cè)
- 2.62 MB | 次下載 | 免費(fèi)
- 5LAT1218 如何選擇和設(shè)置外部晶體適配 BlueNRG-X
- 0.60 MB | 次下載 | 3 積分
- 6LAT1216 Blue NRG-1/2 系列芯片 Flash 操作與 BLE 事件的互斥處理
- 0.89 MB | 次下載 | 3 積分
- 7收音環(huán)繞擴(kuò)音機(jī) AVR-1507手冊(cè)
- 2.50 MB | 次下載 | 免費(fèi)
- 8MS1000TA 超聲波測(cè)量模擬前端芯片技術(shù)手冊(cè)
- 0.60 MB | 次下載 | 免費(fèi)
本月
- 1愛(ài)華AIWA HS-J202維修手冊(cè)
- 3.34 MB | 37次下載 | 免費(fèi)
- 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊(cè)
- 1.63 MB | 23次下載 | 免費(fèi)
- 3NB-IoT芯片廠商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
- 4UWB653Pro USB口測(cè)距通信定位模塊規(guī)格書
- 838.47 KB | 5次下載 | 免費(fèi)
- 5蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
- 0.04 MB | 4次下載 | 1 積分
- 6蘇泊爾DCL6909(即CHK-S009)單芯片電磁爐原理圖資料
- 0.08 MB | 2次下載 | 1 積分
- 7100W準(zhǔn)諧振反激式恒流電源電路圖資料
- 0.09 MB | 2次下載 | 1 積分
- 8FS8025B USB的PD和OC快充協(xié)議電壓誘騙控制器IC技術(shù)手冊(cè)
- 1.81 MB | 1次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191439次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183353次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論