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