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