Node-RED:3 - 基礎(chǔ)節(jié)點(diǎn)和流

點(diǎn)擊鏈接加入群聊【Node-RED與IoT開(kāi)發(fā)交流】https://jq.qq.com/?_wv=1027&k=5owlJfm
新創(chuàng)立的群,歡迎加入!

Node-RED Tutorial Home

介紹
建立你的第一個(gè)流
基礎(chǔ)節(jié)點(diǎn)和流
核心節(jié)點(diǎn)


例子:
使用Node-RED搭建一個(gè)天氣預(yù)報(bào)面板
基于 SIMATIC IOT2040 的 Node-RED S7 通信


Node-RED Tutorial 3 -- 基礎(chǔ)節(jié)點(diǎn)和流

在本講座中,您將看到一些更常用的節(jié)點(diǎn),并且基于以前的講座中學(xué)到的一些內(nèi)容。 您將從一系列基于流行的MQTT協(xié)議的示例開(kāi)始,顯示如何將一組基本但非常有用的消息處理節(jié)點(diǎn)連接在一起。 然后將簡(jiǎn)要介紹使用TCP,UDP和Websockets等協(xié)議將消息傳入和傳出流的其他方法。

在本講座結(jié)束時(shí),您將更好地了解Node-Red流中使用的一些基本節(jié)點(diǎn)。 您還將看到構(gòu)建復(fù)雜的處理流程,采取現(xiàn)實(shí)世界的事件然后處理它們并使用常用的Internet協(xié)議來(lái)生成傳達(dá)流程外的響應(yīng)是多么容易。

我們進(jìn)行這些講座所使用的Node-RED云托管叫做FRED。 在FRED注冊(cè)一個(gè)免費(fèi)帳戶(hù)。 早期講座中的示例將與Node-RED的其他安裝一起使用,如果不使用FRED,則稍后講課將使用您需要自己安裝的節(jié)點(diǎn)。

示例3.1通過(guò)MQTT消息接收J(rèn)SON

以下一系列示例均構(gòu)建在mqtt節(jié)點(diǎn)上,該節(jié)點(diǎn)提供了一種方便的方式來(lái)從MQTT代理獲取輸入。對(duì)于不熟悉MQTT的用戶(hù),這其實(shí)是一個(gè)發(fā)布/訂閱系統(tǒng)(通??s寫(xiě)為pub / sub系統(tǒng))的示例,它可以讓傳感器向所有訂閱該傳感器的客戶(hù)端發(fā)送信息。 MQTT使用主題模型,允許發(fā)布者(例如傳感器)創(chuàng)建主題并將數(shù)據(jù)發(fā)布到主題。同樣,其他人可以訂閱主題,并將收到發(fā)布到主題的數(shù)據(jù)的異步通知。

Pub / Sub系統(tǒng)是連接松散耦合的分布式系統(tǒng)的一種良好方式,它們很好地映射到設(shè)備或事物生成要共享的事件的典型IoT模式。 除了異步以外,MQTT協(xié)議也是輕量級(jí)的,并不像HTTP那么高; 對(duì)于資源有限的設(shè)備來(lái)說(shuō),這是一個(gè)重要的優(yōu)點(diǎn)。 MQTT最初是在20世紀(jì)90年代后期開(kāi)發(fā)的,現(xiàn)在已被用于各種IoT設(shè)置。 MQTT在2014年成為OASIS標(biāo)準(zhǔn),是許多IoT工具箱的標(biāo)準(zhǔn)組成部分。 MQTT實(shí)際上代表消息隊(duì)列遙測(cè)傳輸。

要使用mqtt節(jié)點(diǎn),您需要訪問(wèn)代理。這些是一些免費(fèi)的MQTT服務(wù)器,例如http://test.mosquitto.org/ ,或者在本講座中使用的服務(wù)器 www.hivemq.com。 使用代理地址和主題,您可以配置mqtt輸入節(jié)點(diǎn)以訂閱該主題,導(dǎo)致在該主題上發(fā)布新數(shù)據(jù)時(shí)生成新消息。 該消息將包含已發(fā)布數(shù)據(jù)的信息,包括msg.payload中的數(shù)據(jù)本身和msg.topic中的MQTT代理主題。

