本文將基于EsDA開(kāi)發(fā)套件快速實(shí)現(xiàn)將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請(qǐng)求的應(yīng)用開(kāi)發(fā),實(shí)現(xiàn)串口設(shè)備與網(wǎng)絡(luò)服務(wù)的互聯(lián)互通,提供便捷和高效的串口數(shù)據(jù)轉(zhuǎn)換功能。
?項(xiàng)目簡(jiǎn)介
HTTP協(xié)議是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,由客戶端發(fā)送請(qǐng)求消息,服務(wù)端針對(duì)客戶端的請(qǐng)求進(jìn)行響應(yīng)回復(fù)。本文將基于EsDA開(kāi)發(fā)平臺(tái),使用EPC6450-AWI開(kāi)發(fā)板,以及圖形化設(shè)計(jì)工具AWFlow Designer實(shí)現(xiàn)將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請(qǐng)求發(fā)送給云端,隨后云端針對(duì)HTTP請(qǐng)求進(jìn)行處理響應(yīng)的功能。該項(xiàng)目主要用到了serial_in_ex,fscript,http_request,fileout,timer,filein和serial_out_ex節(jié)點(diǎn),具體實(shí)現(xiàn)請(qǐng)見(jiàn)下文。
?項(xiàng)目概述
該項(xiàng)目是將串口數(shù)據(jù)通過(guò)作為HTTP客戶端的EPC6450-AWI開(kāi)發(fā)板去發(fā)送HTTP請(qǐng)求到云端服務(wù)器,在云端服務(wù)器上處理HTTP請(qǐng)求并下發(fā)響應(yīng)數(shù)據(jù)。
該項(xiàng)目的主要步驟如下:
- 配置EPC6450-AWI的網(wǎng)口設(shè)備并連接到互聯(lián)網(wǎng);
- 配置串口通信參數(shù),包括波特率,數(shù)據(jù)位,停止位和校驗(yàn)等;
- 從串口讀取HTTP請(qǐng)求參數(shù),在本項(xiàng)目中串口的輸入數(shù)據(jù)如下:POST方法主要是輸入body消息正文,GET方法主要是輸入url統(tǒng)一資源定位符;
- http_request節(jié)點(diǎn)向云端服務(wù)器發(fā)起HTTP請(qǐng)求,云端服務(wù)器處理數(shù)據(jù)后發(fā)送響應(yīng)到客戶端,客戶端接收來(lái)自云端服務(wù)器的響應(yīng)數(shù)據(jù);
- HTTP客戶端接收響應(yīng)數(shù)據(jù)后,將響應(yīng)數(shù)據(jù)中轉(zhuǎn)到文本中保存并輸出到串口進(jìn)行顯示。
?項(xiàng)目準(zhǔn)備在本文將不再贅述串口設(shè)備在EsDA的基礎(chǔ)通信,讀者可以閱讀以下文章對(duì)串口節(jié)點(diǎn)和EsDA的一些基礎(chǔ)項(xiàng)目進(jìn)行熟絡(luò):
- 【EsDA應(yīng)用】5分鐘實(shí)現(xiàn)一個(gè)串口通信業(yè)務(wù)
- 【EsDA應(yīng)用】常用IO設(shè)備節(jié)點(diǎn)詳解
- EsDAMPC-ZC1應(yīng)用——串口服務(wù)器(一)
1. 硬件準(zhǔn)備
在標(biāo)有絲印為TF Card 絲印的卡槽處,插入SD卡。
用戶可隨機(jī)選擇EPC6450-AWI的可用串口設(shè)備,在本文將用UART5進(jìn)行串口通信。在標(biāo)有絲印為UTX5,URX5的串口模塊上,將TTL轉(zhuǎn)USB串口模塊的TX與板子絲印為URX5連接,TTL轉(zhuǎn)USB串口模塊的RX與板子絲印為UTX5相連;并將TTL轉(zhuǎn)USB串口模塊另一端的USB口接入電腦。
- 在標(biāo)有絲印為Type-C 的接口處,插上Type-C線,并將Type-C線的另一端USB口插入電腦。
- 在標(biāo)有絲印為NET0或 NET1的RJ45插座處接上水晶頭,網(wǎng)線另一端水晶接頭插在PC的網(wǎng)絡(luò)插座上。
2. 網(wǎng)絡(luò)搭建
本文的網(wǎng)絡(luò)搭建是將電腦wifi通過(guò)以太網(wǎng)與開(kāi)發(fā)板進(jìn)行網(wǎng)絡(luò)共享,以此達(dá)到開(kāi)發(fā)板的以太網(wǎng)口聯(lián)網(wǎng)的目的。
將TTL轉(zhuǎn)USB串口模塊接在絲印為DUART的調(diào)試串口上(TX接RX,RX接TX)。打開(kāi)串口調(diào)試助手,檢索并打開(kāi)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與開(kāi)發(fā)板的IP地址在同一局域網(wǎng)下。
將PC上的WLAN配置共享給與開(kāi)發(fā)板連接的以太網(wǎng)。在串口調(diào)試助手輸入shell指令ping www.baidu.com,ping成功即開(kāi)發(fā)板聯(lián)網(wǎng)成功。
?項(xiàng)目實(shí)施本項(xiàng)目業(yè)務(wù)主要分為兩個(gè)部分:
- POST方法請(qǐng)求項(xiàng)目:模擬傳感器數(shù)據(jù)通過(guò)串口轉(zhuǎn)HTTP客戶端傳送到HTTP服務(wù)器,服務(wù)器進(jìn)行數(shù)據(jù)分析和處理。將串口數(shù)據(jù)作為HTTP請(qǐng)求的body參數(shù),http_request節(jié)點(diǎn)在整理屬性和輸入?yún)?shù)后對(duì)自建的HTTP服務(wù)器發(fā)起POST方法的HTTP請(qǐng)求;服務(wù)器收到請(qǐng)求后,將串口數(shù)據(jù)保存到本地的文本文件以便后續(xù)查看,下發(fā)響應(yīng)數(shù)據(jù)給客戶端;客戶端收到服務(wù)器的響應(yīng)數(shù)據(jù)經(jīng)過(guò)數(shù)據(jù)處理后打印到串口助手的界面進(jìn)行查看。
- GET方法請(qǐng)求項(xiàng)目:請(qǐng)求訪問(wèn)百度服務(wù)器。串口提供HTTP請(qǐng)求參數(shù),http_request節(jié)點(diǎn)整理屬性和輸入?yún)?shù)對(duì)百度服務(wù)器發(fā)起GET方法的HTTP請(qǐng)求;http_request節(jié)點(diǎn)接收來(lái)自百度服務(wù)器的響應(yīng)數(shù)據(jù),將數(shù)據(jù)保存到指定的文本文件中存儲(chǔ)再?gòu)奈谋局袑?shù)據(jù)輸出到串口助手的界面上。
1. POST方法請(qǐng)求
本項(xiàng)目由串口助手模擬將采集的傳感器數(shù)據(jù)通過(guò)開(kāi)發(fā)板的串口傳輸?shù)介_(kāi)發(fā)板創(chuàng)建的HTTP客戶端,HTTP客戶端再通過(guò)POST方法將傳感器數(shù)據(jù)作為body參數(shù)去請(qǐng)求本地搭建的HTTP服務(wù)器,HTTP服務(wù)器接收到請(qǐng)求后,將傳感器數(shù)據(jù)存儲(chǔ)到本地的index.html文件中,并將數(shù)據(jù)處理后作為響應(yīng)體回發(fā)給客戶端,HTTP客戶端接收到響應(yīng)消息后打印到串口助手上進(jìn)行顯示。
1.1 流圖繪制
添加serial_in_ex,fscript,http_request,fileout,timer,filein和serial_out_ex節(jié)點(diǎn)到畫(huà)布中并連線如下圖。
1.2 節(jié)點(diǎn)配置
在本文的serial_in_ex和serial_out_ex節(jié)點(diǎn)配置參數(shù)和操作一致,后面不再贅述serial_out_ex節(jié)點(diǎn)的配置操作。雙擊serial_in_ex節(jié)點(diǎn),點(diǎn)擊配置節(jié)點(diǎn)名旁邊的鉛筆圖標(biāo)。
選擇用戶使用的串口設(shè)備,根據(jù)實(shí)際需求配置波特率,奇偶校驗(yàn)等串口配置參數(shù),本項(xiàng)目中的串口配置參數(shù)如下圖所示。
雙擊serial_in_ex的消費(fèi)者節(jié)點(diǎn)fscript,因?yàn)楸卷?xiàng)目主要是將采集到的傳感器數(shù)據(jù)作為消息體參數(shù)發(fā)送到HTTP服務(wù)器進(jìn)行處理,所以該fscript主要是將讀取到的serial_in_ex串口數(shù)據(jù)賦值給http_request節(jié)點(diǎn)的body參數(shù)如下:
msg.body = istream_read_string(msg.istream, 100)
雙擊http_request節(jié)點(diǎn),配置方法為POST,并設(shè)置用戶想要訪問(wèn)的HTTP服務(wù)器URL(這里的HTTP服務(wù)器是筆者本地用python搭建的一個(gè)簡(jiǎn)易HTTP服務(wù)器),根據(jù)需要選擇輸出的內(nèi)容類型,其他參數(shù)按需配置即可。雙擊http_request節(jié)點(diǎn)的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是存儲(chǔ)http_request節(jié)點(diǎn)的輸出參數(shù)msg.payloadLength,用于后續(xù)賦值給filein節(jié)點(diǎn)的輸入?yún)?shù)讀取的數(shù)據(jù)長(zhǎng)度。
set(global.length, msg.payloadLength)
雙擊fileout節(jié)點(diǎn),配置屬性參數(shù)如下,在本項(xiàng)目中配置文件打開(kāi)模式為從頭寫(xiě)入且丟棄源文件內(nèi)容,文件名選擇開(kāi)發(fā)板上自動(dòng)掛載的/flow目錄下的文件,數(shù)據(jù)來(lái)源選擇payload形式。雙擊timer節(jié)點(diǎn),配置定時(shí)周期時(shí)長(zhǎng),定時(shí)用filein節(jié)點(diǎn)去讀取存放HTTP響應(yīng)的數(shù)據(jù)。
雙擊timer的消費(fèi)者節(jié)點(diǎn)fscript,配置filein節(jié)點(diǎn)的輸入?yún)?shù)如下:
set(msg.topic,"exec:read_data");var length = global.lengthset(msg.payload,length);
雙擊filein節(jié)點(diǎn),配置需要讀取的文件名。
雙擊filein的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要將從filein節(jié)點(diǎn)讀取到的數(shù)據(jù)轉(zhuǎn)換給serial_out_ex節(jié)點(diǎn)。
set(output.payload,str(msg.payload,true));
雙擊serial_out_ex節(jié)點(diǎn),該節(jié)點(diǎn)配置參數(shù)與serial_in_ex節(jié)點(diǎn)一樣。
1.3 本地HTTP服務(wù)器搭建
筆者用python腳本搭建了一個(gè)簡(jiǎn)易的HTTP服務(wù)器,主要功能是收到的POST請(qǐng)求中的消息體數(shù)據(jù)存儲(chǔ)到本地的index.html文本中,并將收到的消息體數(shù)據(jù)處理后作為響應(yīng)體回發(fā)給客戶端。在PC端執(zhí)行以下http_server.py的腳本即開(kāi)啟了本地的HTTP服務(wù)端。
from http.server import BaseHTTPRequestHandler, HTTPServerimport logging
class S(BaseHTTPRequestHandler): def do_HEAD(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers()
def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length)
logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n", str(self.path), str(self.headers), post_data.decode('utf-8'))
res = "You Input: " + post_data.decode('utf-8') with open("index.html","a+") as f: f.write(post_data.decode('utf-8'))
self.do_HEAD() self.wfile.write("{}".format(res).encode('utf-8'))
def respond(self, opts): response = self.handle_http(opts['status'], self.path) self.wfile.write(response)
def handle_http(self, status_code, path): self.send_response(status_code) self.send_header('Content-type', 'text/html') self.end_headers() content = ''' Title goes here.
This is a test.
You accessed path: {}
'''.format(path) return bytes(content, 'UTF-8')
def run(server_class=HTTPServer, handler_class=S, port=8080): print("run()") logging.basicConfig(level=logging.INFO) server_address = ('', port) httpd = server_class(server_address, handler_class) logging.info('Starting http server...\n') try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() print("httpd.server_close()") logging.info('Stopping http server...\n')
if __name__ == '__main__': from sys import argv
if len(argv) == 2: run(port=int(argv[1])) else: run()
1.4 下載運(yùn)行
將流圖下載到目標(biāo)開(kāi)發(fā)板后,在串口調(diào)試助手輸入HTTP請(qǐng)求的消息體(模擬的傳感器數(shù)據(jù))后,就可以在串口助手輸出界面看到返回的響應(yīng)內(nèi)容如下:本地的HTTP服務(wù)器端收到的來(lái)自客戶端的請(qǐng)求信息如下:打開(kāi)PC本地的index.html文本,可以看到保存的傳感器數(shù)據(jù)如下:至此,串口轉(zhuǎn)HTTP客戶端的傳感器數(shù)據(jù)上云的實(shí)驗(yàn)就已完全結(jié)束,接下來(lái)開(kāi)啟訪問(wèn)百度游覽器的HTTP請(qǐng)求實(shí)驗(yàn)。
2. GET方法請(qǐng)求
該項(xiàng)目主要是通過(guò)GET方法請(qǐng)求百度服務(wù)器,最后將百度服務(wù)器響應(yīng)的消息進(jìn)行打印顯示,主要是將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請(qǐng)求,發(fā)送到服務(wù)器端,以實(shí)現(xiàn)與遠(yuǎn)程服務(wù)器的通信。
2.1 流圖繪制
添加serial_in_ex,fscript,http_request,fileout,timer,filein和serial_out_ex節(jié)點(diǎn)到畫(huà)布中并連線如下圖。
2.2 節(jié)點(diǎn)配置
在本文的serial_in_ex和serial_out_ex節(jié)點(diǎn)配置參數(shù)和操作一致,后面不再贅述serial_out_ex節(jié)點(diǎn)的配置操作。雙擊serial_in_ex節(jié)點(diǎn),點(diǎn)擊配置節(jié)點(diǎn)名旁邊的鉛筆圖標(biāo)。
選擇用戶使用的串口設(shè)備,根據(jù)實(shí)際需求配置波特率,奇偶校驗(yàn)等串口配置參數(shù),本項(xiàng)目中的串口配置參數(shù)如下圖所示。
雙擊serial_in_ex的消費(fèi)者節(jié)點(diǎn)fscript,因?yàn)楸卷?xiàng)目主要是對(duì)HTTP協(xié)議的GET方法進(jìn)行數(shù)據(jù)請(qǐng)求,而GET的請(qǐng)求參數(shù)是拼接在URL的后面,所以串口輸入的主要是http_request節(jié)點(diǎn)的URL配置項(xiàng),該fscript主要是讀取serial_in_ex的串口數(shù)據(jù),如下:
var str = istream_read_string(msg.istream, 100)msg.url = str
雙擊http_request節(jié)點(diǎn),配置方法為GET,并設(shè)置用戶想要訪問(wèn)的云端服務(wù)器URL,根據(jù)需要選擇輸出內(nèi)容類型,其他參數(shù)按需配置即可。
雙擊http_request節(jié)點(diǎn)的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要是存儲(chǔ)http_request節(jié)點(diǎn)的輸出參數(shù)msg.payloadLength,用于后續(xù)賦值給filein節(jié)點(diǎn)的輸入?yún)?shù)讀取的數(shù)據(jù)長(zhǎng)度。
set(global.length, msg.payloadLength)
雙擊fileout節(jié)點(diǎn),配置屬性參數(shù)如下,在本項(xiàng)目中配置文件打開(kāi)模式為從頭寫(xiě)入且丟棄源文件內(nèi)容,文件名選擇開(kāi)發(fā)板上自動(dòng)掛載的/flow目錄下的文件,數(shù)據(jù)來(lái)源選擇payload形式。雙擊timer節(jié)點(diǎn),配置定時(shí)周期時(shí)長(zhǎng),定時(shí)用filein節(jié)點(diǎn)去讀取存放HTTP響應(yīng)的數(shù)據(jù)。
雙擊timer的消費(fèi)者節(jié)點(diǎn)fscript,配置filein節(jié)點(diǎn)的輸入?yún)?shù)如下:
set(msg.topic,"exec:read_data");var length = global.lengthset(msg.payload,length);
雙擊filein節(jié)點(diǎn),配置需要讀取的文件名。
雙擊filein的消費(fèi)者節(jié)點(diǎn)fscript,該節(jié)點(diǎn)主要將從filein節(jié)點(diǎn)讀取到的數(shù)據(jù)轉(zhuǎn)換給serial_out_ex節(jié)點(diǎn)。
set(output.payload,str(msg.payload,true));
雙擊serial_out_ex節(jié)點(diǎn),該節(jié)點(diǎn)配置參數(shù)與serial_in_ex節(jié)點(diǎn)一樣。
2.3 下載驗(yàn)證
將該流圖下載到目標(biāo)開(kāi)發(fā)板后,在串口調(diào)試助手輸入HTTP請(qǐng)求的云端URL后,可以看到返回的響應(yīng)消息,具體如下圖。至此該實(shí)驗(yàn)到此結(jié)束。
-
HTTP
+關(guān)注
關(guān)注
0文章
504瀏覽量
31197 -
數(shù)據(jù)轉(zhuǎn)換
+關(guān)注
關(guān)注
0文章
87瀏覽量
17998 -
ESDA
+關(guān)注
關(guān)注
0文章
28瀏覽量
7505
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論