網(wǎng)關(guān)設(shè)備使得云服務(wù)與物聯(lián)網(wǎng) (IoT) 終端設(shè)備的關(guān)系變得更加緊密,加快了處理速度、減少了延時(shí)并能保持高利用率。但是,在設(shè)計(jì)網(wǎng)關(guān)時(shí),開(kāi)發(fā)人員很快就發(fā)現(xiàn),他們需要厘清一系列容易混淆的硬件和軟件選項(xiàng),才能將各種物聯(lián)網(wǎng)外設(shè)連接到云。
現(xiàn)在,使用來(lái)自 Mozilla 的 Raspberry Pi 和開(kāi)源軟件,開(kāi)發(fā)人員可以快速、高效地實(shí)現(xiàn)基于新興物聯(lián)網(wǎng)標(biāo)準(zhǔn)的網(wǎng)關(guān)。
為指導(dǎo)設(shè)計(jì)人員了解整個(gè)過(guò)程,本文首先簡(jiǎn)要回顧網(wǎng)關(guān)在物聯(lián)網(wǎng)網(wǎng)絡(luò)中的作用、關(guān)鍵要求及相關(guān)實(shí)現(xiàn)挑戰(zhàn),然后介紹標(biāo)準(zhǔn)的作用,重點(diǎn)說(shuō)明萬(wàn)維網(wǎng)聯(lián)盟 (World Wide Web Consortium) 描述物聯(lián)網(wǎng)中實(shí)體的方法。
最后重點(diǎn)向開(kāi)發(fā)人員介紹如何使用 Mozilla 的 Raspberry Pi 3、無(wú)線插件和開(kāi)源軟件快速部署網(wǎng)關(guān)。同時(shí)本文將特別介紹開(kāi)發(fā)人員如何使用 Mozilla 軟件框架輕松擴(kuò)展其網(wǎng)關(guān),以支持任意數(shù)量的外設(shè)插件,從而滿足特定連接要求。
對(duì)網(wǎng)關(guān)的需求日益增長(zhǎng)
在 Web 上,盡管瀏覽器平臺(tái)與服務(wù)器平臺(tái)的底層硬件和軟件存在很大差異,但通過(guò)使用標(biāo)準(zhǔn)協(xié)議,用戶能夠利用多種瀏覽器來(lái)聯(lián)系多種多樣的服務(wù)器。物聯(lián)網(wǎng)雖然是基于上述許多相同的標(biāo)準(zhǔn)協(xié)議而建立,但在實(shí)現(xiàn)可持續(xù)驅(qū)動(dòng) Web 的互操作性方面,面臨的挑戰(zhàn)要大得多。正如 Web 瀏覽器在請(qǐng)求標(biāo)頭中標(biāo)識(shí)自身身份及其功能一樣,物聯(lián)網(wǎng)設(shè)備也需要標(biāo)準(zhǔn)方法來(lái)標(biāo)識(shí)其功能及其所提供數(shù)據(jù)的性質(zhì)。
然而,在典型的多層物聯(lián)網(wǎng)架構(gòu)中,實(shí)體的數(shù)量和類(lèi)型可能非常復(fù)雜,特別是在包含傳感器和致動(dòng)器的最低層。為了滿足這些設(shè)備的不同連接需求,網(wǎng)關(guān)設(shè)備已成為首選解決方案。憑借其支持多種有線和無(wú)線連接選項(xiàng)的能力,網(wǎng)關(guān)為復(fù)雜的物聯(lián)網(wǎng)系統(tǒng)提供關(guān)鍵服務(wù)。物聯(lián)網(wǎng)開(kāi)發(fā)人員不僅利用網(wǎng)關(guān)多種多樣的連接能力,而且還通過(guò)網(wǎng)關(guān)在復(fù)雜的物聯(lián)網(wǎng)中提供更多實(shí)質(zhì)性的服務(wù),因此網(wǎng)關(guān)的作用得以顯著擴(kuò)展。
網(wǎng)關(guān)的角色
網(wǎng)關(guān)設(shè)備最簡(jiǎn)單的作用是緩沖高吞吐量云連接與成百上千的物聯(lián)網(wǎng)外圍設(shè)備之間的通信,這些外圍設(shè)備產(chǎn)生的數(shù)據(jù)流速率彼此各不相同,甚至相差多個(gè)數(shù)量級(jí)。如果無(wú)法連接到云,網(wǎng)關(guān)就可以向物聯(lián)網(wǎng)設(shè)備提供本地版本的云服務(wù)。相反,如果物聯(lián)網(wǎng)設(shè)備出于任何原因離線,網(wǎng)關(guān)可以向云提供虛擬物聯(lián)網(wǎng)設(shè)備,以模擬相應(yīng)實(shí)體物聯(lián)網(wǎng)設(shè)備的基本功能和已知最新狀態(tài)。在任何一種情況下,即使連接中斷,較高級(jí)別的物聯(lián)網(wǎng)應(yīng)用也能夠繼續(xù)正常運(yùn)行。
物聯(lián)網(wǎng)邊緣設(shè)備通常不受物聯(lián)網(wǎng)外圍設(shè)備的實(shí)時(shí)和功率限制,因此可以利用高性能處理器架構(gòu),提供接近物聯(lián)網(wǎng)數(shù)據(jù)源的強(qiáng)大處理能力。物聯(lián)網(wǎng)專家通過(guò)將更加先進(jìn)的云服務(wù)甚至是高級(jí)機(jī)器學(xué)習(xí)算法遷移到這些設(shè)備上,進(jìn)一步利用這種本地處理能力,為本地進(jìn)程提供更快的響應(yīng)循環(huán),或者減少上游流向云應(yīng)用的數(shù)據(jù)流的大小。
Amazon Web Services IoT、IBM Watson IoT 和 Microsoft Azure IoT 等商用物聯(lián)網(wǎng)平臺(tái)在其端到端服務(wù)產(chǎn)品中都提供自己的專有接口和協(xié)議(圖 1)。然而,由于諸多原因,包括擔(dān)心被套牢或基于更廣泛的需求,物聯(lián)網(wǎng)應(yīng)用開(kāi)發(fā)人員繼續(xù)尋找能夠簡(jiǎn)化更多不同物聯(lián)網(wǎng)設(shè)備和服務(wù)之應(yīng)用的解決方案。
圖 1:諸如 Amazon Web Services (AWS) IoT 之類(lèi)商用物聯(lián)網(wǎng)平臺(tái)使用低層互聯(lián)網(wǎng)標(biāo)準(zhǔn)來(lái)支持物聯(lián)網(wǎng)應(yīng)用的每一層,但需要針對(duì)業(yè)界缺乏物聯(lián)網(wǎng)特定標(biāo)準(zhǔn)的現(xiàn)狀提供自己的解決方案。(圖片來(lái)源:Amazon Web Services)
盡管其他機(jī)構(gòu)也在定義標(biāo)準(zhǔn)物聯(lián)網(wǎng)架構(gòu)的元素,但萬(wàn)維網(wǎng)聯(lián)盟 (W3C) 是定義物聯(lián)網(wǎng)標(biāo)準(zhǔn)的領(lǐng)導(dǎo)者。在其不斷演進(jìn)的規(guī)范中,W3C 萬(wàn)維物聯(lián)網(wǎng) (WoT) 確立了一些關(guān)鍵接口,允許單個(gè)設(shè)備與網(wǎng)關(guān)、云服務(wù)器、Web 客戶端甚至另一個(gè)物聯(lián)網(wǎng)設(shè)備進(jìn)行通信(圖 2)。
圖 2:W3C 通過(guò)一系列標(biāo)準(zhǔn)接口和數(shù)據(jù)模型來(lái)實(shí)現(xiàn)萬(wàn)維物聯(lián)網(wǎng)的互操作性,例如封裝有每個(gè)設(shè)備信息的事物描述(三角形)。(圖片來(lái)源:W3C)
雖然 W3C 架構(gòu)的細(xì)節(jié)超出本文范疇,但有幾個(gè)關(guān)鍵定義值得一提。最重要的其中一項(xiàng)是事物,它同時(shí)包含了一個(gè)物理設(shè)備及其元數(shù)據(jù)(或事物描述),在圖 2 中用小三角形表示。
事物描述不僅列出名稱和人類(lèi)可讀描述等基本元數(shù)據(jù),還可以憑借各種功能直接支持應(yīng)用,包括數(shù)據(jù)分類(lèi)、驗(yàn)證以及其他實(shí)體可以調(diào)用的特定端點(diǎn)以執(zhí)行該特定事物的獨(dú)特功能。
使用標(biāo)準(zhǔn)通信方法(圖 2 中的“WoT 綁定模板 (WoT Binding Templates)”),同一物聯(lián)網(wǎng)應(yīng)用中的不同參與者只需要使用新設(shè)備或網(wǎng)關(guān)的事物描述,即可了解其使用方法及數(shù)據(jù)功能。借助其數(shù)據(jù)模型和應(yīng)用編程接口 (API) 定義,Mozilla 為開(kāi)發(fā)人員提供了用于構(gòu)建此類(lèi)互操作網(wǎng)關(guān)的首批可用框架之一。
Mozilla 網(wǎng)關(guān)
作為其 W3C WoT 工作的一部分,Mozilla 的事物網(wǎng)關(guān)規(guī)范包括針對(duì)事物描述的數(shù)據(jù)模型、相關(guān)事物類(lèi)型,以及使用 WebSockets 或基本 REST 機(jī)制的簡(jiǎn)單 API。Mozilla 的事物描述指定了基本元數(shù)據(jù),包括名稱、類(lèi)型、描述以及各種屬性,例如連網(wǎng) LED 燈的“開(kāi)”和“亮度”(列表 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 網(wǎng)關(guān)事物描述使用標(biāo)準(zhǔn) JSON 格式來(lái)描述事物及其功能。(代碼來(lái)源:Mozilla)
事物描述中的其他條目包含用于封裝不同操作(例如讓燈變暗)的更復(fù)雜對(duì)象。通過(guò)訪問(wèn)事物描述中的“漸淡”操作,網(wǎng)關(guān)或其他實(shí)體就可以找到函數(shù)的入口點(diǎn),以根據(jù)指定屬性(例如漸淡級(jí)別和持續(xù)時(shí)間)執(zhí)行“漸淡”操作。因此,事物描述為識(shí)別物聯(lián)網(wǎng)設(shè)備和執(zhí)行其設(shè)計(jì)的各種操作提供了一種標(biāo)準(zhǔn)方法。
為了與事物進(jìn)行交互,開(kāi)發(fā)人員可以使用熟悉的 REST Web 協(xié)議來(lái)讀取 (GET) 或?qū)懭耄≒UT 或 POST)事物描述中定義的事物屬性。正常的 REST 響應(yīng)進(jìn)而將為請(qǐng)求的數(shù)據(jù)提供讀取或?qū)懭氩僮鞯臓顟B(tài)。
例如,要在兩秒鐘的過(guò)渡時(shí)間內(nèi)使 LED 亮度變淡至 50%,開(kāi)發(fā)人員會(huì)將相應(yīng)的 JSON 主體 POST 到關(guān)聯(lián)的漸淡端點(diǎn),進(jìn)而接收 201 響應(yīng)和 JSON 主體,確認(rèn)設(shè)備排隊(duì)的請(qǐng)求操作的屬性和狀態(tài)(列表 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:使用事物描述中指定的入口點(diǎn)和屬性,開(kāi)發(fā)人員可以 POST 漸淡請(qǐng)求,進(jìn)而接收 201 響應(yīng)和 JSON 主體,確認(rèn)請(qǐng)求操作的屬性和狀態(tài)。(代碼來(lái)源:Mozilla)
盡管 Mozilla 說(shuō)明文檔提供了其數(shù)據(jù)模型和 API 的詳細(xì)描述,但要將此理論轉(zhuǎn)化為實(shí)際運(yùn)作的網(wǎng)關(guān),開(kāi)發(fā)人員仍要編寫(xiě)大量軟件包。幸運(yùn)的是,Mozilla 通過(guò)提供設(shè)計(jì)用于 Raspberry Pi 系列的完整實(shí)現(xiàn)方案,解決了其規(guī)范在理論方面的問(wèn)題。
網(wǎng)關(guān)平臺(tái)
如前所述,網(wǎng)關(guān)因其基本角色是提供多種連接選項(xiàng)以混合和匹配不同的物聯(lián)網(wǎng)外圍設(shè)備,所以網(wǎng)關(guān)設(shè)計(jì)要求相對(duì)較簡(jiǎn)單。事實(shí)上,Raspberry Pi 系列為構(gòu)建此類(lèi)設(shè)備提供了有效的硬件基礎(chǔ)。最新版本的 Raspberry Pi 3 Model B+ 是該系列的升級(jí)版,同時(shí)顯著提高了有線和無(wú)線網(wǎng)絡(luò)的吞吐量。此外,此開(kāi)發(fā)板基于四核 Arm? Cortex?-A53 應(yīng)用處理器,為探索前文提到的復(fù)雜本地處理功能提供一個(gè)有效平臺(tái)。
無(wú)需完全使用 Raspberry Pi 3 Model B+ 的處理潛能,開(kāi)發(fā)人員即可以探索基本的網(wǎng)關(guān)功能,只需在開(kāi)發(fā)板上加載一個(gè)可從 Mozilla github 資料庫(kù)免費(fèi)下載的固件映像即可。該固件實(shí)現(xiàn)了一個(gè)基本網(wǎng)關(guān),開(kāi)發(fā)人員只需將無(wú)線控制器適配器插入 Raspberry Pi 3 開(kāi)發(fā)板的標(biāo)準(zhǔn) USB 連接器,即可連接無(wú)線外設(shè)。Mozilla 軟件實(shí)現(xiàn)針對(duì)各種無(wú)線 USB 適配器(例如 Sigma Designs ACC-UZB3-U-STA Z-Wave USB 控制器)提供開(kāi)箱即用的支持。
開(kāi)發(fā)板接通電源后,軟件將引導(dǎo)開(kāi)發(fā)人員完成一些基本的初始化步驟,然后立即開(kāi)始在本地?zé)o線環(huán)境中搜索設(shè)備。通過(guò)使用 Web 接口,開(kāi)發(fā)人員只需點(diǎn)擊按鈕即可將發(fā)現(xiàn)的設(shè)備連接到網(wǎng)關(guān)(圖 3A),然后查看或修改相應(yīng)事物描述中定義的設(shè)備屬性(圖 3B)。
圖 3:Mozilla 的事物網(wǎng)關(guān)軟件可以讓用戶將事物輕松連接到其網(wǎng)關(guān) (A),并根據(jù)其在事物描述中定義的功能,與各個(gè)設(shè)備進(jìn)行交互 (B)。(圖片來(lái)源:Mozilla)
使用生態(tài)系統(tǒng)硬件增強(qiáng)網(wǎng)關(guān)
除了易于實(shí)現(xiàn)基本網(wǎng)關(guān)外,Raspberry Pi 生態(tài)系統(tǒng)與 Mozilla 開(kāi)源代碼的組合還為開(kāi)發(fā)人員提供了用于擴(kuò)展基本設(shè)計(jì)的綜合環(huán)境。開(kāi)發(fā)人員可以下載設(shè)計(jì)的完整源代碼包,以更好地了解網(wǎng)關(guān)操作,更改特定操作特性,甚至創(chuàng)建定制網(wǎng)關(guān)應(yīng)用。該源代碼旨在運(yùn)行于 Node.js 之上,展示了復(fù)雜網(wǎng)關(guān)軟件應(yīng)用的每個(gè)組件的關(guān)鍵設(shè)計(jì)模式。
使用此開(kāi)發(fā)平臺(tái),開(kāi)發(fā)人員可以借助大量可用的硬件擴(kuò)展板,快速創(chuàng)建能夠支持廣泛連接選項(xiàng)的網(wǎng)關(guān)。例如,將 Pimoroni PIM213 Automation HAT 添加到 Raspberry Pi 開(kāi)發(fā)板上,使網(wǎng)關(guān)能夠支持工業(yè)環(huán)境中所需的高電壓和高電流有線連接。
對(duì)于互聯(lián)網(wǎng)連接欠佳或無(wú)連接的操作環(huán)境,通過(guò)將 Raspberry Pi 開(kāi)發(fā)板連接到配備 NimbleLink NL-SW-LTE-SVZM20 LTE CAT M1 模塊和 Taoglas Limited 4G LTE 天線的 NimbeLink NL-AB-RPI 開(kāi)發(fā)板,為網(wǎng)關(guān)添加窄帶 LTE 連接。
開(kāi)發(fā)人員的選擇不只局限于 Raspberry Pi 插件。他們還可以將不同的適配器卡插入其 Raspberry Pi 開(kāi)發(fā)板,以訪問(wèn)其他接口標(biāo)準(zhǔn)所提供的一系列插件。例如,使用 Seeed Technology 103990079 Arduino 適配器,Digi International XK-WDM 開(kāi)發(fā)板可以將 Digi 的高能效 DigiMesh 網(wǎng)狀網(wǎng)絡(luò)連接功能添加到網(wǎng)關(guān)。對(duì)于需要標(biāo)準(zhǔn)網(wǎng)狀連接選項(xiàng)的應(yīng)用,可插入 Digi 的 XKB2-Z7T-WZM Zigbee 開(kāi)發(fā)板。
同樣,開(kāi)發(fā)人員可以使用 Seeed 103010002 Grove 適配器,借助 Seeed 113060006 Grove LoRaWAN 開(kāi)發(fā)板來(lái)支持 LoRaWAN 網(wǎng)狀網(wǎng)絡(luò),或借助 Seeed 113060000 Grove 射頻鏈路插件來(lái)支持?jǐn)U展覆蓋范圍的 Sub-GHz 網(wǎng)絡(luò)。
利用豐富的可用插件,開(kāi)發(fā)人員可以快速擴(kuò)充其硬件平臺(tái),提供多種連接選項(xiàng)。在軟件方面,Mozilla 項(xiàng)目為實(shí)現(xiàn)支持新硬件所需的軟件接口提供了一套明確的要求和示例。
如要為事物網(wǎng)關(guān)構(gòu)建插件,開(kāi)發(fā)人員需要為三類(lèi)實(shí)體提供代碼:設(shè)備、屬性和適配器。設(shè)備代碼通常會(huì)利用特定設(shè)備或設(shè)備類(lèi)型所特有的屬性和方法(功能)擴(kuò)展基本 Device 類(lèi)。
例如,設(shè)備模塊可能包含與基本設(shè)備不同變體相關(guān)聯(lián)的獨(dú)立類(lèi) – 例如基本 LED 一個(gè)類(lèi)和智能燈泡另一個(gè)類(lèi)。Property(屬性)模塊將擴(kuò)展基本 Property 類(lèi),以提供一組屬性類(lèi)別,其中包含更新特定設(shè)備屬性的方法,例如 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:在創(chuàng)建自己的網(wǎng)關(guān)插件軟件包時(shí),開(kāi)發(fā)人員可以找出關(guān)鍵設(shè)計(jì)模式,例如在此代碼片段中,展示了基于 Python 的針對(duì) TP-Link 智能設(shè)備的事物網(wǎng)關(guān)插件中使用的 Property 類(lèi)。(代碼來(lái)源:Mozilla)
最后,適配器模塊將擴(kuò)展基本 Adapter 類(lèi),以提供類(lèi)來(lái)初始化設(shè)備通信通道、支持網(wǎng)絡(luò)調(diào)試以及為其他設(shè)備或通信特定功能提供支持。
雖然主要網(wǎng)關(guān)包是針對(duì) Node.js 采用 Javascript 實(shí)現(xiàn)的,但該平臺(tái)也正式支持 Python。不過(guò),從概念上講,開(kāi)發(fā)人員可以用任何合適的語(yǔ)言構(gòu)建兼容的插件。例如,已有開(kāi)發(fā)人員使用 Rust(Mozilla 類(lèi)似 C++ 的存儲(chǔ)器安全語(yǔ)言)創(chuàng)建了插件。對(duì)于能夠使用現(xiàn)有 Node.js 后端的開(kāi)發(fā)人員而言,這種相對(duì)簡(jiǎn)單的插件方式提供了一種強(qiáng)大的功能,可快速創(chuàng)建能夠通過(guò)不同連接選項(xiàng)連接各種物聯(lián)網(wǎng)外圍設(shè)備的網(wǎng)關(guān)。
總結(jié)
對(duì)于物聯(lián)網(wǎng)網(wǎng)關(guān),開(kāi)發(fā)人員面臨的挑戰(zhàn)是確保不同物聯(lián)網(wǎng)設(shè)備、網(wǎng)關(guān)和服務(wù)器之間的互操作性。盡管相應(yīng)標(biāo)準(zhǔn)機(jī)構(gòu)正在快速制定物聯(lián)網(wǎng)互操作性的合適規(guī)范,但開(kāi)發(fā)人員在很大程度上需要將規(guī)范轉(zhuǎn)化為可行的解決方案。
如本文所述,通過(guò)將 Mozilla 的事物網(wǎng)關(guān)軟件與 Raspberry Pi 3 結(jié)合使用,開(kāi)發(fā)人員可以快速、高效地評(píng)估網(wǎng)關(guān)應(yīng)用,并輕松擴(kuò)展網(wǎng)關(guān)以支持不同的連接選項(xiàng)。
-
適配器
+關(guān)注
關(guān)注
8文章
1917瀏覽量
67863 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2902文章
44129瀏覽量
370471 -
無(wú)線
+關(guān)注
關(guān)注
31文章
5419瀏覽量
172997
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論