本文將基于EsDA開發(fā)套件快速實現(xiàn)將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請求的應(yīng)用開發(fā),實現(xiàn)串口設(shè)備與網(wǎng)絡(luò)服務(wù)的互聯(lián)互通,提供便捷和高效的串口數(shù)據(jù)轉(zhuǎn)換功能。
?項目簡介
HTTP協(xié)議是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,由客戶端發(fā)送請求消息,服務(wù)端針對客戶端的請求進行響應(yīng)回復(fù)。本文將基于EsDA開發(fā)平臺,使用EPC6450-AWI開發(fā)板,以及圖形化設(shè)計工具AWFlow Designer實現(xiàn)將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請求發(fā)送給云端,隨后云端針對HTTP請求進行處理響應(yīng)的功能。該項目主要用到了serial_in_ex,fscript,http_request,fileout,timer,filein和serial_out_ex節(jié)點,具體實現(xiàn)請見下文。
?項目概述
該項目是將串口數(shù)據(jù)通過作為HTTP客戶端的EPC6450-AWI開發(fā)板去發(fā)送HTTP請求到云端服務(wù)器,在云端服務(wù)器上處理HTTP請求并下發(fā)響應(yīng)數(shù)據(jù)。
該項目的主要步驟如下:
- 配置EPC6450-AWI的網(wǎng)口設(shè)備并連接到互聯(lián)網(wǎng);
- 配置串口通信參數(shù),包括波特率,數(shù)據(jù)位,停止位和校驗等;
- 從串口讀取HTTP請求參數(shù),在本項目中串口的輸入數(shù)據(jù)如下:POST方法主要是輸入body消息正文,GET方法主要是輸入url統(tǒng)一資源定位符;
- http_request節(jié)點向云端服務(wù)器發(fā)起HTTP請求,云端服務(wù)器處理數(shù)據(jù)后發(fā)送響應(yīng)到客戶端,客戶端接收來自云端服務(wù)器的響應(yīng)數(shù)據(jù);
- HTTP客戶端接收響應(yīng)數(shù)據(jù)后,將響應(yīng)數(shù)據(jù)中轉(zhuǎn)到文本中保存并輸出到串口進行顯示。
?項目準備在本文將不再贅述串口設(shè)備在EsDA的基礎(chǔ)通信,讀者可以閱讀以下文章對串口節(jié)點和EsDA的一些基礎(chǔ)項目進行熟絡(luò):
- 【EsDA應(yīng)用】5分鐘實現(xiàn)一個串口通信業(yè)務(wù)
- 【EsDA應(yīng)用】常用IO設(shè)備節(jié)點詳解
- EsDAMPC-ZC1應(yīng)用——串口服務(wù)器(一)
1. 硬件準備
在標有絲印為TF Card 絲印的卡槽處,插入SD卡。
用戶可隨機選擇EPC6450-AWI的可用串口設(shè)備,在本文將用UART5進行串口通信。在標有絲印為UTX5,URX5的串口模塊上,將TTL轉(zhuǎn)USB串口模塊的TX與板子絲印為URX5連接,TTL轉(zhuǎn)USB串口模塊的RX與板子絲印為UTX5相連;并將TTL轉(zhuǎn)USB串口模塊另一端的USB口接入電腦。
- 在標有絲印為Type-C 的接口處,插上Type-C線,并將Type-C線的另一端USB口插入電腦。
- 在標有絲印為NET0或 NET1的RJ45插座處接上水晶頭,網(wǎng)線另一端水晶接頭插在PC的網(wǎng)絡(luò)插座上。
2. 網(wǎng)絡(luò)搭建
本文的網(wǎng)絡(luò)搭建是將電腦wifi通過以太網(wǎng)與開發(fā)板進行網(wǎng)絡(luò)共享,以此達到開發(fā)板的以太網(wǎng)口聯(lián)網(wǎng)的目的。
將TTL轉(zhuǎn)USB串口模塊接在絲印為DUART的調(diào)試串口上(TX接RX,RX接TX)。打開串口調(diào)試助手,檢索并打開TTL轉(zhuǎn)USB串口模塊的設(shè)備端口號后,使用shell命令ip addr,查看網(wǎng)口的ip地址,根據(jù)下圖可知,本文使用的網(wǎng)口設(shè)備ip地址是192.168.137.251。配置PC上的以太網(wǎng)的IP與開發(fā)板的IP地址在同一局域網(wǎng)下。
將PC上的WLAN配置共享給與開發(fā)板連接的以太網(wǎng)。在串口調(diào)試助手輸入shell指令ping www.baidu.com,ping成功即開發(fā)板聯(lián)網(wǎng)成功。
?項目實施本項目業(yè)務(wù)主要分為兩個部分:
- POST方法請求項目:模擬傳感器數(shù)據(jù)通過串口轉(zhuǎn)HTTP客戶端傳送到HTTP服務(wù)器,服務(wù)器進行數(shù)據(jù)分析和處理。將串口數(shù)據(jù)作為HTTP請求的body參數(shù),http_request節(jié)點在整理屬性和輸入?yún)?shù)后對自建的HTTP服務(wù)器發(fā)起POST方法的HTTP請求;服務(wù)器收到請求后,將串口數(shù)據(jù)保存到本地的文本文件以便后續(xù)查看,下發(fā)響應(yīng)數(shù)據(jù)給客戶端;客戶端收到服務(wù)器的響應(yīng)數(shù)據(jù)經(jīng)過數(shù)據(jù)處理后打印到串口助手的界面進行查看。
- GET方法請求項目:請求訪問百度服務(wù)器。串口提供HTTP請求參數(shù),http_request節(jié)點整理屬性和輸入?yún)?shù)對百度服務(wù)器發(fā)起GET方法的HTTP請求;http_request節(jié)點接收來自百度服務(wù)器的響應(yīng)數(shù)據(jù),將數(shù)據(jù)保存到指定的文本文件中存儲再從文本中將數(shù)據(jù)輸出到串口助手的界面上。
1. POST方法請求
本項目由串口助手模擬將采集的傳感器數(shù)據(jù)通過開發(fā)板的串口傳輸?shù)介_發(fā)板創(chuàng)建的HTTP客戶端,HTTP客戶端再通過POST方法將傳感器數(shù)據(jù)作為body參數(shù)去請求本地搭建的HTTP服務(wù)器,HTTP服務(wù)器接收到請求后,將傳感器數(shù)據(jù)存儲到本地的index.html文件中,并將數(shù)據(jù)處理后作為響應(yīng)體回發(fā)給客戶端,HTTP客戶端接收到響應(yīng)消息后打印到串口助手上進行顯示。
1.1 流圖繪制
添加serial_in_ex,fscript,http_request,fileout,timer,filein和serial_out_ex節(jié)點到畫布中并連線如下圖。
1.2 節(jié)點配置
在本文的serial_in_ex和serial_out_ex節(jié)點配置參數(shù)和操作一致,后面不再贅述serial_out_ex節(jié)點的配置操作。雙擊serial_in_ex節(jié)點,點擊配置節(jié)點名旁邊的鉛筆圖標。
選擇用戶使用的串口設(shè)備,根據(jù)實際需求配置波特率,奇偶校驗等串口配置參數(shù),本項目中的串口配置參數(shù)如下圖所示。
雙擊serial_in_ex的消費者節(jié)點fscript,因為本項目主要是將采集到的傳感器數(shù)據(jù)作為消息體參數(shù)發(fā)送到HTTP服務(wù)器進行處理,所以該fscript主要是將讀取到的serial_in_ex串口數(shù)據(jù)賦值給http_request節(jié)點的body參數(shù)如下:
msg.body = istream_read_string(msg.istream, 100)
雙擊http_request節(jié)點,配置方法為POST,并設(shè)置用戶想要訪問的HTTP服務(wù)器URL(這里的HTTP服務(wù)器是筆者本地用python搭建的一個簡易HTTP服務(wù)器),根據(jù)需要選擇輸出的內(nèi)容類型,其他參數(shù)按需配置即可。雙擊http_request節(jié)點的消費者節(jié)點fscript,該節(jié)點主要是存儲http_request節(jié)點的輸出參數(shù)msg.payloadLength,用于后續(xù)賦值給filein節(jié)點的輸入?yún)?shù)讀取的數(shù)據(jù)長度。
set(global.length, msg.payloadLength)
雙擊fileout節(jié)點,配置屬性參數(shù)如下,在本項目中配置文件打開模式為從頭寫入且丟棄源文件內(nèi)容,文件名選擇開發(fā)板上自動掛載的/flow目錄下的文件,數(shù)據(jù)來源選擇payload形式。雙擊timer節(jié)點,配置定時周期時長,定時用filein節(jié)點去讀取存放HTTP響應(yīng)的數(shù)據(jù)。
雙擊timer的消費者節(jié)點fscript,配置filein節(jié)點的輸入?yún)?shù)如下:
set(msg.topic,"exec:read_data");var length = global.lengthset(msg.payload,length);
雙擊filein節(jié)點,配置需要讀取的文件名。
雙擊filein的消費者節(jié)點fscript,該節(jié)點主要將從filein節(jié)點讀取到的數(shù)據(jù)轉(zhuǎn)換給serial_out_ex節(jié)點。
set(output.payload,str(msg.payload,true));
雙擊serial_out_ex節(jié)點,該節(jié)點配置參數(shù)與serial_in_ex節(jié)點一樣。
1.3 本地HTTP服務(wù)器搭建
筆者用python腳本搭建了一個簡易的HTTP服務(wù)器,主要功能是收到的POST請求中的消息體數(shù)據(jù)存儲到本地的index.html文本中,并將收到的消息體數(shù)據(jù)處理后作為響應(yīng)體回發(fā)給客戶端。在PC端執(zhí)行以下http_server.py的腳本即開啟了本地的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 下載運行
將流圖下載到目標開發(fā)板后,在串口調(diào)試助手輸入HTTP請求的消息體(模擬的傳感器數(shù)據(jù))后,就可以在串口助手輸出界面看到返回的響應(yīng)內(nèi)容如下:本地的HTTP服務(wù)器端收到的來自客戶端的請求信息如下:
打開PC本地的index.html文本,可以看到保存的傳感器數(shù)據(jù)如下:
至此,串口轉(zhuǎn)HTTP客戶端的傳感器數(shù)據(jù)上云的實驗就已完全結(jié)束,接下來開啟訪問百度游覽器的HTTP請求實驗。
2. GET方法請求
該項目主要是通過GET方法請求百度服務(wù)器,最后將百度服務(wù)器響應(yīng)的消息進行打印顯示,主要是將串口數(shù)據(jù)轉(zhuǎn)換為HTTP請求,發(fā)送到服務(wù)器端,以實現(xiàn)與遠程服務(wù)器的通信。
2.1 流圖繪制
添加serial_in_ex,fscript,http_request,fileout,timer,filein和serial_out_ex節(jié)點到畫布中并連線如下圖。
2.2 節(jié)點配置
在本文的serial_in_ex和serial_out_ex節(jié)點配置參數(shù)和操作一致,后面不再贅述serial_out_ex節(jié)點的配置操作。雙擊serial_in_ex節(jié)點,點擊配置節(jié)點名旁邊的鉛筆圖標。
選擇用戶使用的串口設(shè)備,根據(jù)實際需求配置波特率,奇偶校驗等串口配置參數(shù),本項目中的串口配置參數(shù)如下圖所示。
雙擊serial_in_ex的消費者節(jié)點fscript,因為本項目主要是對HTTP協(xié)議的GET方法進行數(shù)據(jù)請求,而GET的請求參數(shù)是拼接在URL的后面,所以串口輸入的主要是http_request節(jié)點的URL配置項,該fscript主要是讀取serial_in_ex的串口數(shù)據(jù),如下:
var str = istream_read_string(msg.istream, 100)msg.url = str
雙擊http_request節(jié)點,配置方法為GET,并設(shè)置用戶想要訪問的云端服務(wù)器URL,根據(jù)需要選擇輸出內(nèi)容類型,其他參數(shù)按需配置即可。
雙擊http_request節(jié)點的消費者節(jié)點fscript,該節(jié)點主要是存儲http_request節(jié)點的輸出參數(shù)msg.payloadLength,用于后續(xù)賦值給filein節(jié)點的輸入?yún)?shù)讀取的數(shù)據(jù)長度。
set(global.length, msg.payloadLength)
雙擊fileout節(jié)點,配置屬性參數(shù)如下,在本項目中配置文件打開模式為從頭寫入且丟棄源文件內(nèi)容,文件名選擇開發(fā)板上自動掛載的/flow目錄下的文件,數(shù)據(jù)來源選擇payload形式。雙擊timer節(jié)點,配置定時周期時長,定時用filein節(jié)點去讀取存放HTTP響應(yīng)的數(shù)據(jù)。
雙擊timer的消費者節(jié)點fscript,配置filein節(jié)點的輸入?yún)?shù)如下:
set(msg.topic,"exec:read_data");var length = global.lengthset(msg.payload,length);
雙擊filein節(jié)點,配置需要讀取的文件名。
雙擊filein的消費者節(jié)點fscript,該節(jié)點主要將從filein節(jié)點讀取到的數(shù)據(jù)轉(zhuǎn)換給serial_out_ex節(jié)點。
set(output.payload,str(msg.payload,true));
雙擊serial_out_ex節(jié)點,該節(jié)點配置參數(shù)與serial_in_ex節(jié)點一樣。
2.3 下載驗證
將該流圖下載到目標開發(fā)板后,在串口調(diào)試助手輸入HTTP請求的云端URL后,可以看到返回的響應(yīng)消息,具體如下圖。至此該實驗到此結(jié)束。
-
HTTP
+關(guān)注
關(guān)注
0文章
530瀏覽量
34426 -
數(shù)據(jù)轉(zhuǎn)換
+關(guān)注
關(guān)注
0文章
94瀏覽量
18391 -
ESDA
+關(guān)注
關(guān)注
0文章
28瀏覽量
7920
發(fā)布評論請先 登錄
外部晶振在USB轉(zhuǎn)串口模塊的應(yīng)用

新一代PLC控制軟件平臺EsDA-AWStudio

在KaihongOS應(yīng)用開發(fā)中,如何通過HTTP發(fā)起一個數(shù)據(jù)請求
USB轉(zhuǎn)串口芯片CH9101介紹

評論