24小時(shí)聯(lián)系電話(huà):18217114652、13661815404
中文
- 您當前的位置:
- 首頁(yè)>
- 電子資訊>
- 技術(shù)專(zhuān)題>
- 了解物聯(lián)網(wǎng)解決方案的...
技術(shù)專(zhuān)題
了解物聯(lián)網(wǎng)解決方案的藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)
了解物聯(lián)網(wǎng)解決方案的藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)
根據研究機構 ABI 的數據,藍牙技術(shù)在所有物聯(lián)網(wǎng)設備中的占比為 38%,而 Wi-Fi 和蜂窩分別為 32% 和 19%。由于它們具有不同的優(yōu)勢和劣勢,因此它們不一定是相互排斥的技術(shù),并且通常在物聯(lián)網(wǎng)解決方案中一起使用。
但有個(gè)問(wèn)題!藍牙和 TCP/IP 不兼容。(物聯(lián)網(wǎng)意味著(zhù)使用 TCP/IP 等協(xié)議。)
可以看出,TCP/IP 僅跨越藍牙堆棧的兩層。其他協(xié)議也用于堆棧 TCP/IP 和 Friends(圖 1)。但是,藍牙 LE 不能直接與 TCP/IP 通信,反之亦然。
圖 1:藍牙 LE 與 TCP/IP
廣泛的標準范圍
盡管藍牙 SIG 和其他組織已經(jīng)定義了一些與 IoT 和藍牙相關(guān)的標準,但單獨使用它們不太可能涵蓋 IoT 的所有方面。目前,定義了以下標準:
RFC7668
用于通信的互聯(lián)網(wǎng)工程任務(wù)組 (IETF) 標準,它定義了如何調整 IPv6 6LoWPAN 數據包以通過(guò)藍牙 LE 堆棧的較低層發(fā)送。并非 TCP/IP 的所有方面都受支持,但使用它的藍牙 LE 設備可以擁有 IP 地址,并且可以使用 6LoWPAN IPv6 數據包相互通信。
Internet 協(xié)議支持配置文件 (IPSP)
這是一個(gè)低功耗藍牙 (LE) 配置文件,允許發(fā)現支持 IP over Bluetooth 的設備。它在 RFC7668 中定義了藍牙 LE 堆棧如何用于發(fā)送和接收 IPv6 數據包。
HTTP 代理服務(wù) (HPS)
這對于傳感器等設備很有用,并允許藍牙傳感器或類(lèi)似設備與支持藍牙 LE 和 TCP/IP 并可以充當 HTTP 客戶(hù)端的網(wǎng)關(guān)設備一起使用。因此,網(wǎng)關(guān)代表藍牙設備并在其請求時(shí)向遠程 Web 服務(wù)器發(fā)送 HTTP 請求。從 Web 應用程序服務(wù)器接收到的任何數據都會(huì )被發(fā)送回藍牙設備。
存在一些有用的標準
但是,如果您想在一般 IoT 用例中驅動(dòng)與 Internet 上的藍牙設備的交互,那么您需要一個(gè)網(wǎng)關(guān),該網(wǎng)關(guān)具有某種適配方案(API),以便可以使用基于 TCP/IP 的協(xié)議和然后由網(wǎng)關(guān)轉換為適當的藍牙請求并發(fā)送到連接的藍牙設備。
要在 IoT 環(huán)境中使用藍牙,您通常需要可以在某些通過(guò) TCP/IP 運行的應用程序協(xié)議和藍牙協(xié)議之間進(jìn)行轉換的東西。這通常稱(chēng)為藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)(圖 2)(BIG),屬于中間件。
圖 2:藍牙和物聯(lián)網(wǎng)解決方案架構
藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)要求
現在,我們有舊的藍牙 BR/EDR 和新的藍牙 LE 可供選擇(圖 3)。藍牙 LE 可以以多種方式使用,包括面向連接的通信和無(wú)連接,還可以用于創(chuàng )建藍牙設備的大型網(wǎng)狀網(wǎng)絡(luò )。因此,首先要考慮需要支持什么類(lèi)型的藍牙技術(shù)。
圖 3:藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)要求
對于這個(gè)項目,使用了藍牙 LE,因為對藍牙網(wǎng)狀網(wǎng)絡(luò )的支持不是優(yōu)先事項,也無(wú)意支持舊的藍牙 BR/EDR。
藍牙 LE 設備可以以多種方式工作。無(wú)連接通信涉及稱(chēng)為廣告的過(guò)程,其中小數據包被范圍內的設備廣播和接收(掃描)。該機制用于促進(jìn)設備發(fā)現。
通常,智能手機等掃描設備會(huì )在用戶(hù)的幫助下找到并選擇設備,然后建立連接。此后,通過(guò)連接進(jìn)行通信。這需要網(wǎng)關(guān)代表某種 TCP/IP 客戶(hù)端來(lái)完成。
做廣告的可連接設備稱(chēng)為外圍設備。而那些掃描和請求連接的設備稱(chēng)為中央設備。
因此,決定支持可連接的 LE 設備作為外圍設備,藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)作為中央設備進(jìn)行掃描和連接。
圖 4:藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)要求
藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)架構
適配器組件處理以 TCP/IP 協(xié)議編碼的請求。藍牙 LE API 有助于驅動(dòng)藍牙堆棧實(shí)現的請求藍牙程序。
決定在 Raspberry Pi 上使用 Linux 作為具有網(wǎng)關(guān)所需的 TCP/IP 和藍牙支持的平臺。還決定將 HTTP 和 WebSockets 用于 TCP/IP 協(xié)議,HTTP 請求和響應用于所有操作,但藍牙特征通知流的傳遞(通過(guò) WebSocket 傳遞)除外。
圖 5:網(wǎng)關(guān)邏輯架構
對于 HTTP 支持,選擇了 Apache Web 服務(wù)器,因為它具有廣泛的模塊集合,并且開(kāi)源 websocketd 用于 Web 套接字支持。一個(gè)網(wǎng)絡(luò )攝像頭也被插入網(wǎng)關(guān)以觀(guān)察遠程操作。
適配器代碼是用 Python 編寫(xiě)的。為了將 Python 腳本與 HTTP 中的 Web 服務(wù)器集成,使用了通用網(wǎng)關(guān)接口 (CGI)。
BlueZ 是您將在 Linux 上找到的藍牙堆棧的名稱(chēng)。它提供了一個(gè)與語(yǔ)言無(wú)關(guān)的 API,它使用 Linux d-bus 服務(wù),允許進(jìn)行進(jìn)程間通信。
圖 6:網(wǎng)關(guān)物理架構
藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)實(shí)現
獲取
不使用用于傳遞關(guān)聯(lián)參數的 HTTP 查詢(xún)字符串更改遠程對象狀態(tài)的請求。
HTTP PUT
使用 HTTP 請求正文中的 JSON 對象更改遠程對象狀態(tài)的請求,用于編碼和傳輸相關(guān)參數。
回應。HTTP 狀態(tài)和 JSON 對象。
這是一個(gè)涉及設備發(fā)現的示例(圖 7):
上面顯示了由名為 do_discover_devices.py 的適配器腳本生成的響應。它是使用 HTTP GET 調用的,并且將掃描時(shí)間參數傳遞到查詢(xún)字符串中。這表示網(wǎng)關(guān)應該花費多長(cháng)時(shí)間執行藍牙掃描(以毫秒為單位)。響應是一個(gè)對象數組,表示以 JSON 格式發(fā)現的設備。
圖 7:設備發(fā)現
在此示例中,使用 HTTP PUT(圖 8)寫(xiě)入藍牙特性。在這里,藍牙設備地址被分配為第一個(gè)參數,用于標識要與之交互的設備。
handle 參數是藍牙特性的特定實(shí)例的唯一標識符,屬于特定的藍牙服務(wù)。
圖 8:寫(xiě)入藍牙特性
圖 9:適配器代碼
圖 10:API 代碼
藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)安全
允許通過(guò) Internet 訪(fǎng)問(wèn)您的設備的任何內容都必須是安全的。對初始網(wǎng)關(guān)設計和實(shí)施的安全性(圖 11)的審查發(fā)現了許多安全問(wèn)題。
圖 11:安全分析
例如,沒(méi)有身份驗證機制,因此無(wú)法控制誰(shuí)可以或不可以訪(fǎng)問(wèn)網(wǎng)關(guān)。
此階段的網(wǎng)關(guān)使用了三個(gè)不同的 TCP/IP 端口:用于 HTTP 的端口 80、用于網(wǎng)絡(luò )攝像頭流服務(wù)的端口 8081 和用于 websocketd 的 8082。直接暴露在 Internet 上的端口越多,安全風(fēng)險就越大。
TCP/IP 上的數據在此階段也未加密,藍牙上的數據也不一定加密。
圖 12:保護網(wǎng)關(guān)的步驟
人們還認為有一些方法可以?xún)H授予對特定藍牙設備的訪(fǎng)問(wèn)權限,而不是授予對碰巧在網(wǎng)關(guān)范圍內的所有設備的訪(fǎng)問(wèn)權限。此外,能夠僅授予對特定設備功能的訪(fǎng)問(wèn)權限,而不是設備可以通過(guò)藍牙執行的所有操作,這將是有利的。
反向代理
網(wǎng)關(guān)上運行著(zhù)三個(gè)服務(wù),每個(gè)服務(wù)偵聽(tīng)不同的端口。但是安裝的 IP 防火墻被配置為只允許端口 443 訪(fǎng)問(wèn)。Apache Web 服務(wù)器被設置為充當反向代理,并將端口 443 數據包轉發(fā)到由 URL 模式定向的另一個(gè)端口(圖 13)。這限制了暴露給 Internet 的端口數量。
圖 13:反向代理
此外,為該項目發(fā)明了藍牙防火墻的概念。這允許控制可以通過(guò)網(wǎng)關(guān)與哪些藍牙設備交互以及可以訪(fǎng)問(wèn)哪些服務(wù)、特性和描述符。藍牙防火墻的配置文件如圖 14 所示。
圖 14:藍牙防火墻配置
藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)可擴展性
雖然藍牙規范沒(méi)有規定中央設備可以與外圍設備建立的并發(fā)連接數量的限制,但在實(shí)踐中總是有一個(gè)限制,而且可能很低。
因此,如果您想支持同時(shí)連接到藍牙互聯(lián)網(wǎng)網(wǎng)關(guān)并受其控制的大量設備,這里有一些選項。
添加多個(gè)適配器。您可以向網(wǎng)關(guān)添加多個(gè)藍牙適配器(圖 16)。一些適配器以 USB 加密狗的形式出現,因此在物理上很容易實(shí)現;需要對您的代碼進(jìn)行一些調整,但這并不難。
水平縮放。這是本項目中采用的方法。網(wǎng)關(guān)服務(wù)的多個(gè)實(shí)例(圖 17)在多個(gè) Raspberry Pi 設備上運行,請求由軟件負載平衡器分布在它們之間。所有客戶(hù)端請求都發(fā)送到運行負載均衡器的節點(diǎn)。
圖 15:可擴展性
圖 16:使用適配器進(jìn)行能力建設
圖 17:通過(guò)添加網(wǎng)關(guān)節點(diǎn)進(jìn)行能力建設
使用水平擴展,理論上可以將大量 Raspberry Pi 節點(diǎn)添加到網(wǎng)關(guān)集群中,并實(shí)現非常高并發(fā)的藍牙設備支持。
這里唯一需要注意的問(wèn)題是有一個(gè)負載平衡器概念,稱(chēng)為粘性。一旦建立了從網(wǎng)關(guān)節點(diǎn)之一到特定藍牙設備的藍牙連接,來(lái)自與該藍牙設備相關(guān)的客戶(hù)端的所有后續請求都必須由同一網(wǎng)關(guān)節點(diǎn)處理,因為它持有藍牙連接。
圖 18:作者制作的機架式樹(shù)莓派零瓦多節點(diǎn)解決方案
HAProxy 負載均衡器對粘性有很好的支持,允許用戶(hù)配置行為。