網關設備使得云服務與物聯網 (IoT) 終端設備的關系變得更加緊密,加快了處理速度、減少了延時并能保持高利用率。但是,在設計網關時,開發人員很快就發現,他們需要厘清一系列容易混淆的硬件和軟件選項,才能將各種物聯網外設連接到云。
現在,使用來自 Mozilla 的 Raspberry Pi 和開源軟件,開發人員可以快速、高效地實現基于新興物聯網標準的網關。
為指導設計人員了解整個過程,本文首先簡要回顧網關在物聯網網絡中的作用、關鍵要求及相關實現挑戰,然后介紹標準的作用,重點說明萬維網聯盟 (World Wide Web Consortium) 描述物聯網中實體的方法。
最后重點向開發人員介紹如何使用 Mozilla 的 Raspberry Pi 3、無線插件和開源軟件快速部署網關。同時本文將特別介紹開發人員如何使用 Mozilla 軟件框架輕松擴展其網關,以支持任意數量的外設插件,從而滿足特定連接要求。
對網關的需求日益增長
在 Web 上,盡管瀏覽器平臺與服務器平臺的底層硬件和軟件存在很大差異,但通過使用標準協議,用戶能夠利用多種瀏覽器來聯系多種多樣的服務器。物聯網雖然是基于上述許多相同的標準協議而建立,但在實現可持續驅動 Web 的互操作性方面,面臨的挑戰要大得多。正如 Web 瀏覽器在請求標頭中標識自身身份及其功能一樣,物聯網設備也需要標準方法來標識其功能及其所提供數據的性質。
然而,在典型的多層物聯網架構中,實體的數量和類型可能非常復雜,特別是在包含傳感器和致動器的最低層。為了滿足這些設備的不同連接需求,網關設備已成為首選解決方案。憑借其支持多種有線和無線連接選項的能力,網關為復雜的物聯網系統提供關鍵服務。物聯網開發人員不僅利用網關多種多樣的連接能力,而且還通過網關在復雜的物聯網中提供更多實質性的服務,因此網關的作用得以顯著擴展。
網關的角色
網關設備最簡單的作用是緩沖高吞吐量云連接與成百上千的物聯網外圍設備之間的通信,這些外圍設備產生的數據流速率彼此各不相同,甚至相差多個數量級。如果無法連接到云,網關就可以向物聯網設備提供本地版本的云服務。相反,如果物聯網設備出于任何原因離線,網關可以向云提供虛擬物聯網設備,以模擬相應實體物聯網設備的基本功能和已知最新狀態。在任何一種情況下,即使連接中斷,較高級別的物聯網應用也能夠繼續正常運行。
物聯網邊緣設備通常不受物聯網外圍設備的實時和功率限制,因此可以利用高性能處理器架構,提供接近物聯網數據源的強大處理能力。物聯網專家通過將更加先進的云服務甚至是高級機器學習算法遷移到這些設備上,進一步利用這種本地處理能力,為本地進程提供更快的響應循環,或者減少上游流向云應用的數據流的大小。
Amazon Web Services IoT、IBM Watson IoT 和 Microsoft Azure IoT 等商用物聯網平臺在其端到端服務產品中都提供自己的專有接口和協議(圖 1)。然而,由于諸多原因,包括擔心被套牢或基于更廣泛的需求,物聯網應用開發人員繼續尋找能夠簡化更多不同物聯網設備和服務之應用的解決方案。
圖 1:諸如 Amazon Web Services (AWS) IoT 之類商用物聯網平臺使用低層互聯網標準來支持物聯網應用的每一層,但需要針對業界缺乏物聯網特定標準的現狀提供自己的解決方案。(圖片來源:Amazon Web Services)
盡管其他機構也在定義標準物聯網架構的元素,但萬維網聯盟 (W3C) 是定義物聯網標準的領導者。在其不斷演進的規范中,W3C 萬維物聯網 (WoT) 確立了一些關鍵接口,允許單個設備與網關、云服務器、Web 客戶端甚至另一個物聯網設備進行通信(圖 2)。
圖 2:W3C 通過一系列標準接口和數據模型來實現萬維物聯網的互操作性,例如封裝有每個設備信息的事物描述(三角形)。(圖片來源:W3C)
雖然 W3C 架構的細節超出本文范疇,但有幾個關鍵定義值得一提。最重要的其中一項是事物,它同時包含了一個物理設備及其元數據(或事物描述),在圖 2 中用小三角形表示。
事物描述不僅列出名稱和人類可讀描述等基本元數據,還可以憑借各種功能直接支持應用,包括數據分類、驗證以及其他實體可以調用的特定端點以執行該特定事物的獨特功能。
使用標準通信方法(圖 2 中的“WoT 綁定模板 (WoT Binding Templates)”),同一物聯網應用中的不同參與者只需要使用新設備或網關的事物描述,即可了解其使用方法及數據功能。借助其數據模型和應用編程接口 (API) 定義,Mozilla 為開發人員提供了用于構建此類互操作網關的首批可用框架之一。
Mozilla 網關
作為其 W3C WoT 工作的一部分,Mozilla 的事物網關規范包括針對事物描述的數據模型、相關事物類型,以及使用 WebSockets 或基本 REST 機制的簡單 API。Mozilla 的事物描述指定了基本元數據,包括名稱、類型、描述以及各種屬性,例如連網 LED 燈的“開”和“亮度”(列表 1)。
副本
{
"name":"My Lamp",
"type": "thing",
"description": "A web connected lamp",
"properties": {
“on": {
"type": "boolean",
"description": “Whether the lamp is turned on",
"href": "/things/lamp/properties/on"
},
"level" : {
"type": "number",
"description": "The level of light from 0-100",
"minimum" : 0,
"maximum" : 100,
"href": "/things/lamp/properties/level"
}
},
"actions": {
"fade": {
"description": "Fade the lamp to a given level",
"input": {
"type": "object",
"properties": {
"level": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"duration": {
"type": "number",
"unit": "milliseconds"
}
}
},
"href": "/things/lamp/actions/fade"
}
},
"events": {
"overheated": {
"type": "number",
"unit": "celsius",
"description": "The lamp has exceeded its safe operating temperature",
"href": "/things/lamp/events/overheated"
}
},
"links": [
{
"rel": "properties",
"href": "/things/lamp/properties"
},
{
"rel": "actions",
"href": "/things/lamp/actions"
},
{
"rel": "events",
"href": "/things/lamp/events"
},
{
"rel": "alternate",
"href": "wss://mywebthingserver.com/things/lamp"
},
{
"rel": "alternate",
"mediaType": "text/html",
"href": "/things/lamp"
}
]
}
列表 1:Mozilla 網關事物描述使用標準 JSON 格式來描述事物及其功能。(代碼來源:Mozilla)
事物描述中的其他條目包含用于封裝不同操作(例如讓燈變暗)的更復雜對象。通過訪問事物描述中的“漸淡”操作,網關或其他實體就可以找到函數的入口點,以根據指定屬性(例如漸淡級別和持續時間)執行“漸淡”操作。因此,事物描述為識別物聯網設備和執行其設計的各種操作提供了一種標準方法。
為了與事物進行交互,開發人員可以使用熟悉的 REST Web 協議來讀取 (GET) 或寫入(PUT 或 POST)事物描述中定義的事物屬性。正常的 REST 響應進而將為請求的數據提供讀取或寫入操作的狀態。
例如,要在兩秒鐘的過渡時間內使 LED 亮度變淡至 50%,開發人員會將相應的 JSON 主體 POST 到關聯的漸淡端點,進而接收 201 響應和 JSON 主體,確認設備排隊的請求操作的屬性和狀態(列表 2)。
副本
POST https://mythingserver.com/things/lamp/actions/
Accept: application/json
{
"fade": {
"input": {
"level": 50,
"duration": 2000
}
}
}
201 Created
{
"fade": {
"input": {
"level": 50,
"duration": 2000
},
"href": "/things/lamp/actions/fade/123e4567-e89b-12d3-a456-426655"
"status": "pending"
}
}
列表 2:使用事物描述中指定的入口點和屬性,開發人員可以 POST 漸淡請求,進而接收 201 響應和 JSON 主體,確認請求操作的屬性和狀態。(代碼來源:Mozilla)
盡管 Mozilla 說明文檔提供了其數據模型和 API 的詳細描述,但要將此理論轉化為實際運作的網關,開發人員仍要編寫大量軟件包。幸運的是,Mozilla 通過提供設計用于 Raspberry Pi 系列的完整實現方案,解決了其規范在理論方面的問題。
網關平臺
如前所述,網關因其基本角色是提供多種連接選項以混合和匹配不同的物聯網外圍設備,所以網關設計要求相對較簡單。事實上,Raspberry Pi 系列為構建此類設備提供了有效的硬件基礎。最新版本的 Raspberry Pi 3 Model B+ 是該系列的升級版,同時顯著提高了有線和無線網絡的吞吐量。此外,此開發板基于四核 Arm? Cortex?-A53 應用處理器,為探索前文提到的復雜本地處理功能提供一個有效平臺。
無需完全使用 Raspberry Pi 3 Model B+ 的處理潛能,開發人員即可以探索基本的網關功能,只需在開發板上加載一個可從 Mozilla github 資料庫免費下載的固件映像即可。該固件實現了一個基本網關,開發人員只需將無線控制器適配器插入 Raspberry Pi 3 開發板的標準 USB 連接器,即可連接無線外設。Mozilla 軟件實現針對各種無線 USB 適配器(例如 Sigma Designs ACC-UZB3-U-STA Z-Wave USB 控制器)提供開箱即用的支持。
開發板接通電源后,軟件將引導開發人員完成一些基本的初始化步驟,然后立即開始在本地無線環境中搜索設備。通過使用 Web 接口,開發人員只需點擊按鈕即可將發現的設備連接到網關(圖 3A),然后查看或修改相應事物描述中定義的設備屬性(圖 3B)。
圖 3:Mozilla 的事物網關軟件可以讓用戶將事物輕松連接到其網關 (A),并根據其在事物描述中定義的功能,與各個設備進行交互 (B)。(圖片來源:Mozilla)
使用生態系統硬件增強網關
除了易于實現基本網關外,Raspberry Pi 生態系統與 Mozilla 開源代碼的組合還為開發人員提供了用于擴展基本設計的綜合環境。開發人員可以下載設計的完整源代碼包,以更好地了解網關操作,更改特定操作特性,甚至創建定制網關應用。該源代碼旨在運行于 Node.js 之上,展示了復雜網關軟件應用的每個組件的關鍵設計模式。
使用此開發平臺,開發人員可以借助大量可用的硬件擴展板,快速創建能夠支持廣泛連接選項的網關。例如,將 Pimoroni PIM213 Automation HAT 添加到 Raspberry Pi 開發板上,使網關能夠支持工業環境中所需的高電壓和高電流有線連接。
對于互聯網連接欠佳或無連接的操作環境,通過將 Raspberry Pi 開發板連接到配備 NimbleLink NL-SW-LTE-SVZM20 LTE CAT M1 模塊和 Taoglas Limited 4G LTE 天線的 NimbeLink NL-AB-RPI 開發板,為網關添加窄帶 LTE 連接。
開發人員的選擇不只局限于 Raspberry Pi 插件。他們還可以將不同的適配器卡插入其 Raspberry Pi 開發板,以訪問其他接口標準所提供的一系列插件。例如,使用 Seeed Technology 103990079 Arduino 適配器,Digi International XK-WDM 開發板可以將 Digi 的高能效 DigiMesh 網狀網絡連接功能添加到網關。對于需要標準網狀連接選項的應用,可插入 Digi 的 XKB2-Z7T-WZM Zigbee 開發板。
同樣,開發人員可以使用 Seeed 103010002 Grove 適配器,借助 Seeed 113060006 Grove LoRaWAN 開發板來支持 LoRaWAN 網狀網絡,或借助 Seeed 113060000 Grove 射頻鏈路插件來支持擴展覆蓋范圍的 Sub-GHz 網絡。
利用豐富的可用插件,開發人員可以快速擴充其硬件平臺,提供多種連接選項。在軟件方面,Mozilla 項目為實現支持新硬件所需的軟件接口提供了一套明確的要求和示例。
如要為事物網關構建插件,開發人員需要為三類實體提供代碼:設備、屬性和適配器。設備代碼通常會利用特定設備或設備類型所特有的屬性和方法(功能)擴展基本 Device 類。
例如,設備模塊可能包含與基本設備不同變體相關聯的獨立類 – 例如基本 LED 一個類和智能燈泡另一個類。Property(屬性)模塊將擴展基本 Property 類,以提供一組屬性類別,其中包含更新特定設備屬性的方法,例如 LED 的顏色或亮度(列表 3)。
副本
class TPLinkProperty(Property):
"""TP-Link property type."""
def __init__(self, device, name, description, value):
"""
Initialize the object.
device -- the Device this property belongs to
name -- name of the property
description -- description of the property, as a dictionary
value -- current value of this property
"""
Property.__init__(self, device, name, description)
self.set_cached_value(value)
.
.
.
class TPLinkBulbProperty(TPLinkProperty):
"""Property type for TP-Link smart bulbs."""
def set_value(self, value):
"""
Set the current value of the property.
value -- the value to set
"""
try:
if self.name == 'on':
self.device.hs100_dev.state = 'ON' if value else 'OFF'
elif self.name == 'color':
self.device.hs100_dev.hsv = rgb_to_hsv(value)
elif self.name == 'level':
self.device.hs100_dev.brightness = value
elif self.name == 'colorTemperature':
value = max(value, self.description['min'])
value = min(value, self.description['max'])
self.device.hs100_dev.color_temp = int(value)
else:
return
except SmartDeviceException:
return
self.set_cached_value(value)
self.device.notify_property_changed(self)
.
.
.
列表 3:在創建自己的網關插件軟件包時,開發人員可以找出關鍵設計模式,例如在此代碼片段中,展示了基于 Python 的針對 TP-Link 智能設備的事物網關插件中使用的 Property 類。(代碼來源:Mozilla)
最后,適配器模塊將擴展基本 Adapter 類,以提供類來初始化設備通信通道、支持網絡調試以及為其他設備或通信特定功能提供支持。
雖然主要網關包是針對 Node.js 采用 Javascript 實現的,但該平臺也正式支持 Python。不過,從概念上講,開發人員可以用任何合適的語言構建兼容的插件。例如,已有開發人員使用 Rust(Mozilla 類似 C++ 的存儲器安全語言)創建了插件。對于能夠使用現有 Node.js 后端的開發人員而言,這種相對簡單的插件方式提供了一種強大的功能,可快速創建能夠通過不同連接選項連接各種物聯網外圍設備的網關。
總結
對于物聯網網關,開發人員面臨的挑戰是確保不同物聯網設備、網關和服務器之間的互操作性。盡管相應標準機構正在快速制定物聯網互操作性的合適規范,但開發人員在很大程度上需要將規范轉化為可行的解決方案。
如本文所述,通過將 Mozilla 的事物網關軟件與 Raspberry Pi 3 結合使用,開發人員可以快速、高效地評估網關應用,并輕松擴展網關以支持不同的連接選項。
-
適配器
+關注
關注
8文章
1960瀏覽量
68100 -
物聯網
+關注
關注
2910文章
44778瀏覽量
374717 -
無線
+關注
關注
31文章
5463瀏覽量
173500
發布評論請先 登錄
相關推薦
評論