上一章節(jié)介紹,實(shí)現(xiàn)了串口與MQTT服務(wù)器間的數(shù)據(jù)透明傳輸,本章節(jié)將在原有的基礎(chǔ)上,增加 LED 控制業(yè)務(wù),以此為例來介紹如何在透?jìng)鲾?shù)據(jù)流中增加必要的擴(kuò)展業(yè)務(wù)。
?簡(jiǎn)介
常見的串口服務(wù)器產(chǎn)品,在實(shí)現(xiàn)了數(shù)據(jù)透?jìng)鳂I(yè)務(wù)的同時(shí),會(huì)根據(jù)不同的應(yīng)用場(chǎng)景擴(kuò)展一些額外的輔助業(yè)務(wù),如DI/DO、ADC采集等。
通過EsDAMPC-ZC1應(yīng)用——串口服務(wù)器(一)章節(jié),完成了串口MQTT服務(wù)器的核心業(yè)務(wù),實(shí)現(xiàn)了串口與MQTT服務(wù)器間的數(shù)據(jù)透明傳輸。根據(jù)項(xiàng)目需求,本章節(jié)將在原有的基礎(chǔ)上,增加 LED 控制業(yè)務(wù)。以此為例來介紹如何在透?jìng)鲾?shù)據(jù)流中增加必要的擴(kuò)展業(yè)務(wù)。
?業(yè)務(wù)擴(kuò)展
一、數(shù)據(jù)解析增加系統(tǒng)控制業(yè)務(wù),需要在流圖中,對(duì)數(shù)據(jù)流進(jìn)行數(shù)據(jù)解析,解析出系統(tǒng)所支持的控制命令和參數(shù)。
1. 命令格式
擴(kuò)展控制命令前,先制定出命令格式,本示例以較為簡(jiǎn)易的方式實(shí)現(xiàn)了命令和參數(shù)的組合,如下所示。[command]@[parameter]以@作為分隔符,組合命令(command)和參數(shù)(parameter),均為字符串類型。2. 節(jié)點(diǎn)介紹實(shí)現(xiàn)自定義的數(shù)據(jù)解析功能,通常需要開發(fā)符合需求的節(jié)點(diǎn),或是直接通過腳本節(jié)點(diǎn)來實(shí)現(xiàn)。當(dāng)功能比較簡(jiǎn)單的時(shí),建議直接使用腳本節(jié)點(diǎn)(fscript)來實(shí)現(xiàn)。2.1 fscriptfscript 節(jié)點(diǎn),支持用戶自定義編輯一段可執(zhí)行腳本,可以很靈活的完成一些簡(jiǎn)單的定制化業(yè)務(wù)。*關(guān)于 fscript 腳本教學(xué)可參考《FScript 腳本引擎》:
https://awtk.zlg.cn/pro/docs/awtk_docs/FScript/fscript.html
2.11 屬性
名稱(name):節(jié)點(diǎn)名稱,用于索引查找本節(jié)點(diǎn);
顯示名稱(displayName):用于畫布上顯示的名稱;
加載時(shí)(Initialize):節(jié)點(diǎn)加載時(shí)運(yùn)行的腳本;
運(yùn)行時(shí)(Function):節(jié)點(diǎn)每次運(yùn)行時(shí)的腳本;
銷毀時(shí)(Finalize):節(jié)點(diǎn)銷毀時(shí)運(yùn)行的腳。
fscript 節(jié)點(diǎn)支持輸入3段腳本,分別在節(jié)點(diǎn)加載、運(yùn)行、銷毀時(shí)進(jìn)行調(diào)用,其中加載、銷毀階段的腳本僅被調(diào)用一次。
2.2 log
log 節(jié)點(diǎn)可以將數(shù)據(jù)流中的數(shù)據(jù)打印到調(diào)試接口上,方便用戶觀察數(shù)據(jù)流中的數(shù)據(jù)。2.2.1 屬性
名稱(name):節(jié)點(diǎn)名稱,用于索引查找本節(jié)點(diǎn);
顯示名稱(displayName):用于畫布上顯示的名稱;
控制臺(tái)(log_to_console):輸出到系統(tǒng)控制臺(tái);
客戶端(log_to_client):輸出到AWFlow Designer客戶端。
2.2.2 輸入
- payload:需要打印的數(shù)據(jù);
- payloadLength:數(shù)據(jù)長(zhǎng)度,uint32_t類型;
- payloadType:指示payload的數(shù)據(jù)類型。
3. 流圖實(shí)踐
3.1 添加log節(jié)點(diǎn)在原有的串口MQTT透?jìng)髁鲌D上,并入log節(jié)點(diǎn),觀察串口上報(bào)至MQTT服務(wù)的數(shù)據(jù)。
3.2 下載并在線運(yùn)行
選擇下載流圖,并保持在線運(yùn)行,這樣可以通過AWFlow Designer 客戶端接收到 log 節(jié)點(diǎn)的消息。
通過串口助手,發(fā)送數(shù)據(jù)。
可以通過 AWFlow Designer 的調(diào)試窗口觀察到串口發(fā)送的數(shù)據(jù)。
3.3 添加命令解析腳本
在 log 和串口輸入數(shù)據(jù)流中,添加 fscript 節(jié)點(diǎn)。僅在 Function 階段輸入命令解析腳本。腳本先將輸入的數(shù)據(jù) msg.payload 轉(zhuǎn)換成字符串類型,再通過 one_of 函數(shù),以@分隔符,將字串分隔成2段,并分別賦值給 msg 的 cmd 和 arg 屬性。
/*MQTT和串口節(jié)點(diǎn)輸出為pointer類型,轉(zhuǎn)換為string*/
rbuf=rbuffer_create(msg.payload,msg.payloadLength)
s_payload=rbuffer_read_string(rbuf)
/*以@分隔符,獲取第一段字符串作為命令*/
msg.cmd=one_of(s_payload,0,"@")
/*以@分隔符,獲取第二段字符串作為參數(shù)*/
msg.arg=one_of(s_payload,1,"@")
至此,實(shí)現(xiàn)了從字符串中解析出命令和參數(shù)的功能。
二、系統(tǒng)控制
系統(tǒng)控制模塊,負(fù)責(zé)響應(yīng)解析模塊解析出來的命令,根據(jù)獲得的命令和參數(shù),執(zhí)行響應(yīng)的業(yè)務(wù)。本小節(jié),以LED控制作為系統(tǒng)控制業(yè)務(wù),實(shí)際應(yīng)用可根據(jù)項(xiàng)目需求進(jìn)行擴(kuò)展。*本小節(jié)主要使用fscript來完成LED的控制業(yè)務(wù),LED節(jié)點(diǎn)的使用可參考EsDAMPC-ZC1入門(二)——LED控制。
1. LED控制業(yè)務(wù)
1.1 添加控制腳本在數(shù)據(jù)解析腳本節(jié)點(diǎn)與log節(jié)點(diǎn)之間,并入一個(gè)新的 fscript 節(jié)點(diǎn),用于執(zhí)行LED控制業(yè)務(wù)。
LED 支持3路LED的控制命令,如下所示:
- led_red@on / off,點(diǎn)亮/熄滅紅燈;
- blue_red@on / off,點(diǎn)亮/熄滅藍(lán)燈;
- green_red@on / off,點(diǎn)亮/熄滅綠燈。
通過控制命令 msg.cmd 來指定所需要控制LED設(shè)備,msg.arg 轉(zhuǎn)換為L(zhǎng)ED控制參數(shù)。
/*LED控制命令作為設(shè)備名稱,如led_red@on*/
output.device_name=msg.cmd
if(msg.arg=="on"){
/*點(diǎn)亮LED*/
output.payload=1
}elseif(msg.arg=="off"){
/*熄滅LED*/
output.payload=0
}else{
/*終止數(shù)據(jù)流*/
aborted=1
}
1.2 添加LED節(jié)點(diǎn)繼控制腳本之后,串接3個(gè)LED節(jié)點(diǎn)。分別綁定了 led_red、led_blue、led_green。
1.3 下載驗(yàn)證
下載流圖。
通過串口助手,發(fā)送控制命令。
可以看到,板載的 LED 已經(jīng)能夠正確響應(yīng)串口的控制命令。
*注意:控制命令為字符串類型,所以命令需包含字符結(jié)束符'\0’。
三、數(shù)據(jù)分發(fā)
系統(tǒng)控制小節(jié)中,在完成LED控制的同時(shí),可以觀察到,MQTT服務(wù)器同樣接收到了控制命令,但這并非所期望的效果。
為了解決這個(gè)問題,需要實(shí)現(xiàn)數(shù)據(jù)分發(fā)功能,對(duì)數(shù)據(jù)進(jìn)行選擇??梢酝ㄟ^ aswitch 節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)流的流向選擇。
1. 節(jié)點(diǎn)介紹
1.1 aswitch
1.1.1 屬性
名稱(name):節(jié)點(diǎn)名稱,用于索引查找本節(jié)點(diǎn);
顯示名稱(displayName):用于畫布上顯示的名稱;
檢查全部(check_all):檢查所有條件;
規(guī)則表達(dá)式(rules):數(shù)據(jù)分發(fā)依據(jù)的邏輯表達(dá)式;
輸出數(shù)量(outputs):數(shù)據(jù)分發(fā)路徑數(shù)量。
2. 分發(fā)規(guī)則
2.1 添加 aswitch 節(jié)點(diǎn),并進(jìn)行如下配置。
禁止檢查所有條件,即當(dāng)遇到條件滿足時(shí),則不繼續(xù)檢查;
- 輸出路徑數(shù)配置與邏輯條件一致為 4。
msg.cmd=="led_red"
msg.cmd=="led_green"
msg.cmd=="led_blue"
msg.payloadLength>0
前3個(gè)邏輯條件,通過 msg.cmd 進(jìn)行判斷,區(qū)分控制命令,如果遇到符合的控制命令,則不會(huì)繼續(xù)匹配,后續(xù)的路徑則不會(huì)被觸發(fā)。
可以看到,在最后一條規(guī)則中,通過 msg.payloadLength 來匹配透?jìng)鲾?shù)據(jù)。
2.2接入數(shù)據(jù)分發(fā)節(jié)點(diǎn)
將 aswitch 串進(jìn)數(shù)據(jù)分析和 LED控制腳本節(jié)點(diǎn)之間,同時(shí)將MQTT上報(bào)的數(shù)據(jù)路徑修改為 aswitch 的透?jìng)鲾?shù)據(jù)輸出口上,如下所示。
2.3 下載驗(yàn)證
下載流圖。
通過串口助手,分別發(fā)送控制命令和透?jìng)鲾?shù)據(jù)。
可以看到,此時(shí)MQTT服務(wù)器不會(huì)再接收到串口端的系統(tǒng)控制命令。至此,完成了數(shù)據(jù)分發(fā)模塊。
四、遠(yuǎn)程控制
前面完成了數(shù)據(jù)解析、系統(tǒng)控制、數(shù)據(jù)分發(fā)等3大擴(kuò)展業(yè)務(wù)模塊,但是都是基于串口來實(shí)現(xiàn),是否可以同時(shí)支持MQTT遠(yuǎn)程控制業(yè)務(wù)呢?
很顯然,是可以的,而且通過復(fù)用前面的模塊,可以很簡(jiǎn)單的實(shí)現(xiàn)遠(yuǎn)程控制功能。
1. 擴(kuò)展數(shù)據(jù)分發(fā)條件
利用 msg.topic 屬性來判斷是否有來源于MQTT服務(wù)器的透?jìng)鲾?shù)據(jù),將數(shù)據(jù)分發(fā)數(shù)量擴(kuò)充到 5。
2. 調(diào)整MQTT下發(fā)數(shù)據(jù)流
將MQTT下發(fā)的數(shù)據(jù)接入到數(shù)據(jù)解析模塊,同時(shí)將串口輸出連接到數(shù)據(jù)分發(fā)的MQTT透?jìng)鬏敵隹谏?,如下所示進(jìn)行調(diào)整。
3. 下載驗(yàn)證
下載流圖。
通過MQTTX,分別發(fā)布LED控制命令和透?jìng)鲾?shù)據(jù)。
可以看到,板載的 LED 已經(jīng)能夠正確響應(yīng)串口的控制命令。
同時(shí)串口端,僅收到透?jìng)鲾?shù)據(jù)。
至此,完成了遠(yuǎn)程控制功能。
五、整理流圖至此,完成了EsDA MPC-ZC1應(yīng)用——串口服務(wù)器(一)計(jì)劃的所有需求。后續(xù)根據(jù)實(shí)際需求,在現(xiàn)有的流圖基礎(chǔ)上,繼續(xù)擴(kuò)展更多的控制命令能,將會(huì)十分簡(jiǎn)單。將流圖進(jìn)行整理,最終效果如下。
【版權(quán)聲明】本文為ZLG開發(fā)者社區(qū)用戶原創(chuàng)內(nèi)容,未經(jīng)授權(quán)不得轉(zhuǎn)載。歡迎更多用戶到社區(qū)交流互動(dòng)、創(chuàng)作博文,一經(jīng)采用,可獲得百元京東E卡。
-
led
+關(guān)注
關(guān)注
240文章
22907瀏覽量
650121 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
8701瀏覽量
84548
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論