為了讓您開(kāi)始使用mqtt節(jié)點(diǎn),您將使用免費(fèi)的mqqt代理hivemq,這可以通過(guò)(http://www.hivemq.com/showcase/public-mqtt-broker/) 獲得。 當(dāng)然,您可以使用任何MQTT代理,如果您已經(jīng)安裝了一個(gè),您也可以使用您自己的代理。

首先,拖放一個(gè)mqtt輸入節(jié)點(diǎn)并為代理配置它。 不要忘記將主題配置為獨(dú)特的東西,在這個(gè)例子中,我們使用noderedlecture / sensor,但是您應(yīng)該使用自己獨(dú)特的主題,例如<您的名字> / sensor

圖片3.1配置具有代理地址和主題的mqtt節(jié)點(diǎn)

有很多方法可以將mqtt消息發(fā)送到hivemq。 您可以使用他們的websockets客戶(hù)端展示http://www.hivemq.com/demos/websocket-client/ mqtt儀表板http://www.mqtt-dashboard.com/dashboard 或您自己的庫(kù)。 您將在此示例中使用其Websocket客戶(hù)端,導(dǎo)航到該頁(yè)面并連接到代理。 您將發(fā)布JSON編碼的字符串到您配置Topic從而檢測(cè)的mqtt節(jié)點(diǎn)和json節(jié)點(diǎn)兩個(gè)節(jié)點(diǎn)的作用

圖片3.2 使用HiveMQ客戶(hù)端界面發(fā)送MQTT信息

由于您正在發(fā)送一個(gè)JSON字符串,所以您需要解析mqtt節(jié)點(diǎn)收到MQTT消息時(shí)生成的消息。 為此,您需要拖放一個(gè)json節(jié)點(diǎn)并將其連接到mqtt節(jié)點(diǎn)的輸出。

Node-RED的json節(jié)點(diǎn)是一種方便的功能,因?yàn)樗馕隽藗魅氲南?,并嘗試將其轉(zhuǎn)換(從JSON轉(zhuǎn)換)。 所以如果你發(fā)送一個(gè)JSON字符串,它會(huì)將它轉(zhuǎn)換成一個(gè)JavaScript對(duì)象,反之亦然。

如果將通常的調(diào)試節(jié)點(diǎn)連接到j(luò)son節(jié)點(diǎn)并部署,則使用HiveMQ儀表板發(fā)送JSON字符串{“analyze”:false,“value”:10},如圖3.2所示。 您將看到它在調(diào)試選項(xiàng)卡中打?。▓D3.3)。

圖片3.3接收和解析作為JSON字符串發(fā)送的MQTT消息

如果仔細(xì)觀察輸出,可以看到msg.payload包含一個(gè)對(duì)象,它本身有兩個(gè)字段,分析和賦值,每個(gè)都有自己的值。 正如您在講座2中看到的,您可以通過(guò)msg.payload.analyze和msg.payload.value訪問(wèn)這些字段。 我們來(lái)看看可以做到這一點(diǎn)的節(jié)點(diǎn)。

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn) :

[{"id":"6ec4dcef.913b24","type":"mqtt-broker","broker":"broker.mqtt-dashboard.com","port":"1883","clientid":""},{"id":"6304660c.9cfb98","type":"mqtt in","name":"","topic":"noderedlecture/sensor","broker":"6ec4dcef.913b24","x":190.0994415283203,"y":150.09091186523438,"z":"a2a2c218.5d5d4","wires":[["d0760869.2f89f8"]]},{"id":"d0760869.2f89f8","type":"json","name":"","x":330.6988220214844,"y":92.18182373046875,"z":"a2a2c218.5d5d4","wires":[["f1f1bca2.0e0e4"]]},{"id":"f1f1bca2.0e0e4","type":"debug","name":"","active":true,"console":"false","complete":"false","x":448.0994415283203,"y":155.09091186523438,"z":"a2a2c218.5d5d4","wires":[]}]

示例3.2使用switch節(jié)點(diǎn)來(lái)處理JSON對(duì)象

擁有JSON對(duì)象的一個(gè)很好的功能就是可以輕松地對(duì)其屬性執(zhí)行操作。 這時(shí)一個(gè)有用的節(jié)點(diǎn)是switch節(jié)點(diǎn)。 它的作用是根據(jù)傳入的消息屬性來(lái)“切換”或發(fā)送消息。 例如,您可以檢查msg.payload.analyze屬性,并根據(jù)其值(true / false)決定將消息發(fā)送到其中一個(gè)switch節(jié)點(diǎn)的輸出。

拖動(dòng)開(kāi)關(guān)節(jié)點(diǎn)并雙擊它。 配置它來(lái)評(píng)估屬性“msg.payload.analyze”。 如果為true,則將消息發(fā)送到第一個(gè)輸出; 如果為false,則將其發(fā)送到第二個(gè)輸出,如圖3.4所示。

圖片3.4 配置switch節(jié)點(diǎn)來(lái)根據(jù)數(shù)據(jù)屬性傳輸數(shù)據(jù)

