本文將基于EsDA開發(fā)套件快速在開發(fā)板上搭建HTTP服務(wù)器,為HTTP客戶端提供了訪問板子的外設(shè)資源,數(shù)據(jù)以及文件讀寫等接口,實(shí)現(xiàn)設(shè)備與網(wǎng)絡(luò)服務(wù)的互聯(lián)互通。
項(xiàng)目簡介
在物聯(lián)網(wǎng)應(yīng)用中,在開發(fā)板上搭建HTTP服務(wù)器是一項(xiàng)很重要的技術(shù),可以實(shí)現(xiàn)設(shè)備間的數(shù)據(jù)通信和遠(yuǎn)程控制。本文將介紹如何使用?EPC6450-AWI開發(fā)板?,以及圖形化設(shè)計(jì)工具AWFlow Designer搭建HTTP服務(wù)器,對(duì)設(shè)備數(shù)據(jù)進(jìn)行遠(yuǎn)程訪問和控制。
項(xiàng)目概述
當(dāng)客戶端發(fā)送HTTP請(qǐng)求時(shí),服務(wù)器接收請(qǐng)求,并根據(jù)請(qǐng)求的內(nèi)容做出相應(yīng)的處理,如讀寫開發(fā)板資源的配置和數(shù)據(jù),讀寫文件等操作。開發(fā)板搭建的HTTP服務(wù)器,通過HTTP協(xié)議與客戶端進(jìn)行通信。本文HTTP服務(wù)器的項(xiàng)目可為客戶端提供以下五個(gè)接口:
寫內(nèi)容到開發(fā)板的文件中;讀開發(fā)板中的文件內(nèi)容;提供讀取ADC通道的電壓值;提供讀取溫濕度傳感器的溫度值和濕度值;提供設(shè)置Modbus從站的寄存器值。本項(xiàng)目采用的Modbus從站是模擬Modbus從站設(shè)備的上位機(jī)Modbus Slave(工具使用請(qǐng)見【EsDA 應(yīng)用】Modbus RTU Master 轉(zhuǎn) MQTT 的“3.2.4、Modbus Slave安裝并使用”章節(jié))。
前期準(zhǔn)備
讀者可以閱讀以下文章對(duì)HTTP通信和EsDA的一些基礎(chǔ)項(xiàng)目操作進(jìn)行熟絡(luò):
【EsDA?應(yīng)用】快速實(shí)現(xiàn)串口轉(zhuǎn)HTTP請(qǐng)求
【EsDA應(yīng)用】Modbus應(yīng)用詳解
【EsDA應(yīng)用】5分鐘實(shí)現(xiàn)一個(gè)串口通信業(yè)務(wù)
【EsDA?應(yīng)用】常用IO設(shè)備節(jié)點(diǎn)詳解
1. 硬件準(zhǔn)備
-
-
- 在標(biāo)有絲印為
TF Card
-
- 絲印的卡槽處,插入
SD卡
-
- 。在標(biāo)有絲印為
DUART
-
- 的調(diào)試串口模塊上,將TTL轉(zhuǎn)USB串口模塊的TX與板子絲印為RXD連接,TTL轉(zhuǎn)USB串口模塊的RX與板子絲印為TXD相連;并將TTL轉(zhuǎn)USB串口模塊的USB端口接入電腦。在標(biāo)有絲印為
Type-C
-
- 的接口處,插上Type-C線,并將Type-C線的另一端USB口插入電腦。在標(biāo)有絲印為
NET0 或 NET1
- 的RJ45插座處接上網(wǎng)線的水晶頭,網(wǎng)線另一端的水晶頭插在PC的網(wǎng)絡(luò)接口處。
-
1.1 提供溫濕度傳感器值的接口項(xiàng)目
在標(biāo)有絲印為?5V?的排針針腳處接上溫濕度變送器的 DC5V_+ 引腳;在標(biāo)有絲印為?GND?的排針針腳處接上溫濕度變送器的 DC5V_- 引腳;在標(biāo)有絲印為?485A?的排針針腳處接上溫濕度變送器的 RS485_A 的引腳;在標(biāo)有絲印為?485B?的排針針腳處接上溫濕度變送器的 RS485_B 的引腳上。
1.2 設(shè)置Modbus從站寄存器值的接口項(xiàng)目
在標(biāo)有絲印位?5V?的排針針腳處接上USB轉(zhuǎn)485串口設(shè)備的 +5V 電源引腳;在標(biāo)有絲印位?GND?的排針針腳處接上USB轉(zhuǎn)485串口設(shè)備的 GND 接地引腳;在標(biāo)有絲印位?485A?的排針針腳處接上USB轉(zhuǎn)485串口設(shè)備的 RS485A引腳;在標(biāo)有絲印位?485B?的排針針腳處接上USB轉(zhuǎn)485串口設(shè)備的 RS485B引腳。
2. 網(wǎng)絡(luò)搭建
打開串口調(diào)試助手,檢索并打開TTL轉(zhuǎn)USB串口模塊的設(shè)備端口號(hào)后,使用shell命令ip addr,查看網(wǎng)口的IP地址,根據(jù)下圖可知,本文使用的網(wǎng)口設(shè)備IP地址是192.168.137.251。
配置PC上的以太網(wǎng)的IP與開發(fā)板的IP地址在同一局域網(wǎng)下。
在串口調(diào)試助手輸入shell指令ping 192.168.137.223,ping成功即開發(fā)板可以單方面ping成功PC,若ping失敗則可以關(guān)閉PC端的防火墻之后再嘗試。
電腦端執(zhí)行 WIN+R 輸入cmd 回車即可打開CMD命令提示符窗口,執(zhí)行ping 192.168.137.251,ping成功則電腦可以單方面ping成功開發(fā)板。當(dāng)開發(fā)板和PC可以互ping成功則聯(lián)網(wǎng)成功。
項(xiàng)目實(shí)施
1. 寫文件接口
本接口業(yè)務(wù)主要是將寫入的文件內(nèi)容通過HTTP客戶端發(fā)送POST請(qǐng)求上傳到HTTP服務(wù)器,服務(wù)器收到請(qǐng)求后做出相應(yīng)處理??煞譃橐韵滤膫€(gè)部分:
用戶在HTTP客戶端的body中編輯需要寫入的文件內(nèi)容;
HTTP客戶端設(shè)置服務(wù)器對(duì)應(yīng)的url接口和請(qǐng)求方式,向開發(fā)板搭建的HTTP服務(wù)器發(fā)送HTTP請(qǐng)求;
HTTP服務(wù)器監(jiān)聽指定端口,處理對(duì)應(yīng)接口的請(qǐng)求并響應(yīng);
查看寫入到文件的內(nèi)容,檢驗(yàn)是否成功通過開發(fā)板搭建的HTTP服務(wù)器提供的接口,實(shí)現(xiàn)遠(yuǎn)程文件內(nèi)容的輸入。
1.1 流圖繪制
添加http_in,fscript,http_out,timer,fscript和fileout節(jié)點(diǎn)到畫布中并連線如下圖。
1.2 節(jié)點(diǎn)配置
雙擊http_in節(jié)點(diǎn),該節(jié)點(diǎn)主要是給HTTP客戶端提供一個(gè)POST方法的寫文件內(nèi)容的接口,統(tǒng)一資源定位符可以根據(jù)用戶需要更改。點(diǎn)擊完成按鈕即可保存配置。
點(diǎn)擊http_server旁邊的鉛筆圖標(biāo)對(duì)http_server節(jié)點(diǎn)進(jìn)行配置,通常情況下修改訪問的端口號(hào)即可,點(diǎn)擊更新按鈕即可保存配置。
本項(xiàng)目其他的接口都是在同一個(gè)HTTP服務(wù)器上處理,所以后續(xù)的接口添加新的http_in節(jié)點(diǎn),直接選中之前配置好的http_server,不用再重新添加新的http_server節(jié)點(diǎn)(不用重新創(chuàng)建一個(gè)http_server)。后面的接口項(xiàng)目不再贅述。
雙擊http_in節(jié)點(diǎn)的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是接收HTTP客戶端上傳消息體的內(nèi)容,并將接收寫文件接口請(qǐng)求的標(biāo)志位置一。點(diǎn)擊完成按鈕即可保存配置。
global.put_file_status = 1
global.putfile = str(msg.payload,true)
雙擊http_out節(jié)點(diǎn),可以根據(jù)用戶實(shí)際需要設(shè)置響應(yīng)碼和消息頭,本項(xiàng)目使用默認(rèn)的就可以了。點(diǎn)擊完成按鈕即可保存配置。
雙擊timer節(jié)點(diǎn),設(shè)置定時(shí)寫入文件的周期時(shí)間。雙擊timer的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是處理當(dāng)寫文件接口的http_in節(jié)點(diǎn)被觸發(fā)時(shí)那么put_file_status(寫文件標(biāo)志位)置一,之后才將收到的請(qǐng)求體的內(nèi)容寫入文件中。
if(global.put_file_status == 1) {
? ?wb = wbuffer_create()
? ?wbuffer_write_string(wb,global.putfile)
? ?output.payload = wbuffer_get_data(wb)
? ?output.payloadLength = len(global.putfile)
? ?global.put_file_status = 0
}
雙擊fileout節(jié)點(diǎn),可根據(jù)用戶需要配置屬性參數(shù)。因?yàn)楸卷?xiàng)目的數(shù)據(jù)來源是從前節(jié)點(diǎn)fscript的payload中獲取的,所以屬性數(shù)據(jù)來源選擇payload選項(xiàng)。
1.3 流圖下載
繪制完流圖后,點(diǎn)擊CTRL+S?即可保存流圖,點(diǎn)擊下載流圖。
在HTTP客戶端postman上發(fā)起寫文件請(qǐng)求,HTTP服務(wù)器收到請(qǐng)求后將寫入的內(nèi)容作為響應(yīng)返回到客戶端進(jìn)行顯示,并執(zhí)行寫文件的操作,在串口調(diào)試助手上輸入cat flow/test.txt
即可看到寫入文件的內(nèi)容。結(jié)果如下圖所示則表示HTTP服務(wù)器搭建寫文件的接口已基本實(shí)現(xiàn)。
2. 讀文件接口
本接口業(yè)務(wù)主要是HTTP客戶端發(fā)送GET方法的讀文件請(qǐng)求,HTTP服務(wù)器接收到請(qǐng)求之后將文件內(nèi)容作為響應(yīng)返回到客戶端進(jìn)行顯示??煞譃橐韵聝蓚€(gè)部分:
HTTP客戶端設(shè)置讀文件的url接口和請(qǐng)求方式,向開發(fā)板搭建的HTTP服務(wù)器發(fā)送HTTP請(qǐng)求;
HTTP服務(wù)器監(jiān)聽指定端口,接收到讀文件的請(qǐng)求后將讀文件標(biāo)志位置一,等待讀取文件內(nèi)容,并將讀到的內(nèi)容作為響應(yīng)發(fā)送到HTTP客戶端。
2.1 流圖繪制
添加http_in,fscript,http_out,timer和filein節(jié)點(diǎn)到畫布中并連線如下圖。
2.2 節(jié)點(diǎn)配置
雙擊http_in節(jié)點(diǎn),該節(jié)點(diǎn)主要是給HTTP客戶端提供一個(gè)GET方法的讀文件內(nèi)容的接口,統(tǒng)一資源定位符可以根據(jù)用戶需要更改。點(diǎn)擊完成按鈕即可保存配置。
雙擊http_in的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)的主要功能是當(dāng)HTTP服務(wù)器接收到了來自客戶端的讀文件接口的請(qǐng)求,那么將讀文件標(biāo)志位(get_file_status)置一,延時(shí)等待讀取文件的業(yè)務(wù),最后將讀取到的數(shù)據(jù)作為響應(yīng)發(fā)送到HTTP客戶端。
global.get_file_status = 1
sleep_ms(500)
msg.payload = "you get file data is "+global.getfile
http_out節(jié)點(diǎn)在本項(xiàng)目中使用默認(rèn)參數(shù)值即可。雙擊timer配置定時(shí)讀文件的周期時(shí)間。
雙擊timer的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是檢測(cè)讀文件標(biāo)志位(get_file_status)置一時(shí),設(shè)置filein節(jié)點(diǎn)的配置參數(shù)。點(diǎn)擊完成即可保存配置。
if(global.get_file_status == 1) {
? ?set(msg.topic, "exec:read_all")
? ?set(msg.payload, 4096)
? ?global.get_file_status = 0
}
雙擊filein節(jié)點(diǎn),配置需要讀取的文件名。點(diǎn)擊完成即可保存配置。
雙擊filein的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是將filein節(jié)點(diǎn)讀取出來的文件內(nèi)容,賦值給可供其他節(jié)點(diǎn)訪問的全局參數(shù)。點(diǎn)擊完成即可保存配置。
global.getfile = str(msg.payload, true)
2.3 流圖下載
繪制完流圖后,點(diǎn)擊CTRL+S?即可保存流圖,點(diǎn)擊下載流圖。
在postman中發(fā)送HTTP客戶端GET方法的讀文件請(qǐng)求,后續(xù)可以在響應(yīng)報(bào)文部分看到由HTTP服務(wù)器發(fā)出的讀取文件內(nèi)容的響應(yīng)正文。結(jié)果如下圖所示則表示HTTP服務(wù)器搭建讀文件的接口已基本實(shí)現(xiàn)。
3. 讀取ADC通道值的接口
本接口業(yè)務(wù)主要是HTTP服務(wù)器提供ADC通道的電壓值的接口,當(dāng)HTTP客戶端發(fā)起該請(qǐng)求時(shí),HTTP服務(wù)器將采集到的ADC通道電壓值作為響應(yīng)返回到HTTP客戶端進(jìn)行顯示??煞譃橐韵聝蓚€(gè)部分:
- HTTP客戶端設(shè)置服務(wù)器獲取ADC通道值的url接口和請(qǐng)求方式,向開發(fā)板搭建的HTTP服務(wù)器發(fā)送HTTP請(qǐng)求;HTTP服務(wù)器監(jiān)聽指定端口,接收到對(duì)應(yīng)接口的請(qǐng)求后將采集到的ADC通道的電壓值作為響應(yīng)并發(fā)送到HTTP客戶端。
3.1 流圖繪制
添加http_in,fscript,http_out和adc節(jié)點(diǎn)到畫布中并連線如下圖。
3.2 節(jié)點(diǎn)配置
雙擊http_in節(jié)點(diǎn),該節(jié)點(diǎn)主要是給HTTP客戶端提供一個(gè)GET方法的獲取ADC通道電壓值的接口,統(tǒng)一資源定位符可以根據(jù)用戶需要更改。點(diǎn)擊完成按鈕即可保存配置。
雙擊http_in的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要目的是將采集到的ADC通道的電壓值作為響應(yīng)發(fā)送到HTTP客戶端。點(diǎn)擊完成即可保存配置。
var a = "adc status is "+ global.adc_value
wb = wbuffer_create()
wbuffer_write_string(wb,a)
msg.payload = wbuffer_get_data(wb)
msg.payloadLength = len(a)
本項(xiàng)目中http_out節(jié)點(diǎn)使用默認(rèn)配置即可。
雙擊adc節(jié)點(diǎn),配置需要采集的通道號(hào)。點(diǎn)擊完成即可保存配置。
雙擊adc的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是將采集到的ADC電壓值賦值給全局變量,供其他節(jié)點(diǎn)使用。點(diǎn)擊完成即可保存配置。
global.adc_value="adc value is :"+" "+msg.payload + "mv"
3.3 流圖下載
繪制完流圖后,點(diǎn)擊CTRL+S?即可保存流圖,點(diǎn)擊下載流圖。
在postman中發(fā)送HTTP服務(wù)器提供的采集ADC通道值的接口請(qǐng)求,后續(xù)可以在響應(yīng)部分看到HTTP服務(wù)器返回的實(shí)時(shí)采集到的ADC電壓值。結(jié)果如下圖所示則表示HTTP服務(wù)器搭建的獲取ADC通道電壓值的接口已基本實(shí)現(xiàn)。
4. 提供讀取傳感器值的接口
本接口業(yè)務(wù)主要是HTTP服務(wù)器提供溫濕度傳感器采集的溫度和濕度值的接口,當(dāng)HTTP客戶端發(fā)起該請(qǐng)求時(shí),HTTP服務(wù)器將采集的溫濕度值作為響應(yīng)返回到HTTP客戶端進(jìn)行顯示??煞譃橐韵聝蓚€(gè)部分:
- HTTP客戶端設(shè)置獲取溫濕度傳感器值的url接口和請(qǐng)求方式,向開發(fā)板搭建的HTTP服務(wù)器發(fā)送HTTP請(qǐng)求;HTTP服務(wù)器監(jiān)聽指定端口,接收到對(duì)應(yīng)接口的請(qǐng)求后將采集到的溫濕度值作為響應(yīng)并發(fā)送到HTTP客戶端。
4.1 流圖繪制
添加http_in,fscript,http_out,modbus_master_in和modbus_parse_in節(jié)點(diǎn)到畫布中并連線如下圖。
4.2 節(jié)點(diǎn)配置
雙擊http_in節(jié)點(diǎn),該節(jié)點(diǎn)主要是給HTTP客戶端提供一個(gè)POST方法的接收溫濕度傳感器數(shù)據(jù)的接口,統(tǒng)一資源定位符可以根據(jù)用戶需要更改。點(diǎn)擊完成按鈕即可保存配置。
雙擊http_in節(jié)點(diǎn)的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要處理是將采集到的溫濕度傳感器的值作為響應(yīng)發(fā)送給HTTP客戶端。點(diǎn)擊完成按鈕即可保存配置。
msg.payload = global.temp_value
http_out節(jié)點(diǎn)配置在本項(xiàng)目中不需要任何更改,使用默認(rèn)配置即可。雙擊modbus_master_in節(jié)點(diǎn),配置溫濕度傳感器從站的相關(guān)配置信息如下。點(diǎn)擊完成即可保存配置。
點(diǎn)擊modbus_master_in節(jié)點(diǎn)的屬性主機(jī)參數(shù)配置旁邊的鉛筆圖標(biāo),因?yàn)槭峭ㄟ^RS485進(jìn)行Modbus通信,所以選擇rtu傳輸模式并選擇對(duì)應(yīng)的串口設(shè)備名,其他串口參數(shù)配置根據(jù)實(shí)際需要進(jìn)行配置,點(diǎn)擊更新即可保存配置。
雙擊modbus_parse_in節(jié)點(diǎn),因?yàn)榈刂?是溫度值,1是濕度值,所以配置節(jié)點(diǎn)參數(shù)如下所示。點(diǎn)擊完成即可保存配置。
雙擊modbus_parse_in的消費(fèi)者節(jié)點(diǎn)fscript,本節(jié)點(diǎn)主要是解析處理采集到的數(shù)據(jù),并賦值給可供其他節(jié)點(diǎn)使用的全局變量。點(diǎn)擊完成即可保存配置。
global.temp_value = "temp:"+array_get(msg.payload,0)/10+"C, "+"humi:"+array_get(msg.payload,1)/10+"RH"
4.3 流圖下載
繪制完流圖后,點(diǎn)擊CTRL+S?即可保存流圖,點(diǎn)擊下載流圖。
在postman中發(fā)送HTTP服務(wù)器提供的采集溫濕度傳感器值的接口請(qǐng)求,后續(xù)可以在響應(yīng)部分看到HTTP服務(wù)器返回的溫度值和濕度值。結(jié)果如下圖所示則表示HTTP服務(wù)器搭建的獲取溫濕度傳感器值的接口已基本實(shí)現(xiàn)。
5. 設(shè)置Modbus從站寄存器值的接口
本接口業(yè)務(wù)主要是將需要寫入的Modbus從站寄存器值通過HTTP客戶端發(fā)送POST請(qǐng)求上傳到HTTP服務(wù)器,服務(wù)器收到請(qǐng)求后做出相應(yīng)處理。可分為以下四個(gè)部分:
用戶在HTTP客戶端的body中編輯需要寫入的Modbus從站寄存器值內(nèi)容;
HTTP客戶端設(shè)置對(duì)應(yīng)的url接口和請(qǐng)求方式,向開發(fā)板搭建的HTTP服務(wù)器發(fā)送HTTP請(qǐng)求;
HTTP服務(wù)器監(jiān)聽指定端口,處理對(duì)應(yīng)接口的請(qǐng)求并響應(yīng);
查看寫入到Modbus從站寄存器的內(nèi)容,檢驗(yàn)是否成功通過開發(fā)板搭建的HTTP服務(wù)器提供的接口,實(shí)現(xiàn)Modbus從站寄存器值的遠(yuǎn)程輸入。
5.1 流圖繪制
添加http_in,fscript,http_out,modbus_parse_out和modbus_master_out節(jié)點(diǎn)到畫布中并連線如下圖。
5.2 節(jié)點(diǎn)配置
雙擊http_in節(jié)點(diǎn),該節(jié)點(diǎn)主要是給HTTP客戶端提供一個(gè)POST方法的設(shè)置Modbus從站寄存器值的接口,統(tǒng)一資源定位符可以根據(jù)用戶需要更改。點(diǎn)擊完成按鈕即可保存配置。
點(diǎn)擊http_in的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是處理將客戶端發(fā)送的請(qǐng)求消息體解析為modbus_parse_out節(jié)點(diǎn)可以接收的類型。內(nèi)容如下:
a = array_create();
str b = str(msg.payload,true)
b = replace(b,',',":")
data1 = one_of(b,1,":")
data2 = one_of(b,3,":")
data3 = one_of(b,5,":")
array_insert(a, 0, u16(data1))
array_insert(a, 1, u16(data2))
array_insert(a, 2, u16(data3))
output.payload = a;
output.slaveID = 1;
output.address = 0;
本項(xiàng)目中http_out節(jié)點(diǎn)使用默認(rèn)配置即可。
雙擊modbus_parse_out節(jié)點(diǎn),配置需要從哪個(gè)寄存器開始寫值。點(diǎn)擊完成即可保存配置。
雙擊modbus_master_out節(jié)點(diǎn),配置從機(jī)ID和寫入的寄存器類型。點(diǎn)擊完成即可保存配置。
雙擊modbus_master_out節(jié)點(diǎn)的屬性主機(jī)參數(shù)配置旁邊的鉛筆圖標(biāo),因?yàn)槭峭ㄟ^RS485進(jìn)行Modbus通信,所以選擇rtu傳輸模式并選擇對(duì)應(yīng)的串口設(shè)備名,其他串口參數(shù)配置根據(jù)實(shí)際需要進(jìn)行配置,點(diǎn)擊更新即可保存配置。
5.3 流圖下載
繪制完流圖后,點(diǎn)擊CTRL+S?即可保存流圖,點(diǎn)擊下載流圖。
在postman中發(fā)送HTTP服務(wù)器提供的設(shè)置Modbus從站寄存器值的接口請(qǐng)求,后續(xù)可以在Modbus Slave上位機(jī)中查看寫入的寄存器的值。結(jié)果如下圖所示則表示HTTP服務(wù)器搭建的設(shè)置Modbus從站寄存器值的接口已基本實(shí)現(xiàn)。