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