張宏橋 蔣虎 曾曉華 段凌飛
摘 ?要:隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,物聯(lián)網(wǎng)設(shè)備的遠(yuǎn)控技術(shù)在實(shí)現(xiàn)上變得更加快捷。其中,串口是當(dāng)前嵌入式數(shù)據(jù)傳輸技術(shù)的一種主流通訊方式,它有著協(xié)議簡單,支持全雙工傳輸?shù)忍攸c(diǎn)。本文針對(duì)常用的RS232串口,基于Websocket協(xié)議,使用支持跨平臺(tái)的網(wǎng)絡(luò)庫libevent和串口庫Serial Communication Library,研究并實(shí)現(xiàn)了Websocket與RS232之間的數(shù)據(jù)中轉(zhuǎn)。接著基于Web前端HTML5標(biāo)準(zhǔn)的Websocket特性及相關(guān)UI框架,實(shí)現(xiàn)了Web與RS232之間數(shù)據(jù)的異地操作與傳輸,將串口數(shù)據(jù)實(shí)時(shí)繪制為網(wǎng)頁圖表并最終驗(yàn)證了該系統(tǒng)設(shè)計(jì)的有效性與可擴(kuò)展性。
關(guān)鍵詞:物聯(lián)網(wǎng);遠(yuǎn)程控制;串口通訊;Websocket
中圖分類號(hào):TP311 ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
Abstract:With the development of computer technology,it becomes more efficient to implement the remote control techniques on the devices of Internet of Things.The serial port is a main method of data transmission for embedded devices,with the characteristics of simple protocol and good support for full duplex transmission.Aiming at the serial port type of RS232,this paper studies the research and implementation of data transfer between Websocket and RS232 by using the cross-platform network library of libevent and the serial port library of Serial Communication Library.Then,based on the Websocket characteristics of HTML5 and Echarts Library of Web UI framework,it realizes the remote operation and data transmission between Web and RS232,and renders the serial port data on a web page graph in real time.Finally,the validity and extensibility of the proposed system are verified.
Keywords:Internet of Things;remote control;serial port communication;Websocket
1 ? 引言(Introduction)
隨著計(jì)算機(jī)技術(shù)的發(fā)展,物聯(lián)網(wǎng)設(shè)備遠(yuǎn)程操控的實(shí)現(xiàn)變得更加快捷。串口是目前嵌入式數(shù)據(jù)傳輸?shù)闹髁鞣绞街唬兄鴧f(xié)議簡單,線路連接方便等特點(diǎn)[1]。同時(shí),在人機(jī)交互領(lǐng)域,Web前端技術(shù)也愈發(fā)成熟與穩(wěn)定,終端使用支持HTML5的瀏覽器訪問服務(wù)器頁面,即可實(shí)時(shí)控制節(jié)點(diǎn)并獲取硬件數(shù)據(jù)[2]。目前主流的前端UI設(shè)計(jì)趨于模塊化與代碼的精簡化,其本身又具有跨平臺(tái)的優(yōu)勢,使得前端的多端發(fā)布更加容易[3]。本文利用H5標(biāo)準(zhǔn)的Websocket協(xié)議,使用C/C++設(shè)計(jì)了一種跨平臺(tái)的網(wǎng)頁與串口數(shù)據(jù)交互的中轉(zhuǎn)服務(wù)端,可以在網(wǎng)頁中對(duì)本地或者遠(yuǎn)程的多個(gè)硬件串口進(jìn)行操作,同時(shí)允許用戶可以便捷地對(duì)前端UI進(jìn)行定制。
本文設(shè)計(jì)的數(shù)據(jù)操作框架如圖1所示?;赪ebsocket協(xié)議與串口編程接口,將硬件數(shù)據(jù)上送至Web控制端,同時(shí)從Web控制端將相應(yīng)的操作指令下發(fā)至數(shù)據(jù)服務(wù)端以完成具體操作。
各模塊解釋如下:(1)被控設(shè)備:即下位機(jī)設(shè)備,通過RS232協(xié)議進(jìn)行數(shù)據(jù)交互。(2)數(shù)據(jù)服務(wù)端:系統(tǒng)框架的核心,對(duì)下管理并操作多個(gè)串口數(shù)據(jù),對(duì)上接收并執(zhí)行Web控制端下發(fā)的控制指令,并在指令完成后向控制端返回相應(yīng)的結(jié)果。(3)Web控制端:人機(jī)交互界面,使用Web框架實(shí)現(xiàn),通過Websocket連接數(shù)據(jù)服務(wù)端并間接操作串口,允許控制端與服務(wù)端的異地分布。
2 ? 系統(tǒng)相關(guān)技術(shù)(System technology)
2.1 ? 串口操作
大部分的設(shè)備模塊均支持一個(gè)以上的串口來進(jìn)行通訊[4]。本文基于C/C++的編程環(huán)境,針對(duì)常用的RS232串口進(jìn)行操作。在PC級(jí)別的操作系統(tǒng)上,串口操作一般基于自身的應(yīng)用程序編程接口以文件的方式驅(qū)動(dòng)串口。本文使用支持Windows、Linux,以及Mac操作系統(tǒng)環(huán)境的Serial Communication Library庫進(jìn)行串口操作,相關(guān)功能函數(shù)如下:
信息查詢:vector
設(shè)置與打開串口:serial::Serial(strComName,nBaud,tagTimeOut),其中strComName為string類型的串口名稱,nBaud為整數(shù)類型的波特率,tagTimeOut為serial::Timeout結(jié)構(gòu)體類型的讀寫超時(shí)配置。該構(gòu)造函數(shù)默認(rèn)調(diào)用open成員函數(shù),如果打開失敗則會(huì)拋出異常信息。
關(guān)閉串口:Serial::close(),關(guān)閉當(dāng)前實(shí)例對(duì)應(yīng)的串口。
狀態(tài)查詢:Serial::isOpen(),返回當(dāng)前實(shí)例對(duì)應(yīng)串口的打開狀態(tài)。
讀取串口:Serial::read(pBuffer,nLen),從當(dāng)前串口讀緩沖區(qū)中讀取指定整數(shù)長度nLen的數(shù)據(jù)到字節(jié)指針pBuffer指向的內(nèi)存中。
寫入串口:Serial::write(pBuffer,nLen),將字節(jié)指針pBuffer指向的內(nèi)存數(shù)據(jù),寫到串口寫緩沖區(qū)中,長度為指定的整數(shù)nLen。
2.2 ? Websocket數(shù)據(jù)傳輸
Websocket是W3C標(biāo)準(zhǔn)下的一種基于Tcp的應(yīng)用層協(xié)議,利用該協(xié)議可以在Web層面快速穩(wěn)定的進(jìn)行數(shù)據(jù)流交互[5]。協(xié)議的基本操作包含安全握手,數(shù)據(jù)類型與數(shù)據(jù)流控制等內(nèi)容,關(guān)鍵的通訊狀態(tài)如下:
準(zhǔn)備連接狀態(tài):服務(wù)端建立Tcp監(jiān)聽服務(wù),等待客戶端發(fā)起連接。
握手驗(yàn)證狀態(tài):Websocket基于HTTP協(xié)議進(jìn)行握手驗(yàn)證,瀏覽器的網(wǎng)頁地址格式為ws://服務(wù)主機(jī)地址:端口(默認(rèn)80),對(duì)于HTTPS(HTTP+SSL)的加密驗(yàn)證,地址格式為wss://服務(wù)主機(jī)地址:端口(默認(rèn)443)。當(dāng)客戶端申請(qǐng)握手時(shí),在協(xié)議頭的“Sec-WebSocket-Key”字段里添加由Base64編碼的握手文本,當(dāng)服務(wù)端收到該握手信息后,提取該Base64秘鑰,并在其之后加上一段特殊字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",接著進(jìn)行SHA-1與BASE64的操作,生成應(yīng)答信息,最終賦給應(yīng)答協(xié)議頭中的“Sec-WebSocket-Accept”字段并返回給客戶端校驗(yàn),以確認(rèn)接下來的數(shù)據(jù)交互是Websocket協(xié)議訪問,而非HTTP。
數(shù)據(jù)傳輸狀態(tài):Websocket支持多種長度與消息類型的數(shù)據(jù)傳輸。常用的數(shù)據(jù)格式有文本、二進(jìn)制、PINGPONG等格式,此外還可自定義數(shù)據(jù)類型。數(shù)據(jù)長度上支持短(小于126字節(jié))、中(小于65536字節(jié))、長(小于2^64字節(jié))三種長度的數(shù)據(jù)傳輸。
由于底層的Tcp是面向流的傳輸,可以通過協(xié)議定義的控制字來解決Tcp傳輸數(shù)據(jù)的粘包、分包等問題,具體的幀頭功能解釋詳見表1。
本文使用支持跨平臺(tái)的libevent網(wǎng)絡(luò)庫,基于上述的Websocket協(xié)議原理實(shí)現(xiàn)相關(guān)服務(wù)。實(shí)現(xiàn)時(shí)需注意如下問題:(1)長數(shù)據(jù)分幀方式的不同,即數(shù)據(jù)有可能在Websocket層被分為多幀發(fā)送;也可能在Websocket層使用一幀發(fā)送,卻在Tcp層被分為了多幀。(2)服務(wù)端與客戶端在數(shù)據(jù)加密上的區(qū)別,一般情況下,服務(wù)端向客戶端發(fā)送非加密數(shù)據(jù),客戶端向服務(wù)端發(fā)送掩碼異或加密的數(shù)據(jù)。
2.3 ? Web端數(shù)據(jù)傳輸與UI設(shè)計(jì)
目前主流的H5瀏覽器均支持Websocket相關(guān)的Javascript編程接口,相關(guān)的功能函數(shù)與事件如表2所示。
在目前H5的Web標(biāo)準(zhǔn)下,可以使用各類Javascript庫高效地實(shí)現(xiàn)Web數(shù)據(jù)的渲染與交互。如JQuery庫有著編碼方便、性能高、插件豐富等特點(diǎn);EasyUI庫具有美觀的界面插件,專注于用較少的代碼開發(fā)UI。Echarts則是圖表顯示功能較為強(qiáng)大的Javascript功能庫,可以方便地集成到其他模塊當(dāng)中[6]。本文基于Echarts庫,將Websocket收到的串口數(shù)據(jù)實(shí)時(shí)繪制在瀏覽器圖表上。
3 ? 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(System design and implementation)
本文采用循環(huán)指令隊(duì)列實(shí)現(xiàn)異步串口操作,支持通過一個(gè)控制端同時(shí)操作多個(gè)串口,控制流程如圖2所示,其中“源ID”指的是下發(fā)當(dāng)前指令所用的Websocket上下文環(huán)境。
控制指令采用字符串格式,服務(wù)端接收指令并異步執(zhí)行串口操作,最終返回給控制端相應(yīng)的操作結(jié)果,具體命令與響應(yīng)的定義如下文所述。
查詢所有串口:當(dāng)控制端下發(fā)查詢命令后,數(shù)據(jù)服務(wù)端執(zhí)行串口遍歷相關(guān)功能,并返回串口列表。
打開串口:控制端下發(fā)打開串口命令,指定要打開串口的名稱、波特率等信息,數(shù)據(jù)服務(wù)端先檢查指定的串口是否存在,若存在則檢查當(dāng)前串口狀態(tài)并嘗試以指定的配置打開串口,最終異步響應(yīng)執(zhí)行結(jié)果。
關(guān)閉串口:控制端下發(fā)關(guān)閉串口命令,指定要關(guān)閉串口的名稱,數(shù)據(jù)服務(wù)端先檢查指定的串口是否存在,如果存在且串口已經(jīng)打開,則嘗試關(guān)閉串口,最終異步響應(yīng)執(zhí)行結(jié)果。
查詢串口狀態(tài):控制端下發(fā)串口查詢命令,指定要查詢串口的名稱,數(shù)據(jù)服務(wù)端先檢查指定的串口是否存在,如果存在則檢查串口的開關(guān)狀態(tài),最終異步響應(yīng)查詢結(jié)果。
寫入串口數(shù)據(jù):控制端下發(fā)寫串口命令,指定所寫的數(shù)據(jù)類型、串口號(hào),以及要寫入的數(shù)據(jù)。數(shù)據(jù)服務(wù)端先檢查指定的串口是否存在,如果存在且打開則執(zhí)行寫入操作,最終異步響應(yīng)寫入結(jié)果。其中,數(shù)據(jù)類型為0或1,0表示文本型數(shù)據(jù),1表示用Base64編碼的二進(jìn)制數(shù)據(jù)。
讀取串口數(shù)據(jù):控制端下發(fā)讀串口命令,指定要讀取的長度、串口號(hào)。數(shù)據(jù)服務(wù)端先檢查指定的串口是否存在,如果存在且打開則執(zhí)行讀取操作,最終異步響應(yīng)讀取結(jié)果。其中,實(shí)際讀取的數(shù)據(jù)長度小于等于指定的讀取長度,數(shù)據(jù)以Base64編碼的形式返回。
4 ? 系統(tǒng)功能驗(yàn)證(System function verification)
本文使用被控設(shè)備向PC串口發(fā)送隨時(shí)間變化的正弦信號(hào),Web控制端以20ms的間隔下發(fā)讀命令給數(shù)據(jù)服務(wù)端,服務(wù)端接收串口數(shù)據(jù)并上送給控制端,最終使用Echarts把數(shù)據(jù)以圖表的形式渲染出來,串口的參數(shù)以網(wǎng)頁URL的形式傳入。本文使用同一局域網(wǎng)內(nèi)的兩臺(tái)PC機(jī)進(jìn)行測試,其中一臺(tái)運(yùn)行數(shù)據(jù)服務(wù)器并與下位機(jī)用串口連接,下位機(jī)不斷向數(shù)據(jù)服務(wù)端發(fā)送正弦數(shù)值,另外一臺(tái)在瀏覽器中運(yùn)行Web控制端網(wǎng)頁,獲取串口數(shù)據(jù)并顯示,工作流程如圖3所示。
圖4顯示了數(shù)據(jù)中轉(zhuǎn)服務(wù)器啟動(dòng)后綁定了通用IP地址0.0.0.0,以及指定的端口8881,并打印出本地串口列表。圖5顯示了在同一網(wǎng)絡(luò)環(huán)境的另外一臺(tái)電腦上用瀏覽器直接打開本地網(wǎng)頁文件,即數(shù)據(jù)控制端,其啟動(dòng)后嘗試連接數(shù)據(jù)服務(wù)器,并以9600的配置打開名稱為“COM6”的串口,最終將硬件數(shù)據(jù)實(shí)時(shí)渲染為可視化的圖形。
5 ? 結(jié)論(Conclusion)
本文使用支持跨平臺(tái)的RS232串口庫Serial Communication Library,以及網(wǎng)絡(luò)編程庫libevent,基于Websocket協(xié)議實(shí)現(xiàn)了網(wǎng)頁與串口之間的數(shù)據(jù)傳輸。然后利用了Web網(wǎng)頁的Websocket特性,以及Echarts網(wǎng)頁前端UI庫,實(shí)現(xiàn)了將串口波形數(shù)據(jù)渲染到網(wǎng)頁圖表上的WEB界面。最終驗(yàn)證了該系統(tǒng)的有效性與可擴(kuò)展性,為嵌入式上位機(jī)的實(shí)現(xiàn)提供了一種新的思路。
參考文獻(xiàn)(References)
[1] 張勝,李瑞民.物理隔斷計(jì)算機(jī)網(wǎng)絡(luò)間的實(shí)時(shí)通信設(shè)計(jì)[J].電視技術(shù),2016,40(6):127-130.
[2] 謝佳柏,陳賢祥,胡欣宇,等.基于低功耗藍(lán)牙和WebSocket的物聯(lián)網(wǎng)數(shù)據(jù)網(wǎng)關(guān)[J].儀表技術(shù)與傳感器,2016(1):76-78.
[3] 章銳,陳樹勇,劉道偉,等.基于ECharts的電網(wǎng)Web可視化研究及應(yīng)用[J].電測與儀表,2017,54(19):59-66.
[4] 陳旭輝,楊紅云.基于STM32的多串口并行傳輸系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2019,27(1):166-170.
[5] 錢宇虹.使用Websocket和Servlet實(shí)現(xiàn)服務(wù)器定點(diǎn)推送[J].軟件工程,2016,19(10):30-33.
[6] 冀瀟,李楊.采用ECharts可視化技術(shù)實(shí)現(xiàn)的數(shù)據(jù)體系監(jiān)控系統(tǒng)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(6):72-76.
作者簡介:
張宏橋(1989-),男,碩士,助理實(shí)驗(yàn)師.研究領(lǐng)域:軟件開發(fā),計(jì)算機(jī)控制.
蔣 ?虎(1998-),男,學(xué)士生.研究領(lǐng)域:軟件開發(fā),嵌入式開發(fā).
曾曉華(1976-),女,碩士,高級(jí)實(shí)驗(yàn)師.研究領(lǐng)域:系統(tǒng)仿真,嵌入式開發(fā).
段凌飛(1983-),男,碩士,講師.研究領(lǐng)域:嵌入式開發(fā),計(jì)算機(jī)控制.