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