從零開始搭建物聯網系統
背景
時間:1年前的某日
坐標:深圳
在一個平常的不能再平常的周末下午,幾個小伙伴聚在了一起,一起暢想“萬物互聯”的物聯網未來。小伙伴中有硬件開發者、嵌入式開發者、軟件開發 者;有互聯網公司的全棧工程師、也有傳統核電廠的工控系統維護者、還有路由器廠商的wifi協議開發者。我們發現,世面上沒有開源且可商用的物聯網平臺或 系統。這里的可商用,不是搭建幾個demo把硬件連上網、app操作兩下這么簡單!
有以下幾點都是必須著重考慮的:
- 必須 有完備的硬件、嵌入式、云端一體的協議及架構設計
- 能夠 實現真正的硬件智能化,能夠基于數據學習并自主工作
- 必須 有很高的性能、穩定性及擴展性
- 必須 能夠適應成千上萬種不同資源的硬件設備,從PC到手機、從計算資源及其有限的單片機到網絡帶寬及其有限的控制器
- 必須 能適應不同的網絡場景,包括有線、wifi、3g/4g、gprs等
- 必須 有很可靠的安全性
- 需要 盡可能降低研發和生產成本
在媒體和科技工作者都抱著物聯網是未來的觀點并翹首觀望時,我們決定做點什么,而不是當看客!這個平常的不能再平常的周末下午,也許對我們不太平凡。
我們決定啟動全套可商用物聯網系統的設計和研發,并且將在未來, 全部開源 。
于是大家利用業余時間,開始了協議設計及系統設計,將項目慢慢啟動了起來。幾個月后,第一個商用版本的研發成功完成。這期間,好幾個小伙伴辭去了 工作,全職進行研發。我們在沒有融資、沒有資源的情況下一路走到現在,其中辛酸就不多言了。謹以此文記錄我們在系統設計和研發中的走過的路,以饗同樣是物 聯網愛好者的你。
整體設計
一個物聯網系統涉及硬件、軟件、云端、app各個環節,必須從整體進行頂層設計,只倚重某個單一的環節進行設計的系統都無法具有良好的適用性和擴 展性。我們在設計時為了避免這種情況,使系統能夠適應最廣泛的物聯網場景(甚至包括工業場景),每次的架構設計討論都是所有團隊成員參與。大體的系統架構 如下:
協議
在一個物聯網系統中,協議是串通上下層的關鍵紐帶。在物聯網系統中,我們將協議分為兩大層:通信層和業務層。
- 通信層 基本上是傳統互聯網的網絡基礎設施,負責將數據在物聯網系統節點中的傳輸
- 業務層 分為兩層,底層是負責物聯網場景下數據交換格式的規范,上層是物聯網場景需要具體傳輸的業務數據規范。
通信層互聯網基礎架構(TCP/IP)目前已經非常成熟且通用,但是業務層協議目前還是種類繁多。可以確定的一點是,最終能在物聯網應用中稱霸的協議,一定也像互聯網時代一樣是 開放、免費 的。目前符合此特性并使用比較多的有XMPP、MQTT、COAP等。關于具體的對比,可以參考我之前的這篇文章。
我們最終選擇基于mqtt來作為業務傳輸層主要協議。但是mqtt協議本身的設計是針對開放設備,對于可商用的物聯網系統不得不考慮設備的安全性并具備完善的授權機制。所以我們在實現mqtt協議時進行了一些定制和限制。
在業務層的上層(business層),目前的物聯網系統都是各自針對自己的業務場景設計協議規范。有沒有可能根據物聯網場景統一業務數據的規范 呢?我們認為是可行的,并且也是必要的。如果把通信協議比作聲音,光有通信協議,任何人之間還是無法交流。只有統一語言,大家才能順暢溝通。所以我們抽象 出物聯網節點中傳感和執行器的業務場景,并設計出含有物聯網業務數據語義的業務層協議。目前已經將業務層協議開源,希望對廣大愛好者和從業者帶來一定參考 價值。
云端平臺
互聯網時代的用戶上網終端主要是PC和手機等設備,可以想象,物聯網時代,上網終端會呈多樣化、海量化趨勢。保守估計每人擁有數十套聯網設備,數據規模必然也是幾何倍增長。所以物聯網云端平臺注定是一個大規模的海量分布式系統。
目前很多愛好者或者廠商通過搭建簡單的web系統(如php、nodejs、python實現的web接口)可以實現設備的聯網,但是可以想象, 再真正的商用場景中,穩定性、性能、擴展性都必然遭受沖擊,無法應對。我們在設計云端時采用microservice分布式架構,并使用docker降低 運維成本。大體的云端架構如下圖
對于海量物聯網設備的場景,系統的可用性和擴展性將面臨巨大的挑戰。目前我們的系統基于go語言開發,已經發布到0.8.0版本,后續會在易于安裝和運維上進行優化,并計劃在1.0版本時開源發布。
嵌入式
物聯網硬件的嵌入式軟件除了傳統部分,必須加入聯網邏輯和傳感、控制器的管理。為了提高開發效率、方便復用,我們設計并開發了輕量級的物聯網嵌入 式開發框架,并對物聯網業務進行了抽象,以方便移植到不同的硬件平臺。我們希望做到的是,在不需要更改任何業務層代碼的情況下,一個物聯網嵌入式應用可以 在不同的硬件平臺運行。
當前很多大企業(華為、惠普、google)等都紛紛推出了物聯網操作系統,后續物聯網領域會出現多種操作系統共存的局面。不同的操作系統能運行 的最低系統資源以及具體應用場景都不盡相同,但我們相信,物聯網的上層業務是通用的,這也是我們設計物聯網嵌入式開發框架的原因。
安全
近些日子,各種廠商的物聯網設備紛紛傳出被黑的消息。從tcl到特斯拉,黑客都成功實現破解和隨意操控。和互聯網時代一樣,安全在物聯網目前的早期階段注定是容易被忽略的問題。為此我們也再設計系統是也沒有掉以輕心:
- 所有接入層通信都采用tls進行加密,包括對app、業務服務器的開放接口。
- 用戶、設備關鍵信息進行加密保存
- 針對設備有完善的用戶鑒權機制
- 等等
安全不是一朝一夕的事情,需要從系統開始構建時就考慮,并不斷完善安全手段和規則。
開發板
為了降低物聯網硬件的開發成本,我們基于esp8266設計了物聯網開發板,并在開發板實現了我們的嵌入式開發框架及物聯網協議。開發板相關的代碼已經全部開源,并在淘寶進行 眾籌 。
為什么推出開發板?我們認為這是一種互相學習、交流及沉淀技術的工具,希望更多的愛好者能一起做出好產品。
以開源之名
光陰荏苒,白駒過隙。一路走來,我們執著地將所有設計慢慢付諸實現,為未來的物聯網技術貢獻自己的力量。物聯網技術涉及的方向眾多,我們的力量畢竟是有限的,這也是我們從一開始就以開源形式開發項目的原因。
Now, we are calling for contributors!
如果你對物聯網和開源技術有著和我們一樣的執著和愛好,歡迎關注或加入我們的 開源項目 。后續我們會逐漸開源發布所有的系統設計和項目。我們希望更多的小伙伴一起為項目做貢獻,無論是提交issue,還是貢獻代碼。
或者加入我們的物聯網平臺與協議討論群(488074716)一起交流學習!