在上篇文章 物聯網、開源硬件與開源社區 里,提到我自己對物聯網感興趣的原因,以及從開源社區里收獲的東西。
本文准備對物聯網領域里有趣的開源項目做個梳理。
如果你對某個技術領域感興趣,帶着關鍵詞去Github里淘金通常是個不錯的主意:

如果逐個介紹這些高贊的項目,夠寫一個系列的書了。我挑選我自己熟悉的,且覺得很有潛力的項目來做些介紹。
本文的目標之一是,希望讓開發者看到, 通過組合這些項目,能構建出自己的物聯網產品。
沒圖說個xx
先來畫個草圖,展示一個典型用戶在使用物聯網產品時的邏輯圖。

圖很簡略,來自10000英里高空的視角,省去了大多細枝末節的東西。
通信邏輯
我們來用文字描述一下圖中場景: 用戶
通過客戶端
(用戶代理
)連接到雲端(通常雲端運行着一個MQTT服務器), 來自客戶端的指令通過MQTT協議,經由雲端下發給物聯網設備,設備的狀態信息也可以通過MQTT反饋給客戶端。
看圖說話
接下來說說在圖中不同環節中,有哪些有趣的開源項目能為我們所用。
服務器
圖中那朵雲比較大,我們以此為起點。
你可能要爭辯說:
沒有雲 那只不過是別人的電腦。
道理我也懂,我們暫且假裝服務商不偷數據,盡管目前沒有任何技術能夠保證這點。好在硬件加密目前進展不錯,指不定我們哪天就能真的安全使用別人的電腦
了。
說回正題,為了讓客戶端與設備建立雙向通信,物聯網行業一般使用MQTT協議。當然也有許多公司將這協議隨便改改,起個新名字什么的,就舉着自主研發的旗號去拿投資。
目前為止我們沒有必要深究MQTT協議,可以把MQTT看作一個通信管道,能夠在客戶端與設備之間傳遞信息。
MQTT消息會流經一個服務器,服務器上運行着MQTT服務,更專業的術語叫MQTT Broker
,我們暫時把它想象做消息中轉站
即可。
聽起來這東西在物聯網中占據中心地位呢,所有消息都流經它。怎么搭建一個MQTT Broker呢,目前有很多開源項目能幫你做到這點:
我目前正在使用emqx和hbmqtt, emqx性能很高,配置高的單台服務器就能支持百萬連接。集群的話,可以處理千萬級連接。
emqx自帶web管理面板,這是我目前正在運行的節點:

當然,除了大量的開源項目可以用作基礎設施,許多雲服務商,也開始提供此類基礎服務。本月21號准備去北京參加阿里雲十年再出發
技術峰會,其中物聯網專場就會提到他們目前在這塊提供的雲服務。
Client(Proxy)
說完了服務端,來說說Client(用戶代理)。
如果站在MQTT服務器的視角,我們會看到User Client和device都是MQTT客戶端。
我們先談論用戶接觸的客戶端(用戶代理), 設備端稍后來說。
今天,用戶一般通過手機APP和智能音箱與物聯網設備交互。
假設用戶采用手機APP來控制設備,開源社區有那些項目能幫到我們構建這些APP呢?
blynk非常值得關注。

Blynk是一個與硬件無關的物聯網平台,具有可定制的移動應用程序、私有雲、規則引擎和設備管理分析儀表盤。
在blynk平台中,通過可視化拖拽,你就能創建一個可發布到google play或app store的應用。
blynk是全球最流行的物聯網平台之一,如果考慮開發者數量,可能沒有之一。
blynk開源了若干項目, 開源地址在 github.com/blynkkk,如果擔心自己的數據安全,可以搭建自己的server。
blynk幫助你快速構建易用的客戶端,它默認支持400多款硬件,其中很多是開源硬件,所有的硬件驅動,blynk都開源出來了!
blynk是個綜合項目,它遠不止幫你構建物聯網客戶端。
如果你希望客戶端APP更加可控,你可以選擇自己構建APP UI,只使用MQTT client庫,這樣所有事情都在你控制之中。社區里有大量MQTT client開源項目:
- MQTT-Client-Framework: iOS, macOS, tvOS native ObjectiveC MQTT Client Framework
- paho.mqtt.android
- MQTT.js
device(物聯網設備)
最后我們來說說圖中最下邊的部分: 物聯網設備。
無論是MQTT Broker還是Client(用戶代理), 都是為了與device通信,device是用戶實際使用的東西。典型的device有智能智能燈、智能插座這類東西。

值得注意的是,在現實中並不是每個設備都聯網。目前的行業慣例是,這些設備先接入物聯網網關, 實際上收發MQTT消息的是物聯網網關。
各個設備與網關之間可能通過ZigBee或者bluetooth通信。目前bluetooth5已經登場,我相信網關與設備之間通信的未來是bluetooth5,新舊技術交接的時候,也是大量機會存在的時候。 關於bluetooth5的優勢,有時間單獨寫一篇文章。
device是一個硬件,上邊運行着程序。當然有大量的開源項目在這個領域出現。
由於device上要運行程序,所以它上邊通常跑着一個實時操作系統,程序則運行在這個系統之上,有大量開源的實時操作系統,如:
- RIOT:RIOT - The friendly OS for IoT
- FreeRTOS: FreeRTOS的設計小巧且簡易,整個核心代碼只有3到4個C文件
- rt-thread: 小而美的物聯網操作系統
device上也可以不跑操作系統。諸如直接運行着micropython, micropython是我很喜歡的項目,利用這個項目,我們可以直接使用Python為硬件編程。如此一來,既能快速構建原型,性能和穩定性又完全足夠用於生產環境。當然啦,如果你更喜歡lisp,可以使用ulisp, 如果你更喜歡JavaScript,可以使用espruino。所有這些是開源項目。
micropython支持眾多類型的板子,大多數都完全開源,社區里有現成的MQTT庫供你使用。你可以選擇任意一個板子構建你的產品。如果你構建的的物聯網產品服務於教育,micropython社區有個對教育友好的分支:circuitpython。
device一般需要與網關協作。對於構建原型來說,樹莓派是非常理想的網關。事實上國外有大量項目將其用於生產實際,用於工業或農業領域。
再往底層說,我們可能關心device上采用什么芯片,我比較喜歡兩個系列的芯片:
- esp32/esp8266
- nrf51/nrf52
esp32芯片自帶藍牙和wifi,價格低廉,支持micropython。
nrf52系列的芯片支持bluetooth5!micropython社區正在對其進行兼容。
這個系列芯片對bluetooth5的支持如下:

我目前在使用nrf52840,它支持的協議包括:
- Bluetooth 5
- Bluetooth mesh
- Thread
- Zigbee
- 802.15.4
- ANT
- 2.4 GHz
nrf52系列的芯片由北歐半導體公司生產,這家公司對開發者極為友好,開源了大量的工具和項目,開發者可以將其用作腳手架,快速構建產品。
顏值即正義
一個功能強大卻不夠好看的物聯網產品,怕是要遭人嫌棄的。如果直接裸露開發板,恐怕只能賣給黑客或朋克了。可惡的是,這兩類人群還最不愛買現成的東西。你拿着一個裸露的產品到他們面前,一個典型的黑客,可能只願意買其中的一根杜邦線,因為他目前只缺這一根線。
要忽悠投資,或者賣給c端用戶。讓你的設備變得好看一點通常是必要的,3D打印個漂亮的外殼可能是個不錯的注意。
即便在3D打印領域,開源社區依然為你做了大量的事。3D打印發展之所以如此迅速,是因為這個領域的核心技術多是開源的,感興趣的朋友可以看看3D打印的歷史。
其次,社區里有大量用戶以知識共享協議開源了他們設計的3D模型,你可以在thingiverse之類的網站上找到大量可用的3D模型,用做產品外觀。
諸如你想要用樹莓派制作一個游戲機,有大量有趣的3D模型:

如果你希望用樂高風格的積木來作為產品外觀,開源社區同樣有解決方案(不存在專利風險): PELA-parametric-blocks


感興趣的方向
說說我目前感興趣的幾個方向。
邊緣計算
AI和IoT的結合有很多想象空間,這是現在很多硬件產品發布會的焦點所在。
連續爆出的隱私問題,讓人們對基於雲端的AI表示擔憂。隱私話題我們不多討論,感興趣的用戶hacker news上有大量實錘案例。
邊緣計算將數據的處理,由網絡中心節點,移往網絡邏輯上的邊緣節點來處理。如此一來,我們可以享受AI帶來的便利,也能避免隱私泄漏的風險。
當前已經有很多優秀項目致力於此。
樹莓派社區有個用於邊緣計算的深度學習開源項目: BerryNet,來自日本的Connect People and Things項目也很有意思。
數據可視化
如何將傳感器采集的數據可視化,是個很有趣的話題,這也是提升用戶價值的地方。
thingsboard、node-red以及blynk.io都做了大量優秀的工作。
截取一些thingsboard的數據面板
智能能源:

智能農業:

車隊追蹤:

允許用戶使用積木來自定義圖表:
隱私優先的智能家居
Bozhidar Bozhanov在Why I Don’t Have a Smart Home一文中,吐槽了智能家居
的現狀。
我贊同他對隱私的擔憂。有很多項目在考慮隱私優先的智能家居,home-assistant是這個領域的的佼佼者,它完全開源,部署在本地,為你帶來便利的同時,也避免了隱私風險。
Bozhidar Bozhanov在文中給出了一個非常有意思的建議,他認為辦公室自動化
可能是比家庭自動化
有價值的方向。
當你希望將空間自動化,又不想活在一群人的監控視野下,home-assistant通常都是理想的選擇。
萬物積木化
萬物積木化是我一直感興趣的話題,在物聯網方向,積木依然可以做很多事。圍繞這個話題,我此前寫過一篇文章: 積木化編程與智能家居
node-red是個IBM貢獻的一個有趣開源項目,方便你用積木輕松玩轉物聯網。
CodeLab在萬物積木化
這塊也做了很多工作: codelab-adapter
垂直行業應用
智能農業和智能工業是非常有趣的兩個領域。
目前有國外大量物聯網項目在探索這兩個方向, blynk.io中有很多案例。
前幾天索尼分享了他們如何使用樹莓派這塊廉價開源硬件將工廠效率提高30%以上: How Sony Sped Up A Factory With These Tiny, $35 Computers
screenly是一個基於樹莓派的開源數字標牌解決方案,數字標牌市場預計到2020年將增長到219.2億美元。我有寫過一篇文章討論這個話題: Screenly--用樹莓派讓任何屏幕變為可編程的數字標牌。
參考
- awesome-mqtt
- Why I Don’t Have a Smart Home
- io.adafruit.com
- Why you should use a relational database instead of NoSQL for your IoT application
- How Sony Sped Up A Factory With These Tiny, $35 Computers
- Connect People and Things
- screenly
- home-assistant
- node-serialport
- freeboard
- cylon: JavaScript framework for robotics, drones, and the Internet of Things (IoT)
- RIOT:RIOT - The friendly OS for IoT
- rt-thread
- 實時操作系統
- zigbee2mqtt
- BerryNet
- Sonoff-Tasmota
- node-red
- thingsboard
- Dumbass Home 2.0
- blynk-server
- balena-io