現(xiàn)在你可以連接兩個(gè)debug節(jié)點(diǎn)(如圖3.5)——當(dāng)你為一個(gè)節(jié)點(diǎn)設(shè)置許多輸出時(shí),它們從上到下進(jìn)行編號(hào),因此輸出1在上面,輸出2在底部在圖3.5中。

圖片3.5 將switch 節(jié)點(diǎn)連接到兩個(gè)debug節(jié)點(diǎn)

如果現(xiàn)在返回HiveMQ輸入頁(yè)面并發(fā)送MQTT消息{“analyze”:true,“value”:6},您將看到第一個(gè)(頂部)輸出被激活,傳入的消息被發(fā)送了,或者“switched“ 至輸出1.如果發(fā)送原始消息{”analyze“:false,”value“:10},switch節(jié)點(diǎn)將激活輸出2,原始調(diào)試節(jié)點(diǎn)將觸發(fā)。 將指針懸停在調(diào)試消息上將顯示哪個(gè)調(diào)試節(jié)點(diǎn)正在打印出消息,如圖3.6所示。

圖片3.6確認(rèn)switch節(jié)點(diǎn)的發(fā)送

您可以看到,這為您提供了一個(gè)內(nèi)置的Node-RED節(jié)點(diǎn),可讓您快速確定傳入消息的內(nèi)容,并根據(jù)輸入將消息定向到流的不同部分。

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn):

[{"id":"6ec4dcef.913b24","type":"mqtt-broker","broker":"broker.mqtt-dashboard.com","port":"1883","clientid":""},{"id":"14e78330.eb187d","type":"mqtt in","name":"","topic":"noderedlecture/sensor","broker":"6ec4dcef.913b24","x":171.0994415283203,"y":332.0909118652344,"z":"a2a2c218.5d5d4","wires":[["dfc34d9.f203cb"]]},{"id":"67d23918.982dc8","type":"switch","name":"","property":"payload.analyze","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","outputs":2,"x":354.6987609863281,"y":332.18182373046875,"z":"a2a2c218.5d5d4","wires":[["6d8dd36.f92722c"],["4a938f5.fb56c7"]]},{"id":"dfc34d9.f203cb","type":"json","name":"","x":282.69883728027344,"y":274.18182373046875,"z":"a2a2c218.5d5d4","wires":[["67d23918.982dc8"]]},{"id":"6d8dd36.f92722c","type":"debug","name":"","active":true,"console":"false","complete":"false","x":515.0994262695312,"y":278.0909118652344,"z":"a2a2c218.5d5d4","wires":[]},{"id":"4a938f5.fb56c7","type":"debug","name":"","active":true,"console":"false","complete":"false","x":510.09942626953125,"y":367.0909118652344,"z":"a2a2c218.5d5d4","wires":[]}]

示例3.3使用change節(jié)點(diǎn)更改或操作消息內(nèi)容

另外一個(gè)非常有用的節(jié)點(diǎn)是change節(jié)點(diǎn),能夠讓您修改消息內(nèi)容或者為消息添加新的屬性,您能夠使用這個(gè)節(jié)點(diǎn)來(lái)影響消息中的屬性,方法是更改現(xiàn)有屬性,刪除或添加新屬性。

在此示例中,您將繼續(xù)使用MQTT主題,并了解如何根據(jù)傳入的MQTT消息成功地“切換”消息流,您可以添加新的消息屬性msg.payload.note。

首先,我們拖放一個(gè)change節(jié)點(diǎn)并將其連接到switch機(jī)節(jié)點(diǎn)的第二個(gè)輸出(圖3.7)。 這是msg.payload.analyze設(shè)置為false時(shí)觸發(fā)的輸出。

圖片3.7添加一個(gè)change節(jié)點(diǎn)并設(shè)置新的信息屬性

現(xiàn)在配置它,將屬性msg.payload.note設(shè)置為“this is not being analyzed”,如圖3.8所示。

圖片3.8添加一個(gè)change節(jié)點(diǎn)并設(shè)置新的信息屬性

當(dāng)您收到switch節(jié)點(diǎn)在第二個(gè)輸出上發(fā)送的消息時(shí),它將被修改為包含一個(gè)“note”元素,其中的字符串“this is not being analyzed”。 如果通過(guò)從HiveMQ發(fā)送MQTT消息來(lái)部署和測(cè)試流程,您將看到如圖3.9所示的輸出。

圖片3.9 交換和改變信息之后的結(jié)果

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn):

