在上篇文章 物联网、开源硬件与开源社区 里,提到我自己对物联网感兴趣的原因,以及从开源社区里收获的东西。
本文准备对物联网领域里有趣的开源项目做个梳理。
如果你对某个技术领域感兴趣,带着关键词去Github里淘金通常是个不错的主意:
如果逐个介绍这些高赞的项目,够写一个系列的书了。我挑选我自己熟悉的,且觉得很有潜力的项目来做些介绍。
本文的目标之一是,希望让开发者看到, 通过组合这些项目,能构建出自己的物联网产品。
先来画个草图,展示一个典型用户在使用物联网产品时的逻辑图。
图很简略,来自10000英里高空的视角,省去了大多细枝末节的东西。
我们来用文字描述一下图中场景: 用户通过客户端(用户代理)连接到云端(通常云端运行着一个MQTT服务器), 来自客户端的指令通过MQTT协议,经由云端下发给物联网设备,设备的状态信息也可以通过MQTT反馈给客户端。
接下来说说在图中不同环节中,有哪些有趣的开源项目能为我们所用。
图中那朵云比较大,我们以此为起点。
你可能要争辩说:
没有云 那只不过是别人的电脑。
道理我也懂,我们暂且假装服务商不偷数据,尽管目前没有任何技术能够保证这点。好在硬件加密目前进展不错,指不定我们哪天就能真的安全使用别人的电脑了。
说回正题,为了让客户端与设备建立双向通信,物联网行业一般使用MQTT协议。当然也有许多公司将这协议随便改改,起个新名字什么的,就举着自主研发的旗号去拿投资。
目前为止我们没有必要深究MQTT协议,可以把MQTT看作一个通信管道,能够在客户端与设备之间传递信息。
MQTT消息会流经一个服务器,服务器上运行着MQTT服务,更专业的术语叫MQTT Broker,我们暂时把它想象做消息中转站即可。
听起来这东西在物联网中占据中心地位呢,所有消息都流经它。怎么搭建一个MQTT Broker呢,目前有很多开源项目能帮你做到这点:
emqx : erlang
mosca : javascript
mosquitto: C/Python
hbmqtt: Python
我目前正在使用emqx和hbmqtt, emqx性能很高,配置高的单台服务器就能支持百万连接。集群的话,可以处理千万级连接。
emqx自带web管理面板,这是我目前正在运行的节点:
当然,除了大量的开源项目可以用作基础设施,许多云服务商,也开始提供此类基础服务。本月21号准备去北京参加阿里云十年再出发技术峰会,其中物联网专场就会提到他们目前在这块提供的云服务。
说完了服务端,来说说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
最后我们来说说图中最下边的部分: 物联网设备。
无论是MQTT Broker还是Client(用户代理), 都是为了与device通信,device是用户实际使用的东西。典型的device有智能智能灯、智能插座这类东西。
值得注意的是,在现实中并不是每个设备都联网。目前的行业惯例是,这些设备先接入物联网网关, 实际上收发MQTT消息的是物联网网关。
各个设备与网关之间可能通过ZigBee或者bluetooth通信。目前bluetooth5已经登场,我相信网关与设备之间通信的未来是bluetooth5,新旧技术交接的时候,也是大量机会存在的时候。 关于bluetooth5的优势,有时间单独写一篇文章。
device是一个硬件,上边运行着程序。当然有大量的开源项目在这个领域出现。
我们来聊聊围绕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