起因
作为Python开发者,其实很羡慕JavaScript一种天生的开发能力:可视化编程。这不仅仅是指GUI,Web前端,还包括一些建模和原型规划方面的能力。其中包括基于Node.js的Node-RED,是IoT原型开发的利器。这种设计可以追溯到Yahoo的Pipe服务。作为一种基于Web的可视化编辑器,Node-RED可以定义IoT、Web开发中所需的各类组件。
在IoT日常开发中, 经常使用代码来实现的工作,有相当一部分设计可以用该工具完成。可是试用之后,我发现该工具是面向流的设计工具,如果前端的接入协议需要定制,或者需要复杂的状态机,那么这种设计可能无法替代人工编码。
加上,我的JavaScript编程能力不如Python熟悉,且Node-RED的文档,至少教程部分并不齐全。所以我并没有将其投入到实际的工程设计中。而且Node-RED是一个容易被遗忘的工具,一旦设计完成后,基本上也不会老是去修改。
Python与Node-RED
Node-RED与其他IoT所需组件的配合可以加快系统的开发速度:
- 消息队列,包括MQ和MQTT,甚至Redis中的PubSub都可以作为Node-RED与其他服务进程之间的耦合组件;
- 数据库,除了SQL RDBS,还有Redis/MongoDB和InfluxDB等;
- 云计算API,各类云计算都是通过API整合的,那么HTTP request就可以帮上忙了。
- 操作系统,包括调用操作系统的crontab和服务进程、脚本、文件系统、串口和服务等。
相对多数的IoT设计中,二进制协议是占据主体的。包括CoAP/MQTT都是如此。虽然ECMAScript 2015规定了JavaScript处理二进制的对象和方法,但大多数早期设计中JavaScript处理二进制数据比较麻烦。这些定制协议的数据处理和状态机,可以使用Python来做处理,并转换成JSON推送给Node-RED,更加方便使用。
Node.js早期的版本依赖项中甚至包含Python。所以Node.js其实和Python有一定相关性。这两种是可以互相依赖的。所以我在Nodest-RED里找到了一个很重要的Node:Python function。开发者可以用Node-RED设计合适的流,并使用Python Function Node来实现其中对于流的解析、转发和处理。
Node-RED的角色定位
原理上说,即使是类似于Xively的IoT设备云,也需要切割为:
- Connector,各类协议的转换和状态机,以及认证等;
- Web,管理界面,RBAC,API管理等;
- Data,包括缓存和持久保存等。
Node-RED可以作为三者间的连接设计器,也可以用过HTTP endpoint来充任部分的Web功能,不过我觉得在复杂系统中,在版本控制系统的协助下,用代码实现更加合理。用鼠标来产生三位数的URL,管理起来很有难度。或者至少需要另外的工具来一口气产生100多个endpoint nodes。但是查看起来,需要很大的显示器可视面积。
Node-RED感觉像是一个任何工作都可以实现的复合工具,但是它也不是万能的,在某些方面效率设置不如人工编码。
典型的IoT接入云平台需要包括:
- MQTT over TLS,可以使用mosquitto和许多MQ实现;
- CoAP over D-TLS,可以使用Python Twisted/Tornado实现;
- HTTP over TLS, 即HTTPS,标准化实现;
- WebSocket,标准化实现;
- 定制二进制协议,倾向于Twisted实现。
所以,Node-RED可以用于1/3/4三种协议实现,其他的可以交由Twisted/Tornado实现。
功能重合的选择
虽然,使用Twisted/Tornado可以实现大多数的协议,但是我个人越来越倾向于将应用层协议从Twisted Connector中剥离出来,所以Twisted虽然从Connector中可以直接访问各类数据库,但是数据库视图本质上是设备建模,直接的后果就是一旦协议或者设备建模任何一方发生变化,都不得不重新启动,且有版本失控的风险。
Client --> Twisted_Connector --> RBDS/TSDB --> WebAPI --> MobileAPP
所以,我现在的方式是将Twisted Connector独立运行,将与设备连接有关的部分保留在Connector,数据在Connector中变化为JSON对象,通过mosquitoo推送。Node-RED处理后,保存在数据库中。这样处理的好处,还有一个就是可以通过mosquitoo直接通过Web API推送给API的利用者,比如第三方网站和移动应用。
Client --> Twisted_Connector --> mosquitoo --> RBDS/TSDB --> DataAnalyst
|
+--> WebAPI --> MobileAPP
此图中看不出Node-RED的位置,但实际上,mosquitto --> DB
以及mosquitto-->WebAPI
可以用来实现粘合。当然,Python/Node.js里本来就可以用来实现MQTT client。
价值所在
利用PubSub/MQ/API是实现许多微服务的基础,那么Node-RED就是这种微服务的缝纫针和胶水。在此基础上,利用Python/Node.js开发一些基于Web和MQ的标准化API,即使单个API功能简单,但是通过Node-RED整合,就足够支撑一些复杂系统。
本文章来源于互联网,如有侵权,请联系删除!原文地址:合用Python与Node-RED实现IoT快速开发
相关推荐: 两个西门子PLC1200之间的TCP通讯④–TCP测试
两个西门子PLC1200之间的TCP通讯④–TCP测试 上几期大概说了下TCP需要用到的指令块,TCON连接指令,TSEND发送指令,TRCV接收指令这3个指令构成了TCP的基础 这期将介绍正式测试TCP这个程序,发现一些实际调试出现的问题 1.0 先建立链…