[{"id":"6ec4dcef.913b24","type":"mqtt-broker","broker":"broker.mqtt-dashboard.com","port":"1883","clientid":""},{"id":"3880a946.c77f56","type":"mqtt in","name":"","topic":"noderedlecture/sensor","broker":"6ec4dcef.913b24","x":123.09944152832031,"y":515,"z":"a2a2c218.5d5d4","wires":[["ce7bdcab.31842"]]},{"id":"4848edd7.b7b714","type":"switch","name":"","property":"payload.analyze","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","outputs":2,"x":306.6987609863281,"y":515.0909118652344,"z":"a2a2c218.5d5d4","wires":[["28ebaa52.d71456"],["6ebc384d.9143c8"]]},{"id":"ce7bdcab.31842","type":"json","name":"","x":234.69883728027344,"y":457.0909118652344,"z":"a2a2c218.5d5d4","wires":[["4848edd7.b7b714"]]},{"id":"6ebc384d.9143c8","type":"change","name":"","rules":[{"t":"set","p":"payload.note","to":"this is not being analysed"}],"action":"","property":"","from":"","to":"","reg":false,"x":374.6988067626953,"y":564.0909423828125,"z":"a2a2c218.5d5d4","wires":[["3596e410.ca691c"]]},{"id":"3596e410.ca691c","type":"debug","name":"","active":true,"console":"false","complete":"false","x":574.6988372802734,"y":543.0909423828125,"z":"a2a2c218.5d5d4","wires":[]},{"id":"28ebaa52.d71456","type":"debug","name":"","active":true,"console":"false","complete":"false","x":489.09942626953125,"y":478,"z":"a2a2c218.5d5d4","wires":[]}]

示例3.4使用rbe(report by exception)節(jié)點(diǎn)

在此示例中,您將繼續(xù)使用消息分析主題,并將節(jié)點(diǎn)添加到當(dāng)您要分析流程時(shí)所需的部分。 您可以使用(如果原數(shù)據(jù)被更改了)rbe(report by exception)節(jié)點(diǎn)。 您可以將其設(shè)置為檢查消息有效負(fù)載,并阻塞,直到消息更改(rbe模式)或消息更改指定量(死區(qū)模式)為止。 在rbe模式下,它適用于數(shù)字和字符串。 在死區(qū)模式下,它僅適用于數(shù)字,并將配置的死區(qū)范圍增加或減小,以便傳入值在觸發(fā)之前會(huì)在一定范圍內(nèi)波動(dòng)。

您將從添加另一個(gè)連接至switch節(jié)點(diǎn)的輸出1的change節(jié)點(diǎn)開(kāi)始。然后,您將連接一個(gè)rbe節(jié)點(diǎn)到交換機(jī)節(jié)點(diǎn),如圖3.10所示。

我們連接一個(gè)change節(jié)點(diǎn)和一個(gè)這樣的rbe節(jié)點(diǎn)。 要提醒我們這個(gè)輸出處理將其添加標(biāo)志“analyze”,添加一個(gè)comment節(jié)點(diǎn)并寫(xiě)“Analyze = true”。 編寫(xiě)復(fù)雜流時(shí),注釋很有用。

圖片3.10 添加一個(gè)rbe節(jié)點(diǎn)來(lái)檢測(cè)輸入數(shù)據(jù)是否被改變超過(guò)20%

編輯change節(jié)點(diǎn)將msg.payload設(shè)置為msg.payload.value。 這將該節(jié)點(diǎn)的輸出設(shè)置為接收到的輸入中的msg.payload.value元素中的值(圖3.11)

圖片3.11 使用change節(jié)點(diǎn)來(lái)設(shè)置接收信息

由于您要確定此值是否已經(jīng)更改了20%或更多,您需要雙擊rbe節(jié)點(diǎn)并將其配置為阻止,除非該值更改超過(guò)20%。

圖片3.12設(shè)置rbe節(jié)點(diǎn)來(lái)檢測(cè)接收信息的值

要測(cè)試流程,請(qǐng)部署此流程,然后返回HiveMQ頁(yè)面并發(fā)送一系列消息。 首先,您需要將分析值設(shè)置為true,以便交換節(jié)點(diǎn)通過(guò)輸出1上的消息發(fā)送。如果使用原始消息值6,則將無(wú)法通過(guò)rbe節(jié)點(diǎn)。 如果然后發(fā)送值為10的第二個(gè)消息,則rbe節(jié)點(diǎn)將評(píng)估6到10之間的差異,顯而易見(jiàn)這是大于20%的,則rbe節(jié)點(diǎn)發(fā)送消息到最終調(diào)試節(jié)點(diǎn),該調(diào)試節(jié)點(diǎn)將在調(diào)試窗格上打印,如圖3.13所示。

圖片3.13使用rbe節(jié)點(diǎn)確認(rèn)10比6大20%以上。

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn):

