李光明 黃立昌
摘 要:隨著物聯(lián)網(wǎng)行業(yè)的發(fā)展,機(jī)器設(shè)備都要提供Web服務(wù)實現(xiàn)網(wǎng)上操作與管理。針對其配置與管理復(fù)雜的局限性,目前提供的Web服務(wù)大多依賴于第三方軟件。通過采用微軟.NET框架中Http Listener類實現(xiàn)本地PC端應(yīng)用軟件對遠(yuǎn)程瀏覽器HTTP請求報文的監(jiān)聽,從而實現(xiàn)HTTP協(xié)議的握手,利用SQL Server數(shù)據(jù)庫實現(xiàn)Web服務(wù)端和客戶端的實時通信,同時設(shè)計一種比較簡潔的Web服務(wù)實現(xiàn)框架。通過實現(xiàn)步進(jìn)電機(jī)的Web服務(wù)對該框架進(jìn)行測試。實驗結(jié)果表明,該框架在實現(xiàn)Web服務(wù)的同時,系統(tǒng)架構(gòu)精小,無需配置Web服務(wù)軟件,系統(tǒng)可移植性較強。
關(guān)鍵詞:物聯(lián)網(wǎng);Web;Http Listener;工廠模式
中圖分類號:TP311.1文獻(xiàn)標(biāo)識碼:A文章編號:2095-1302(2019)02-00-04
0 引 言
近些年,隨著物聯(lián)網(wǎng)行業(yè)的興起,機(jī)器設(shè)備都在朝著智能化方向發(fā)展。其中典型的特征就是機(jī)器設(shè)備具有“連網(wǎng)”功能,能夠?qū)崿F(xiàn)網(wǎng)上遠(yuǎn)程控制,從而把操作人員從機(jī)器設(shè)備身邊解放出來,減少機(jī)器污染對人體的傷害。而機(jī)器設(shè)備的“連網(wǎng)”功能可通過提供設(shè)備的Web服務(wù)實現(xiàn),同時Web技術(shù)的發(fā)展也為實現(xiàn)Web服務(wù)提供了許多方式。一般情況下,實現(xiàn)高性能的Web服務(wù)需要借用I2S,Apache等第三方服務(wù)軟件[1],但是每一個Web服務(wù)軟件在運行前都需前期配置,實現(xiàn)過程比較復(fù)雜,系統(tǒng)龐大,不易于管理。而利用微軟.NET框架下的Http Listener類可實現(xiàn)精簡的Web服務(wù),同時能夠避免借用Web服務(wù)軟件帶來的問題,使系統(tǒng)變得清晰,容易理解,減少一些繁鎖的配置。
基于物聯(lián)網(wǎng)設(shè)備實現(xiàn)其“連網(wǎng)”功能只需一些基本W(wǎng)eb服務(wù)就可滿足,且設(shè)備的種類較多,借用Http Listener類和工廠模式,本文設(shè)計了一套適合于物聯(lián)網(wǎng)設(shè)備的精簡Web服務(wù)實現(xiàn)框架。
1 Web服務(wù)實現(xiàn)框架
Web服務(wù)是一組模塊化的API,可通過網(wǎng)絡(luò)對該API進(jìn)行調(diào)用,執(zhí)行遠(yuǎn)程系統(tǒng)的請求服務(wù),從而實現(xiàn)機(jī)器設(shè)備間跨網(wǎng)、平臺的相互操作及數(shù)據(jù)交互。為了實現(xiàn)對物聯(lián)網(wǎng)設(shè)備的跨網(wǎng)和平臺實時控制,需要實現(xiàn)其Web服務(wù)。
由于物聯(lián)網(wǎng)設(shè)備種類較多,為提高框架的通用性,以適用于不同的物聯(lián)網(wǎng)設(shè)備,本文設(shè)計的簡易Web服務(wù)采用工廠設(shè)計模式,將框架分成三層。頂層是邏輯控制模塊;中間層是工廠類;底層由控制函數(shù)模塊、HTTP應(yīng)答模塊和數(shù)據(jù)訪問模塊組成。它們相互作用,實現(xiàn)設(shè)備的本地控制和Web服務(wù)兩個功能,軟件框架結(jié)構(gòu)如圖1所示。
1.1 邏輯控制模塊
邏輯控制模塊作為軟件的邏輯控制中心,通過調(diào)用工廠類中函數(shù)在邏輯控制模塊實例底層各模塊中的控制函數(shù)類,利用控制函數(shù)類調(diào)用控制函數(shù)實現(xiàn)對設(shè)備的邏輯控制。邏輯控制模塊同時具有顯示作用,在實現(xiàn)具體操作的同時也可將設(shè)備的實時狀態(tài)顯示在操作界面。
其中,邏輯控制模塊和控制函數(shù)模塊的主要作用是實現(xiàn)設(shè)備的本地控制,而在實現(xiàn)本地控制的基礎(chǔ)上借助HTTP應(yīng)答模塊和數(shù)據(jù)訪問模塊實現(xiàn)Web服務(wù)。
1.2 工廠類
工廠類來源于工廠設(shè)計模式,其主要思想是把類的創(chuàng)建封裝到工廠類的函數(shù)中[2],當(dāng)需要對象時,無需親自創(chuàng)建,只需通過調(diào)用工廠類中的函數(shù)就可得到類。因此工廠設(shè)計模式能夠把類的創(chuàng)建和使用相分離,減小程序間的耦合度,提高復(fù)用性。
為了適用于不同的物聯(lián)網(wǎng)設(shè)備,本文設(shè)計的Web實現(xiàn)框架需提高通用性。因此借用工廠類作為中間層封裝底層各模塊中類的創(chuàng)建,減小邏輯控制模塊與其他三個模塊的耦合度。例如,當(dāng)要實現(xiàn)不同設(shè)備的Web服務(wù)時,只需更新控制函數(shù)類,在工廠類中進(jìn)行新類的創(chuàng)建即可,邏輯控制模塊無需修改代碼。
1.3 底層模塊
底層模塊包括控制函數(shù)模塊、HTTP應(yīng)答模塊和數(shù)據(jù)訪問模塊,各模塊由接口和類組成。其中,接口中封裝的是各模塊的功能函數(shù),而模塊中的類需要繼承接口對各功能函數(shù)進(jìn)行具體實現(xiàn)。通過借用接口把各模塊中類的創(chuàng)建封裝在工廠類的函數(shù)中,供邏輯控制模塊調(diào)用。
1.3.1 控制函數(shù)模塊
作為設(shè)備控制的直接程序,控制函數(shù)模塊包含對設(shè)備進(jìn)行操作的各種函數(shù)。通常情況下,對設(shè)備的控制主要通過設(shè)備的初始化、起??刂?、狀態(tài)讀取和參數(shù)設(shè)置等操作實現(xiàn),因此控制函數(shù)類主要是對以上四個功能的函數(shù)進(jìn)行實現(xiàn)。
1.3.2 HTTP應(yīng)答模塊
HTTP協(xié)議作為實現(xiàn)Web服務(wù)的基礎(chǔ),建立在TCP/IP協(xié)議基礎(chǔ)上,對HTTP協(xié)議報文的監(jiān)聽一般需借用第三方Web服務(wù)軟件,雖然Web服務(wù)軟件可實現(xiàn)高性能Web服務(wù),但是配置繁瑣。而物聯(lián)網(wǎng)設(shè)備通常只需一些簡單的Web服務(wù),同時.NET中的Http Listener類是對TCP/IP協(xié)議的封裝,因此使用Http Listener類可以較容易地在HTTP應(yīng)答模塊中創(chuàng)建響應(yīng)HTTP請求的簡單HTTP協(xié)議偵聽器。在監(jiān)聽到網(wǎng)頁請求后向客戶端返回HTML文件,通過瀏覽器對HTML文件的渲染得到控制界面就能實現(xiàn)設(shè)備的Web服務(wù)。因此該模塊的類中只需借用Http Listener類實現(xiàn)HTTP請求報文監(jiān)聽和HTML文件響應(yīng)兩個功能函數(shù)。
1.3.3 數(shù)據(jù)訪問模塊
由于HTTP是一個短連接的通信方式,每次連接只持續(xù)較短的一段時間,如果要用HTTP協(xié)議實現(xiàn)Web服務(wù)端和客戶端的實時通信,則需要采用輪詢方式[3]。但實現(xiàn)輪詢方式時,無論數(shù)據(jù)是否發(fā)生變化,都要間隔一段時間向服務(wù)端發(fā)送一個請求,對服務(wù)器造成了較大壓力。雖然Web Socket可以簡單方便地實現(xiàn)實時通信,但需借助Web服務(wù)器。而本文實現(xiàn)的Web服務(wù)框架需精簡系統(tǒng),因此借用數(shù)據(jù)庫作為中間橋梁實現(xiàn)服務(wù)端和客戶端的數(shù)據(jù)交互。
數(shù)據(jù)訪問模塊的功能是將設(shè)備狀態(tài)信息寫進(jìn)數(shù)據(jù)庫供遠(yuǎn)程客戶端讀取,同時從數(shù)據(jù)庫中讀取遠(yuǎn)程客戶端對設(shè)備的操作信息以及HTML文件中的Java Script代碼,實現(xiàn)服務(wù)端和客戶端的數(shù)據(jù)實時交互。此外,還可實現(xiàn)設(shè)備歷史數(shù)據(jù)查詢和大數(shù)據(jù)分析。要實現(xiàn)以上功能只需在數(shù)據(jù)訪問模塊中封裝數(shù)據(jù)庫的增、刪、改、查函數(shù)即可。
2 步進(jìn)電機(jī)Web服務(wù)實現(xiàn)
由于步進(jìn)電機(jī)應(yīng)用廣泛,且和其他設(shè)備一樣實現(xiàn)“連網(wǎng)”和遠(yuǎn)程跨網(wǎng)控制只需簡單的Web服務(wù)就可滿足需求,因此本文以實現(xiàn)步進(jìn)電機(jī)的Web服務(wù)為例,說明如何利用Http Listener類采用C#編程實現(xiàn)Web服務(wù)。
2.1 步進(jìn)電機(jī)Web服務(wù)系統(tǒng)結(jié)構(gòu)
本文設(shè)計的軟件框架只用于開發(fā)步進(jìn)電機(jī)控制軟件,是Web服務(wù)的服務(wù)端。要實現(xiàn)步進(jìn)電機(jī)的Web服務(wù)和跨網(wǎng)控制,還需要步進(jìn)電機(jī)、客戶端和SQL Server數(shù)據(jù)庫。由以上四部分組成步進(jìn)電機(jī)Web服務(wù)系統(tǒng),如圖2所示。
步進(jìn)電機(jī)作為被控制和管理的設(shè)備,是Web服務(wù)的落腳點。
電機(jī)控制軟件作為Web服務(wù)端,是整個結(jié)構(gòu)的核心部分。控制軟件采用C#作為開發(fā)語言,框架軟件包括邏輯控制、控制函數(shù)、HTTP應(yīng)答、數(shù)據(jù)訪問和工廠類五個模塊。
Web客戶端即瀏覽器,需向服務(wù)端發(fā)送網(wǎng)頁請求報文,在收到響應(yīng)報文中的HTML文件后,對HTML文件進(jìn)行渲染得到步進(jìn)電機(jī)遠(yuǎn)程控制界面,從而實現(xiàn)步進(jìn)電機(jī)的Web服務(wù)。
SQL Server數(shù)據(jù)庫作為Web服務(wù)端和客戶端實時通信的中間橋梁,在本地PC機(jī)中通過C#代碼操作數(shù)據(jù)庫,而遠(yuǎn)程瀏覽則利用接收到的HTML文件中的Java Script程序?qū)QL Server數(shù)據(jù)庫進(jìn)行操作,實現(xiàn)Web服務(wù)端和客戶端的實時數(shù)據(jù)通信。
2.2 步進(jìn)電機(jī)控制軟件實現(xiàn)
本文設(shè)計的框架中,工廠類作為中間層主要是隔離模塊,而其他四個模塊則是步進(jìn)電機(jī)控制軟件的實現(xiàn)基礎(chǔ)。
2.2.1 邏輯控制模塊
邏輯控制模塊的主要功能是調(diào)用控制函數(shù)模塊中的函數(shù),實現(xiàn)步進(jìn)電機(jī)的邏輯控制和狀態(tài)顯示,實現(xiàn)過程可分為以下三步:
(1)步進(jìn)電機(jī)初始化
工作之前,一般需對機(jī)器設(shè)備進(jìn)行基本參數(shù)設(shè)置,在對步進(jìn)電機(jī)進(jìn)行實時控制前需對電機(jī)和PC機(jī)的USB通信進(jìn)行初始化。初始化的主要過程:在程序操作界面起??丶癈lick”事件函數(shù)中,依次調(diào)用控制函數(shù)模塊中的OpenDevi-ce( )函數(shù)和SetTimeout( )函數(shù),打開USB串口,設(shè)置USB通信超時時間;在USB串口打開后調(diào)用WriteData( )函數(shù),對電機(jī)的衰減模式電壓和電機(jī)驅(qū)動電流進(jìn)行設(shè)置,從而完成對電機(jī)的初始化。
(2)步進(jìn)電機(jī)轉(zhuǎn)速和行進(jìn)距離控制
目前,對步進(jìn)電機(jī)的控制主要是對步進(jìn)電機(jī)轉(zhuǎn)速和行進(jìn)距離的控制,再利用圓弧和直線的插補算法可合成工程上所需的行進(jìn)路線。
完成初始化后,根據(jù)步進(jìn)電機(jī)提供的USB通信數(shù)據(jù)表將控制軟件界面中的轉(zhuǎn)速和行進(jìn)距離輸入控件中的數(shù)據(jù)寫入到字節(jié)數(shù)組中對應(yīng)的字節(jié)中,通過調(diào)用WriteData( )函數(shù)將控制命令字節(jié)數(shù)組寫入驅(qū)動器中實現(xiàn)對步進(jìn)電機(jī)的控制。
(3)步進(jìn)電機(jī)運行狀態(tài)讀取
在實現(xiàn)對電機(jī)進(jìn)行控制的同時也需顯示電機(jī)的工作狀態(tài),為操作人員提供操作參考數(shù)據(jù)。通過調(diào)用ReadData( )函數(shù)從USB串口中讀取電機(jī)狀態(tài)字節(jié)數(shù)組,然后根據(jù)電機(jī)提供的USB通信數(shù)據(jù)表對所讀取的狀態(tài)字節(jié)數(shù)組進(jìn)行解析,再將解析結(jié)果顯示在軟件界面相對應(yīng)的顯示控制中。
2.2.2 控制函數(shù)模塊
在步進(jìn)電機(jī)控制過程中,轉(zhuǎn)速和行進(jìn)距離是比較常用的兩個參數(shù),而且這兩個參數(shù)有取值范圍限制。因此在電機(jī)控制類中定義電機(jī)轉(zhuǎn)速Servo_Speed和電機(jī)行進(jìn)距離Servo_Distance屬性,對電機(jī)轉(zhuǎn)速字段servo_speed和行進(jìn)距離字段servo_distance進(jìn)行保護(hù)和取賦值限定。電機(jī)轉(zhuǎn)速和行進(jìn)距離不僅要進(jìn)行寫入也要讀取,因此屬性定義時要有g(shù)et和set訪問器。
控制函數(shù)類作為控制函數(shù)模塊的主體,其實現(xiàn)的函數(shù)主要有以下幾個:
OpenDevice( ):打開電機(jī)驅(qū)動器;
CloseDevice( ):關(guān)閉電機(jī)驅(qū)動器;
SetTimeout( ):設(shè)置USB數(shù)據(jù)讀寫超時時間;
WriteData( ):寫入控制命令數(shù)據(jù)塊;
ReadData( ):讀取控制命令數(shù)據(jù)塊。
以上控制函數(shù)通過引用步進(jìn)電機(jī)驅(qū)動器提供的DLL動態(tài)鏈接庫中所對應(yīng)的外部函數(shù),在電機(jī)控制類中對所引用的函數(shù)進(jìn)行外部函數(shù)聲明實現(xiàn)。
2.2.3 HTTP應(yīng)答模塊
HTTP應(yīng)答模塊的功能是對HTTP請求作出反應(yīng),其實現(xiàn)過程是先對HTTP請求進(jìn)行監(jiān)聽,然后向客戶端響應(yīng)HTML文件。
(1)遠(yuǎn)程瀏覽器HTTP請求報文監(jiān)聽
對HTTP請求報文的監(jiān)聽主要通過創(chuàng)建HTTP協(xié)議偵聽器完成,偵聽器創(chuàng)建的部分源代碼如下:
HttpListener listener = new HttpListener();
listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
listener.Prefixes.Add(“http://192.168.0.21:9216/”);
listener.Start();
HttpListenerContext context = await listener.GetContextAsync();
HttpListenerRequest request = context.Request;
本文利用Prefixes屬性將偵聽器綁定到9216端口上,也可根據(jù)需要綁定到其他未被占用的端口,而Authentication Schemes屬性的功能是設(shè)置是否允許匿名和無身份驗證的客戶端訪問。在執(zhí)行Start( )函數(shù)后,開始監(jiān)聽瀏覽器的HTTP請求。在接收到HTTP請求時GetContextAsync( )函數(shù)會返回一個HttpListenerContext類,利用該類實現(xiàn)HTML文件響應(yīng)。為了實現(xiàn)對客戶端網(wǎng)頁請求的實時監(jiān)聽,該段程序需要分配子線程循環(huán)執(zhí)行。
(2)HTML文件響應(yīng)
返回HttpListenerContext類后,該類的Response屬性返回一個HttpListerResponse類。通過HttpListerResponse類可響應(yīng)遠(yuǎn)程瀏覽器的請求,給遠(yuǎn)程瀏覽器響應(yīng)HTML文件,從而實現(xiàn)對瀏覽器的Web服務(wù)。具體源代碼如下:
HttpListenerResponse response = context.Response;
response.ContentType = “text/html;charset=utf-8”;
response.ContentLength64 = bytes.Length;
System.IO.Stream output = response.OutputStream;
output.Write(bytes, 0, bytes.Length);
output.Close();
為了實現(xiàn)對瀏覽器的實時響應(yīng),該段代碼需要和監(jiān)聽代碼在同一子線程,并且在監(jiān)聽代碼后循環(huán)執(zhí)行。代碼中使用ContentType屬性設(shè)置響應(yīng)文件的格式,如果不設(shè)置,瀏覽器會將文件以.txt格式顯示在窗口上。而Write(bytes,0, bytes.Length)函數(shù)的功能則是向瀏覽器傳遞響應(yīng)文件,其中參數(shù)bytes為一個字節(jié)類型的數(shù)組,該數(shù)組存放了HTML文件的二進(jìn)制數(shù)據(jù)。
2.2.4 數(shù)據(jù)訪問模塊
數(shù)據(jù)庫太小不利于系統(tǒng)擴(kuò)展,太大不利于管理,因此選用中型數(shù)據(jù)庫SQL Server作為中間橋梁實現(xiàn)服務(wù)端和瀏覽器的數(shù)據(jù)交互。SQL Server表中不僅存儲步進(jìn)電機(jī)的狀態(tài)信息,如實時轉(zhuǎn)速、周期行進(jìn)距離與串口通信狀態(tài)等,同時還存儲來自客戶端的操作信息,如轉(zhuǎn)速給定、行進(jìn)距離給定、正反轉(zhuǎn)與起停等。
在服務(wù)端,電機(jī)控制軟件的C#代碼將電機(jī)的實時狀態(tài)寫進(jìn)數(shù)據(jù)庫,同時從數(shù)據(jù)庫中讀取瀏覽器對電機(jī)的操作數(shù)據(jù),根據(jù)操作數(shù)據(jù)調(diào)用控制函數(shù)模塊中相應(yīng)的控制函數(shù),實現(xiàn)電機(jī)的遠(yuǎn)程操作。
在客戶端實現(xiàn)對數(shù)據(jù)庫的操作需借助Java Script代碼,因此要在HTML文件中嵌入對數(shù)據(jù)庫進(jìn)行操作的Java Script函數(shù),將在瀏覽器中對步進(jìn)電機(jī)的操作數(shù)據(jù)寫進(jìn)數(shù)據(jù)庫中,同時將數(shù)據(jù)庫中存放的電機(jī)狀態(tài)信息讀出,并顯示在瀏覽器網(wǎng)頁上。
3 Web服務(wù)測試
將步進(jìn)電機(jī)驅(qū)動器USB數(shù)據(jù)線接入本地PC機(jī),運行控制軟件,對電機(jī)參數(shù)進(jìn)行設(shè)置,啟動按鈕,即可實現(xiàn)對電機(jī)的控制。控制軟件界面如圖3所示。
軟件運行后,在同一局域網(wǎng)內(nèi)的瀏覽器中輸入IP地址及其端口號192.168.0.21:9216,瀏覽器將收到的HTML文件渲染到瀏覽器窗口,即步進(jìn)電機(jī)遠(yuǎn)程控制界面。遠(yuǎn)程控制界面如圖4所示。
若要實現(xiàn)外網(wǎng)Web服務(wù),只需向網(wǎng)絡(luò)運營商申請外網(wǎng)IP地址,或者借用花生殼軟件將本機(jī)IP映射到外網(wǎng)即可實現(xiàn)。
4 結(jié) 語
從對步進(jìn)電機(jī)Web服務(wù)的測試過程可以看出,本文設(shè)計的Web服務(wù)實現(xiàn)方案可以很好地應(yīng)用,在實現(xiàn)既定功能的同時系統(tǒng)也能穩(wěn)定運行。該方案不僅規(guī)避了借用Web服務(wù)軟件帶來的復(fù)雜配置過程,同時精簡了系統(tǒng),提高了軟件的可移植性。
本文只用了兩個步進(jìn)電機(jī)進(jìn)行測試,在物聯(lián)網(wǎng)行業(yè)中類似步進(jìn)電機(jī)只需向外提供簡單Web服務(wù)的設(shè)備還大量存在。而本文設(shè)計的Web實現(xiàn)框架采用工廠模式,各模塊間的耦合度低,且具有很強的可擴(kuò)展性,因此只要在框架中添加不同設(shè)備的模塊即可實現(xiàn)其他物聯(lián)網(wǎng)設(shè)備的Web服務(wù),從而對分布式物聯(lián)網(wǎng)設(shè)備進(jìn)行集中管理。
參 考 文 獻(xiàn)
[1]秦元培.使用C#開發(fā)HTTP服務(wù)器系列之Hello World [EB/OL]. http: //blog.csdn.net/qinyuanpei/article/details/51757148,2016.
[2]葛萌,歐陽宏基.工廠設(shè)計模式的研究與應(yīng)用[J].計算技術(shù)與自動化,2017,36(2):136-140.
[3]祝瑞,車敏.基于HTTP協(xié)議的服務(wù)器程序分析[J].現(xiàn)代電子技術(shù),2012,35(4):117-119,122.
[4] EGBENIMI B E, SANDEEP B.Simplifying the abstract factory and factory design patterns[J]. ARPN journal of science and technology,2014,4(12):789-794.
[5]高揚.基于.NET平臺的三層架構(gòu)軟件框架的設(shè)計與實現(xiàn)[J].計算機(jī)技術(shù)與發(fā)展,2011,21(2):77-80,85.
[6]李光明,孫英爽,黨小娟.基于安卓的遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機(jī)工程與設(shè)計,2016,37(2):556-561.
[7]杜超,林開偉,陳曼雯.物聯(lián)網(wǎng)智能示波器研究與設(shè)計[J].物聯(lián)網(wǎng)技術(shù),2017,7(11):36-39,41.
[8]劉立偉,司冬雨,白潔.基于LabVIEW Web服務(wù)的物聯(lián)網(wǎng)發(fā)電設(shè)備遠(yuǎn)程監(jiān)測系統(tǒng)應(yīng)用[J].自動化技術(shù)與應(yīng)用,2014,33(10):82-84.
[9] SERNA F, CATAL?N C, BLESA A, et al. “Predictive maintenance surveyor” design pattern for machine tools control software applications[C]// Emerging Technologies & Factory Automation. IEEE, 2011:1-7.
[10]蔡昭權(quán).基于C#的無I2S的Web Services服務(wù)[J].計算機(jī)工程與設(shè)計,2007(9):2230-2232.
[11]劉偉,胡志剛,閻朝坤.C#設(shè)計模式[M].北京:清華大學(xué)出版社,2013.