在上篇文章 物联网, 开源硬件与开源社区 里, 提到我自己对物联网感兴趣的原因, 以及从开源社区里收获的东西.
本文准备对物联网领域里有趣的开源项目做个梳理.
如果你对某个技术领域感兴趣, 带着关键词去 GitHub 里淘金通常是个不错的主意:
如果逐个介绍这些高赞的项目, 够写一个系列的书了. 我挑选我自己熟悉的, 且觉得很有潜力的项目来做些介绍.
本文的目标之一是, 希望让开发者看到, 通过组合这些项目, 能构建出自己的物联网产品.
没图说个 xx
先来画个草图, 展示一个典型用户在使用物联网产品时的逻辑图.
图很简略, 来自 10000 英里高空的视角, 省去了大多细枝末节的东西.
通信逻辑
我们来用文字描述一下图中场景: 用户通过客户端 (用户代理) 连接到云端(通常云端运行着一个 MQTT 服务器), 来自客户端的指令通过 MQTT 协议, 经由云端下发给物联网设备, 设备的状态信息也可以通过 MQTT 反馈给客户端.
看图说话
接下来说说在图中不同环节中, 有哪些有趣的开源项目能为我们所用.
服务器
图中那朵云比较大, 我们以此为起点.
你可能要争辩说:
没有云 那只不过是别人的电脑.
道理我也懂, 我们暂且假装服务商不偷数据, 尽管目前没有任何技术能够保证这点. 好在硬件加密目前进展不错, 指不定我们哪天就能真的安全使用别人的电脑了.
说回正题, 为了让客户端与设备建立双向通信, 物联网行业一般使用 MQTT 协议 https://zh.wikipedia.org/zh-cn/MQTT . 当然也有许多公司将这协议随便改改, 起个新名字什么的, 就举着自主研发的旗号去拿投资.
目前为止我们没有必要深究 MQTT 协议 https://zh.wikipedia.org/zh-cn/MQTT , 可以把 https://zh.wikipedia.org/zh-cn/MQTT 看作一个通信管道, 能够在客户端与设备之间传递信息.
MQTT 消息会流经一个服务器, 服务器上运行着 MQTT 服务, 更专业的术语叫 MQTT Broker, 我们暂时把它想象做消息中转站即可.
听起来这东西在物联网中占据中心地位呢, 所有消息都流经它. 怎么搭建一个 MQTT Broker 呢, 目前有很多开源项目能帮你做到这点:
- https://github.com/emqx/emqx : erlang
- https://github.com/mcollina/mosca : JavaScript
- https://github.com/eclipse/mosquitto : C/Python
- https://github.com/beerfactory/hbmqtt : Python
我目前正在使用 https://github.com/emqx/emqx 和 https://github.com/beerfactory/hbmqtt , https://github.com/emqx/emqx 性能很高, 配置高的单台服务器就能支持百万连接. 集群的话, 可以处理千万级连接.
https://github.com/emqx/emqx 自带 web 管理面板, 这是我目前正在运行的节点:
当然, 除了大量的开源项目可以用作基础设施, 许多云服务商, 也开始提供此类基础服务. 本月 21 号准备去北京参加阿里云十年再出发技术峰会, 其中物联网专场就会提到他们目前在这块提供的云服务.
Client(Proxy)
说完了服务端, 来说说 Client(用户代理).
如果站在 MQTT 服务器的视角, 我们会看到 User Client 和 device 都是 MQTT 客户端.
我们先谈论用户接触的客户端(用户代理), 设备端稍后来说.
今天, 用户一般通过手机 App 和智能音箱与物联网设备交互.
假设用户采用手机 App 来控制设备, 开源社区有那些项目能帮到我们构建这些 App 呢?
https://blynk.io/ 非常值得关注.
在 blynk 平台中, 通过可视化拖拽, 你就能创建一个可发布到 google play 或 App store 的应用.
https://blynk.io/ 是全球最流行的物联网平台之一, 如果考虑开发者数量, 可能没有之一.
blynk 开源了若干项目, 开源地址在 https://github.com/blynkkk/ , 如果担心自己的数据安全, 可以搭建自己的 server.
https://blynk.io/ 帮助你快速构建易用的客户端, 它默认支持 400 多款硬件, 其中很多是开源硬件, 所有的硬件驱动, https://blynk.io/ 都开源出来了!
https://blynk.io/ 是个综合项目, 它远不止帮你构建物联网客户端.
如果你希望客户端 App 更加可控, 你可以选择自己构建 App UI, 只使用 MQTT client 库, 这样所有事情都在你控制之中. 社区里有大量 MQTT client 开源项目:
- : iOS, macOS, tvOS native ObjectiveC MQTT Client Framework
- https://github.com/eclipse/paho.mqtt.android
- https://github.com/mqttjs/MQTT.js/
- device(物联网设备)
最后我们来说说图中最下边的部分: 物联网设备.
无论是 MQTT Broker 还是 Client(用户代理), 都是为了与 device 通信, device 是用户实际使用的东西. 典型的 device 有智能智能灯, 智能插座这类东西.
值得注意的是, 在现实中并不是每个设备都联网. 目前的行业惯例是, 这些设备先接入物联网网关, 实际上收发 MQTT 消息的是物联网网关.
各个设备与网关之间可能通过 https://zh.wikipedia.org/zh-cn/ZigBee 或者 bluetooth 通信. 目前已经登场, 我相信网关与设备之间通信的未来是 bluetooth5, 新旧技术交接的时候, 也是大量机会存在的时候. 关于 bluetooth5 的优势, 有时间单独写一篇文章.
device 是一个硬件, 上边运行着程序. 当然有大量的开源项目在这个领域出现.
我们来聊聊围绕 device 的开源硬件和开源软件.
由于 device 上要运行程序, 所以它上边通常跑着一个实时操作系统, 程序则运行在这个系统之上, 有大量开源的实时操作系统, 如:
https://github.com/RIOT-OS/RIOT :RIOT - The friendly OS for IoT
FreeRTOS https://www.freertos.org/RTOS.html : FreeRTOS 的设计小巧且简易, 整个核心代码只有 3 到 4 个 C 文件
https://github.com/RT-Thread/rt-thread : 小而美的物联网操作系统
device 上也可以不跑操作系统. 诸如直接运行着 http://micropython.org/ , http://micropython.org/ 是我很喜欢的项目, 利用这个项目, 我们可以直接使用 Python 为硬件编程. 如此一来, 既能快速构建原型, 性能和稳定性又完全足够用于生产环境. 当然啦, 如果你更喜欢 lisp, 可以使用 http://www.ulisp.com/show?3M , 如果你更喜欢 JavaScript, 可以使用 https://www.espruino.com/ . 所有这些是开源项目.
http://micropython.org/ 支持众多类型的板子, 大多数都完全开源, 社区里有现成的 MQTT 库供你使用. 你可以选择任意一个板子 http://micropython.org/download 构建你的产品. 如果你构建的的物联网产品服务于教育, http://micropython.org/ 社区有个对教育友好的分支: https://github.com/adafruit/circuitpython .
device 一般需要与网关协作. 对于构建原型来说, 树莓派 https://www.raspberrypi.org/ 是非常理想的网关. 事实上国外有大量项目将其用于生产实际, 用于工业或农业领域.
再往底层说, 我们可能关心 device 上采用什么芯片, 我比较喜欢两个系列的芯片:
- esp32/esp8266
- nrf51/nrf52
芯片自带蓝牙和 Wi-Fi, 价格低廉, 支持 micropython.
nrf52 系列的芯片支持 bluetooth5!micropython 社区正在对其进行兼容.
这个系列芯片对 bluetooth5 的支持如下:
我目前在使用 nrf52840, 它支持的协议包括:
- Bluetooth 5
- Bluetooth mesh
- Thread
- Zigbee
- 802.15.4
- ANT
- 2.4 GHz
nrf52 系列的芯片由北欧半导体公司 https://en.wikipedia.org/wiki/Nordic_Semiconductor 生产, 这家公司对开发者极为友好, 开源了大量的工具和项目 https://github.com/NordicSemiconductor , 开发者可以将其用作脚手架, 快速构建产品.
颜值即正义
一个功能强大却不够好看的物联网产品, 怕是要遭人嫌弃的. 如果直接裸露开发板, 恐怕只能卖给黑客或朋克了. 可恶的是, 这两类人群还最不爱买现成的东西. 你拿着一个裸露的产品到他们面前, 一个典型的黑客, 可能只愿意买其中的一根杜邦线, 因为他目前只缺这一根线.
要忽悠投资, 或者卖给 c 端用户. 让你的设备变得好看一点通常是必要的, 3D 打印个漂亮的外壳可能是个不错的注意.
即便在 3D 打印领域, 开源社区依然为你做了大量的事. 3D 打印发展之所以如此迅速, 是因为这个领域的核心技术多是开源的, 感兴趣的朋友可以看看 3D 打印的历史 https://zh.wikipedia.org/wiki/3D打印 .
其次, 社区里有大量用户以知识共享协议开源了他们设计的 3D 模型, 你可以在 https://www.thingiverse.com/ 之类的网站上找到大量可用的 3D 模型, 用做产品外观.
诸如你想要用树莓派制作一个游戏机, 有大量有趣的 3D 模型:
如果你希望用乐高风格的积木来作为产品外观, 开源社区同样有解决方案(不存在专利风险):
感兴趣的方向
说说我目前感兴趣的几个方向.
边缘计算
AI 和 IoT 的结合有很多想象空间, 这是现在很多硬件产品发布会的焦点所在.
连续爆出的隐私问题, 让人们对基于云端的 AI 表示担忧. 隐私话题我们不多讨论, 感兴趣的用户 hacker news https://news.ycombinator.com/ 上有大量实锤案例.
边缘计算将数据的处理, 由网络中心节点, 移往网络逻辑上的边缘节点来处理. 如此一来, 我们可以享受 AI 带来的便利, 也能避免隐私泄漏的风险.
当前已经有很多优秀项目致力于此.
树莓派社区有个用于边缘计算的深度学习开源项目: https://github.com/DT42/BerryNet , 来自日本的 Connect People and Things https://idein.jp/ 项目也很有意思.
数据可视化
如何将传感器采集的数据可视化, 是个很有趣的话题, 这也是提升用户价值的地方.
https://github.com/thingsboard/thingsboard , https://github.com/node-red/node-red 以及 https://blynk.io 都做了大量优秀的工作.
截取一些 https://github.com/thingsboard/thingsboard 的数据面板
智能能源:
智能农业:
车队追踪:
允许用户使用积木来自定义图表:
隐私优先的智能家居
Bozhidar Bozhanov https://medium.com/@bozhobg 在 Why I Don't Have a Smart Home 一文中, 吐槽了智能家居的现状.
我赞同他对隐私的担忧. 有很多项目在考虑隐私优先的智能家居, https://www.home-assistant.io/ 是这个领域的的佼佼者, 它完全开源, 部署在本地, 为你带来便利的同时, 也避免了隐私风险.
Bozhidar Bozhanov https://medium.com/@bozhobg 在文中给出了一个非常有意思的建议, 他认为办公室自动化可能是比家庭自动化有价值的方向.
当你希望将空间自动化, 又不想活在一群人的监控视野下, https://www.home-assistant.io/ 通常都是理想的选择.
万物积木化
万物积木化是我一直感兴趣的话题, 在物联网方向, 积木依然可以做很多事. 围绕这个话题, 我此前写过一篇文章: 积木化编程与智能家居
https://github.com/node-red/node-red 是个 IBM 贡献的一个有趣开源项目, 方便你用积木轻松玩转物联网.
CodeLab 在万物积木化这块也做了很多工作: https://codelab-adapter-docs.codelab.club/
垂直行业应用
智能农业和智能工业是非常有趣的两个领域.
目前有国外大量物联网项目在探索这两个方向, https://blynk.io 中有很多案例.
前几天索尼分享了他们如何使用树莓派 https://www.raspberrypi.org/ 这块廉价开源硬件将工厂效率提高 30% 以上: How Sony Sped Up A Factory With These Tiny, $35 Computers
https://www.screenly.io 是一个基于树莓派 https://www.raspberrypi.org/ 的开源数字标牌解决方案, 数字标牌市场预计到 2020 年将增长到 219.2 亿美元. 我有写过一篇文章讨论这个话题: Screenly-- 用树莓派让任何屏幕变为可编程的数字标牌 https://blog.just4fun.site/screenly-rpi.html .
参考
- https://github.com/hobbyquaker/awesome-mqtt
- Why I Don't Have a Smart Home
- https://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 https://idein.jp/
- https://www.screenly.io
- https://www.home-assistant.io/
- https://github.com/node-serialport/node-serialport
- https://github.com/Freeboard/freeboard
- https://github.com/hybridgroup/cylon : JavaScript framework for robotics, drones, and the Internet of Things (IoT)
- https://github.com/RIOT-OS/RIOT :RIOT - The friendly OS for IoT
- https://github.com/RT-Thread/rt-thread
实时操作系统
- https://github.com/Koenkk/zigbee2mqtt
- https://github.com/DT42/BerryNet
- https://github.com/blynkkk/blynk-server
- https://github.com/arendst/Sonoff-Tasmota
- https://github.com/node-red/node-red
- https://github.com/thingsboard/thingsboard
来源: https://juejin.im/entry/5c8b7de86fb9a04a027b3ea3