[{"id":"6ec4dcef.913b24","type":"mqtt-broker","broker":"broker.mqtt-dashboard.com","port":"1883","clientid":""},{"id":"e5b87c48.1a478","type":"mqtt in","name":"","topic":"noderedlecture/sensor","broker":"6ec4dcef.913b24","x":109.09944152832031,"y":741.9090576171875,"z":"a2a2c218.5d5d4","wires":[["faeb9330.05147"]]},{"id":"1051d99c.efae26","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":652.6988220214844,"y":701.9090576171875,"z":"a2a2c218.5d5d4","wires":[]},{"id":"68014717.97feb8","type":"switch","name":"","property":"payload.analyze","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","outputs":2,"x":292.6987609863281,"y":741.9999694824219,"z":"a2a2c218.5d5d4","wires":[["845f6b52.7ba098"],["e664669.f199b98"]]},{"id":"faeb9330.05147","type":"json","name":"","x":220.69883728027344,"y":683.9999694824219,"z":"a2a2c218.5d5d4","wires":[["68014717.97feb8"]]},{"id":"2f9686ca.d0697a","type":"comment","name":"Analyze = true","info":"","x":404.6988525390625,"y":656.9999694824219,"z":"a2a2c218.5d5d4","wires":[]},{"id":"bb7c3be1.4483c8","type":"rbe","name":"rbe","func":"deadband","gap":"20%","x":599.6988220214844,"y":652.9999694824219,"z":"a2a2c218.5d5d4","wires":[["1051d99c.efae26"]]},{"id":"845f6b52.7ba098","type":"change","name":"","rules":[{"t":"set","p":"payload","to":"msg.payload.value"}],"action":"","property":"","from":"","to":"","reg":false,"x":422.6988220214844,"y":692.9999694824219,"z":"a2a2c218.5d5d4","wires":[["bb7c3be1.4483c8"]]},{"id":"e664669.f199b98","type":"change","name":"","rules":[{"t":"set","p":"payload.note","to":"this is not being analysed"}],"action":"","property":"","from":"","to":"","reg":false,"x":434.6988067626953,"y":782.9999694824219,"z":"a2a2c218.5d5d4","wires":[["383f2d9b.c7c0d2"]]},{"id":"383f2d9b.c7c0d2","type":"debug","name":"","active":true,"console":"false","complete":"false","x":652.6988220214844,"y":753.9999694824219,"z":"a2a2c218.5d5d4","wires":[]}]

示例3.5使用range節(jié)點(diǎn)縮放輸入

當(dāng)處理來(lái)自傳感器和其他設(shè)備的真實(shí)數(shù)據(jù)輸入時(shí),通常需要擴(kuò)展輸入數(shù)據(jù)的能力。Node RED提供range節(jié)點(diǎn)以支持此功能,并允許您縮放(線(xiàn)性)輸入值。 假設(shè)您想在不進(jìn)行任何分析時(shí)將您的值(原始在0-10范圍內(nèi))縮放到范圍(0-255)。 這意味著當(dāng)switch節(jié)點(diǎn)將Analyze屬性評(píng)估為false時(shí),我們正在處理流信息的下半部分。

要做到這一點(diǎn),選擇您上面配置的change節(jié)點(diǎn)(設(shè)置msg.payload)并復(fù)制ctrl + c,然后ctrl + v。 附加一個(gè)范圍節(jié)點(diǎn),如圖3.14所示。

圖片3.14使用range node配置輸入數(shù)據(jù)

雙擊它,并將其配置為將輸入從0-10映射到0-255,如圖3.15所示。

range節(jié)點(diǎn)包含可設(shè)置范圍的三個(gè)選項(xiàng)。默認(rèn)值將根據(jù)給定的映射進(jìn)行縮放,但如果使用相同的映射,結(jié)果將很快超出預(yù)設(shè)范圍??s放且限制到目標(biāo)范圍意味著結(jié)果將不會(huì)超出指定的范圍。第三個(gè)選項(xiàng),縮放和包裝在目標(biāo)范圍內(nèi)意味著結(jié)果將在范圍內(nèi)基本上是一個(gè)“模式”的回繞。

然后返回HiveMQ測(cè)試頁(yè)面,并將{“analyze”:false,“value”:10}作為新的MQTT消息發(fā)送到同一主題。

圖片3.15在scale節(jié)點(diǎn)中為輸入輸出設(shè)置縮放范圍

如果返回到Node-RED窗口,您將看到與流程的下半部分關(guān)聯(lián)的debug節(jié)點(diǎn)已經(jīng)觸發(fā),顯示出當(dāng)您將其發(fā)布到MQTT中設(shè)置為10的msg.payload.value屬性已按比例放大為255,如圖3.16所示。

圖3.16關(guān)閉分析時(shí)的最終縮放輸出

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn):

