起因
作為Python開發(fā)者,其實(shí)很羨慕JavaScript一種天生的開發(fā)能力:可視化編程。這不僅僅是指GUI塑顺,Web前端,還包括一些建模和原型規(guī)劃方面的能力俏险。其中包括基于Node.js的Node-RED严拒,是IoT原型開發(fā)的利器。這種設(shè)計(jì)可以追溯到Y(jié)ahoo的Pipe服務(wù)竖独。作為一種基于Web的可視化編輯器裤唠,Node-RED可以定義IoT、Web開發(fā)中所需的各類組件莹痢。
在IoT日常開發(fā)中种蘸, 經(jīng)常使用代碼來實(shí)現(xiàn)的工作,有相當(dāng)一部分設(shè)計(jì)可以用該工具完成竞膳『讲t?墒窃囉弥螅野l(fā)現(xiàn)該工具是面向流的設(shè)計(jì)工具坦辟,如果前端的接入?yún)f(xié)議需要定制刊侯,或者需要復(fù)雜的狀態(tài)機(jī),那么這種設(shè)計(jì)可能無法替代人工編碼锉走。
加上滨彻,我的JavaScript編程能力不如Python熟悉,且Node-RED的文檔挪蹭,至少教程部分并不齊全亭饵。所以我并沒有將其投入到實(shí)際的工程設(shè)計(jì)中。而且Node-RED是一個(gè)容易被遺忘的工具梁厉,一旦設(shè)計(jì)完成后辜羊,基本上也不會(huì)老是去修改。
Python與Node-RED
Node-RED與其他IoT所需組件的配合可以加快系統(tǒng)的開發(fā)速度:
- 消息隊(duì)列,包括MQ和MQTT八秃,甚至Redis中的PubSub都可以作為Node-RED與其他服務(wù)進(jìn)程之間的耦合組件碱妆;
- 數(shù)據(jù)庫(kù),除了SQL RDBS喜德,還有Redis/MongoDB和InfluxDB等山橄;
- 云計(jì)算API,各類云計(jì)算都是通過API整合的舍悯,那么HTTP request就可以幫上忙了航棱。
- 操作系統(tǒng),包括調(diào)用操作系統(tǒng)的crontab和服務(wù)進(jìn)程萌衬、腳本饮醇、文件系統(tǒng)、串口和服務(wù)等秕豫。
相對(duì)多數(shù)的IoT設(shè)計(jì)中朴艰,二進(jìn)制協(xié)議是占據(jù)主體的。包括CoAP/MQTT都是如此混移。雖然ECMAScript 2015規(guī)定了JavaScript處理二進(jìn)制的對(duì)象和方法祠墅,但大多數(shù)早期設(shè)計(jì)中JavaScript處理二進(jìn)制數(shù)據(jù)比較麻煩。這些定制協(xié)議的數(shù)據(jù)處理和狀態(tài)機(jī)歌径,可以使用Python來做處理毁嗦,并轉(zhuǎn)換成JSON推送給Node-RED,更加方便使用回铛。
Node.js早期的版本依賴項(xiàng)中甚至包含Python狗准。所以Node.js其實(shí)和Python有一定相關(guān)性。這兩種是可以互相依賴的茵肃。所以我在Nodest-RED里找到了一個(gè)很重要的Node:Python function腔长。開發(fā)者可以用Node-RED設(shè)計(jì)合適的流,并使用Python Function Node來實(shí)現(xiàn)其中對(duì)于流的解析验残、轉(zhuǎn)發(fā)和處理捞附。
Node-RED的角色定位
原理上說,即使是類似于Xively的IoT設(shè)備云胚膊,也需要切割為:
- Connector故俐,各類協(xié)議的轉(zhuǎn)換和狀態(tài)機(jī),以及認(rèn)證等紊婉;
- Web,管理界面辑舷,RBAC喻犁,API管理等;
- Data,包括緩存和持久保存等肢础。
Node-RED可以作為三者間的連接設(shè)計(jì)器还栓,也可以用過HTTP endpoint來充任部分的Web功能,不過我覺得在復(fù)雜系統(tǒng)中传轰,在版本控制系統(tǒng)的協(xié)助下剩盒,用代碼實(shí)現(xiàn)更加合理。用鼠標(biāo)來產(chǎn)生三位數(shù)的URL慨蛙,管理起來很有難度辽聊。或者至少需要另外的工具來一口氣產(chǎn)生100多個(gè)endpoint nodes期贫。但是查看起來跟匆,需要很大的顯示器可視面積。
Node-RED感覺像是一個(gè)任何工作都可以實(shí)現(xiàn)的復(fù)合工具通砍,但是它也不是萬能的玛臂,在某些方面效率設(shè)置不如人工編碼。
典型的IoT接入云平臺(tái)需要包括:
- MQTT over TLS封孙,可以使用mosquitto和許多MQ實(shí)現(xiàn)迹冤;
- CoAP over D-TLS,可以使用Python Twisted/Tornado實(shí)現(xiàn)虎忌;
- HTTP over TLS, 即HTTPS泡徙,標(biāo)準(zhǔn)化實(shí)現(xiàn);
- WebSocket呐籽,標(biāo)準(zhǔn)化實(shí)現(xiàn)锋勺;
- 定制二進(jìn)制協(xié)議,傾向于Twisted實(shí)現(xiàn)狡蝶。
所以庶橱,Node-RED可以用于1/3/4三種協(xié)議實(shí)現(xiàn),其他的可以交由Twisted/Tornado實(shí)現(xiàn)贪惹。
功能重合的選擇
雖然苏章,使用Twisted/Tornado可以實(shí)現(xiàn)大多數(shù)的協(xié)議,但是我個(gè)人越來越傾向于將應(yīng)用層協(xié)議從Twisted Connector中剝離出來奏瞬,所以Twisted雖然從Connector中可以直接訪問各類數(shù)據(jù)庫(kù)枫绅,但是數(shù)據(jù)庫(kù)視圖本質(zhì)上是設(shè)備建模,直接的后果就是一旦協(xié)議或者設(shè)備建模任何一方發(fā)生變化硼端,都不得不重新啟動(dòng)并淋,且有版本失控的風(fēng)險(xiǎn)。
Client --> Twisted_Connector --> RBDS/TSDB --> WebAPI --> MobileAPP
所以珍昨,我現(xiàn)在的方式是將Twisted Connector獨(dú)立運(yùn)行县耽,將與設(shè)備連接有關(guān)的部分保留在Connector句喷,數(shù)據(jù)在Connector中變化為JSON對(duì)象,通過mosquitoo推送兔毙。Node-RED處理后唾琼,保存在數(shù)據(jù)庫(kù)中。這樣處理的好處澎剥,還有一個(gè)就是可以通過mosquitoo直接通過Web API推送給API的利用者锡溯,比如第三方網(wǎng)站和移動(dòng)應(yīng)用。
Client --> Twisted_Connector --> mosquitoo --> RBDS/TSDB --> DataAnalyst
|
+--> WebAPI --> MobileAPP
此圖中看不出Node-RED的位置哑姚,但實(shí)際上祭饭,mosquitto --> DB
以及mosquitto-->WebAPI
可以用來實(shí)現(xiàn)粘合。當(dāng)然蜻懦,Python/Node.js里本來就可以用來實(shí)現(xiàn)MQTT client甜癞。
價(jià)值所在
利用PubSub/MQ/API是實(shí)現(xiàn)許多微服務(wù)的基礎(chǔ),那么Node-RED就是這種微服務(wù)的縫紉針和膠水宛乃。在此基礎(chǔ)上悠咱,利用Python/Node.js開發(fā)一些基于Web和MQ的標(biāo)準(zhǔn)化API,即使單個(gè)API功能簡(jiǎn)單征炼,但是通過Node-RED整合析既,就足夠支撐一些復(fù)雜系統(tǒng)。