[{"id":"6ec4dcef.913b24","type":"mqtt-broker","broker":"broker.mqtt-dashboard.com","port":"1883","clientid":""},{"id":"69080c4b.96f7f4","type":"mqtt in","name":"","topic":"noderedlecture/sensor","broker":"6ec4dcef.913b24","x":114.09944152832031,"y":957.6363525390625,"z":"a2a2c218.5d5d4","wires":[["ff3b2fc.f00c4d"]]},{"id":"60e9547d.9f16ac","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":657.6988220214844,"y":917.6363525390625,"z":"a2a2c218.5d5d4","wires":[]},{"id":"7703fe34.88fc","type":"switch","name":"","property":"payload.analyze","rules":[{"t":"true"},{"t":"false"}],"checkall":"true","outputs":2,"x":297.6987609863281,"y":957.7272644042969,"z":"a2a2c218.5d5d4","wires":[["55768737.aa8978"],["7020d33.f8fdf2c","2d0354b2.d2fcac"]]},{"id":"ff3b2fc.f00c4d","type":"json","name":"","x":225.69883728027344,"y":899.7272644042969,"z":"a2a2c218.5d5d4","wires":[["7703fe34.88fc"]]},{"id":"6d28b8c1.92d748","type":"comment","name":"Analyze = true","info":"","x":409.6988525390625,"y":872.7272644042969,"z":"a2a2c218.5d5d4","wires":[]},{"id":"db93bc20.246c4","type":"comment","name":"Analyze = false","info":"","x":411.6988220214844,"y":1080.7272644042969,"z":"a2a2c218.5d5d4","wires":[]},{"id":"a9319158.56ce7","type":"rbe","name":"rbe","func":"deadband","gap":"20%","x":604.6988220214844,"y":868.7272644042969,"z":"a2a2c218.5d5d4","wires":[["60e9547d.9f16ac"]]},{"id":"55768737.aa8978","type":"change","name":"","rules":[{"t":"set","p":"payload","to":"msg.payload.value"}],"action":"","property":"","from":"","to":"","reg":false,"x":427.6988220214844,"y":908.7272644042969,"z":"a2a2c218.5d5d4","wires":[["a9319158.56ce7"]]},{"id":"2b40b78c.d4bf48","type":"range","minin":"0","maxin":"10","minout":"0","maxout":"255","action":"clamp","round":false,"name":"","x":569.6988220214844,"y":1072.7272644042969,"z":"a2a2c218.5d5d4","wires":[["3530448c.cacfbc"]]},{"id":"2d0354b2.d2fcac","type":"change","name":"","rules":[{"t":"set","p":"payload","to":"msg.payload.value"}],"action":"","property":"","from":"","to":"","reg":false,"x":424.6988220214844,"y":1041.7272644042969,"z":"a2a2c218.5d5d4","wires":[["2b40b78c.d4bf48"]]},{"id":"3530448c.cacfbc","type":"debug","name":"","active":true,"console":"false","complete":"false","x":659.6988220214844,"y":1021.7272644042969,"z":"a2a2c218.5d5d4","wires":[]},{"id":"7020d33.f8fdf2c","type":"change","name":"","rules":[{"t":"set","p":"payload.note","to":"this is not being analysed"}],"action":"","property":"","from":"","to":"","reg":false,"x":439.6988067626953,"y":998.7272644042969,"z":"a2a2c218.5d5d4","wires":[["9d7e4096.6281c"]]},{"id":"9d7e4096.6281c","type":"debug","name":"","active":true,"console":"false","complete":"false","x":657.6988220214844,"y":969.7272644042969,"z":"a2a2c218.5d5d4","wires":[]}]

示例3.7在 Node-RED上使用 Websockets

Websockets節(jié)點(diǎn)是Node-RED中的另一個(gè)具有通信功能的內(nèi)置節(jié)點(diǎn)。 Websockets提供雙工TCP連接,旨在允許Web瀏覽器和服務(wù)器可用于增強(qiáng)傳統(tǒng)HTTP交互的“反向通道”,從而在客戶(hù)端不需要新的拉取請(qǐng)求的情況下允許服務(wù)器更新網(wǎng)頁(yè)。

Websocket節(jié)點(diǎn)有兩種輸入和輸出,允許您監(jiān)聽(tīng)傳入數(shù)據(jù)(輸入)或在Websocket上發(fā)送(輸出)。 輸出節(jié)點(diǎn)版本旨在檢查輸出有效載荷是否起始于節(jié)點(diǎn)中的Websocket,在這種情況下,它將響應(yīng)原始發(fā)送方。 否則它將廣播有效載荷到所有連接的Websockets。

此外,輸入和輸出websocket節(jié)點(diǎn)可以被配置為服務(wù)器或客戶(hù)端 - 在服務(wù)器模式下,他們可以監(jiān)聽(tīng)一個(gè)URL,而在客戶(hù)端模式下,它們可以連接到指定的IP地址。

要查看websocket節(jié)點(diǎn)的工作原理,您將使用在公共站點(diǎn)上運(yùn)行的公共websockets echo服務(wù)器(https://www.websocket.org/echo.html)。

將一個(gè)inject,websocket in,websocket out和一個(gè)debug節(jié)點(diǎn)拖到工作區(qū)上并連接它們,如圖3.18所示。

圖3.18在Node-RED流中使用websockets進(jìn)行通信

配置inject節(jié)點(diǎn)發(fā)送“Hello There”的字符串有效負(fù)載(圖3.19)

圖3.19配置在websocket上發(fā)送的注入節(jié)點(diǎn)

配置websocket節(jié)點(diǎn)以連接到wss://echo.websocket.org,如圖3.20所示。

圖3.20配置websocket發(fā)送到公共echo服務(wù)器。

對(duì)于out節(jié)點(diǎn)也一樣

部署,當(dāng)您點(diǎn)擊inject節(jié)點(diǎn)時(shí),您將看到如圖3.21所示打印的消息

圖3.21從監(jiān)聽(tīng)處的傳入數(shù)據(jù)的websocket輸出

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn):

[{"id":"6ec4dcef.913b24","type":"mqtt-broker","broker":"broker.mqtt-dashboard.com","port":"1883","clientid":""},{"id":"604724b6.9fb8dc","type":"mqtt out","name":"","topic":"noderedlecture/sensor","qos":"","retain":"","broker":"6ec4dcef.913b24","x":414.99998474121094,"y":733.9999694824219,"z":"53cf281b.ac30d8","wires":[]},{"id":"ec38975a.13c768","type":"inject","name":"{\"analyze\":false, \"value\":10}","topic":"","payload":"{\"analyze\":false, \"value\":6}","payloadType":"string","repeat":"","crontab":"","once":false,"x":144,"y":680.9999694824219,"z":"53cf281b.ac30d8","wires":[["604724b6.9fb8dc"]]},{"id":"83e4684e.7c1b98","type":"inject","name":"{\"analyze\":true, \"value\":6}","topic":"","payload":"{\"analyze\":true, \"value\":6}","payloadType":"string","repeat":"","crontab":"","once":false,"x":156,"y":730.9999694824219,"z":"53cf281b.ac30d8","wires":[["604724b6.9fb8dc"]]},{"id":"47a5dc83.b85a24","type":"inject","name":"{\"analyze\":true, \"value\":1}","topic":"","payload":"{\"analyze\":true, \"value\":10}","payloadType":"string","repeat":"","crontab":"","once":false,"x":153,"y":779.9999694824219,"z":"53cf281b.ac30d8","wires":[["604724b6.9fb8dc"]]}]

示例3.8發(fā)送TCP REQUEST。

此示例顯示如何使用tcp節(jié)點(diǎn)發(fā)送TCP REQUEST。 在這種情況下,您將按照(http://tools.ietf.org/html/rfc2616#section-5.1.2)中的規(guī)范進(jìn)行HTTP請(qǐng)求。

此示例顯示了tcp節(jié)點(diǎn)的使用。 它可以用類(lèi)似的方式配置udp或http節(jié)點(diǎn)。

一開(kāi)始,我們連接一個(gè)inject,function,tcp request和debug節(jié)點(diǎn),如圖3.22所示。

圖3.22構(gòu)建TCP REQUEST并在tcp輸出節(jié)點(diǎn)上發(fā)送

編輯第一個(gè)功能節(jié)點(diǎn)以添加一個(gè)功能,將字符串“GET / HTTP / 1.1 \ r \ n \ r \ nHost:www.google.com”設(shè)置為有效載荷,如圖3.23所示。

該字符串是標(biāo)準(zhǔn)的HTTP請(qǐng)求,表示它是GET請(qǐng)求,協(xié)議是HTTP 1.1,主機(jī)是www.google.com。 \ r \ n \ r \ n是HTTP協(xié)議中需要的兩個(gè)返回/換行符號(hào)。

圖3.23在function節(jié)點(diǎn)中構(gòu)建TCP REQUEST

配置tcp request節(jié)點(diǎn)連接到端口80上的www.google.com服務(wù)器。配置它在1秒(1000毫秒)后關(guān)閉連接,如圖3.24所示。

圖3.24配置TCP REQUEST的終點(diǎn)

tcp request節(jié)點(diǎn)響應(yīng)是一個(gè)緩沖區(qū),需要解析。 配置第二個(gè)功能節(jié)點(diǎn)來(lái)解析tcp request節(jié)點(diǎn)響應(yīng),如圖3.25所示

圖3.25將響應(yīng)緩沖區(qū)解析為字符串的函數(shù)節(jié)點(diǎn)

如果您部署流程并單擊inject,您將向Google發(fā)出請(qǐng)求,并獲得TCP響應(yīng)。 調(diào)試節(jié)點(diǎn)將以如圖3.26所示的字符串形式打印響應(yīng)。

圖3.26打印通過(guò)TCP連接發(fā)送的形式良好的HTTP請(qǐng)求的響應(yīng)

有些人可能會(huì)想知道為什么需要使用一個(gè)function節(jié)點(diǎn)構(gòu)建我們通過(guò)TCP發(fā)送的HTTP請(qǐng)求。 為什么不用inject節(jié)點(diǎn)輸入字符串? 原因是inject節(jié)點(diǎn)“escapes”其使用的字符串,導(dǎo)致插入的返回/換行被刪除。 這反過(guò)來(lái)會(huì)讓接收服務(wù)器(Google)在等待丟失的返回/換行符時(shí)將其不返回響應(yīng)。 因此,您可以在function節(jié)點(diǎn)中構(gòu)建字符串。即使對(duì)經(jīng)驗(yàn)豐富的Node-RED程序員來(lái)說(shuō)這也算是“我靠這也許”之一,所以總是閱讀節(jié)點(diǎn)的信息窗格,以確保您了解任何限制和禁止。

可以通過(guò)以下數(shù)據(jù)導(dǎo)入節(jié)點(diǎn):

[{"id":"23fa21f1.dc05de","type":"tcp request","server":"www.google.com","port":"80","out":"time","splitc":"1000","name":"","x":241.99984741210938,"y":131.0909194946289,"z":"b7bbf3c7.48441","wires":[["7bcbd7c9.843428"]]},{"id":"3f8055d.fc07faa","type":"inject","name":"","topic":"","payload":"GET / HTTP/1.1\\r\\n\\r\\nHost: www.google.com","payloadType":"string","repeat":"","crontab":"","once":false,"x":94,"y":33.0909423828125,"z":"b7bbf3c7.48441","wires":[["da6be638.259418"]]},{"id":"8e76964b.718968","type":"debug","name":"","active":true,"console":"false","complete":"payload","x":456.9999542236328,"y":217.09092712402344,"z":"b7bbf3c7.48441","wires":[]},{"id":"7bcbd7c9.843428","type":"function","name":"Parse response buffer into string","func":"msg.payload = msg.payload.toString('utf8');\nreturn msg;","outputs":1,"noerr":0,"x":342.9999694824219,"y":174.0909194946289,"z":"b7bbf3c7.48441","wires":[["8e76964b.718968"]]},{"id":"da6be638.259418","type":"function","name":"Set GET request string","func":"msg.payload = \"GET / HTTP/1.1\\r\\n\\r\\nHost: www.google.com\"\nreturn msg;","outputs":1,"noerr":0,"x":151,"y":88.0909423828125,"z":"b7bbf3c7.48441","wires":[["23fa21f1.dc05de"]]}]

總結(jié)

在本講座中,您已經(jīng)看到一系列使用Node-RED中可用的處理和通信節(jié)點(diǎn)的小例子。 正如你所看到的,將現(xiàn)實(shí)世界輸入的基本流連接在一起,進(jìn)行一些處理,如簡(jiǎn)單的數(shù)據(jù)分析和返回結(jié)果是非常簡(jiǎn)單快捷的。

在這些示例中,您只是做了很少或沒(méi)有編碼,但仍然能夠構(gòu)建相當(dāng)復(fù)雜的程序 ——這就是Node-RED的強(qiáng)大功能。

下一個(gè)講座是對(duì)簡(jiǎn)易Node-RED中可用的基本節(jié)點(diǎn)的集合整理以及FRED服務(wù)提供的擴(kuò)展庫(kù)的快速匯總。 您可以閱讀講座來(lái)了解默認(rèn)功能,您也可以將講座作為參考,并使用它來(lái)查找本講座系列中使用的每個(gè)節(jié)點(diǎn)的示例。這節(jié)課將介紹Node-RED可視化工具,讓你開(kāi)始建立你的第一個(gè)流。您將學(xué)習(xí)如何創(chuàng)建簡(jiǎn)單的流,通過(guò)使用調(diào)試節(jié)點(diǎn)跟蹤消息流以及如何使用function節(jié)點(diǎn)編寫(xiě)簡(jiǎn)單的JavaScript代碼,調(diào)整節(jié)點(diǎn)以適應(yīng)您的具體需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容