單片機(jī)系統(tǒng)中Web Service的調(diào)用方法研究
圖1 單片機(jī)系統(tǒng)結(jié)構(gòu)
實(shí)驗(yàn)中選用了廣州周立功單片機(jī)發(fā)展有限公司開發(fā)的一款嵌入式網(wǎng)絡(luò)模塊ZNE-100T,它內(nèi)部集成了TCP/IP 協(xié)議棧,利用它可以輕松完成嵌入式設(shè)備的網(wǎng)絡(luò)功能,另外為了測試方便直接使用了ZNE-100T的評估板.通過周立功公司提供的配置軟件可以設(shè)置網(wǎng)絡(luò)模塊的參數(shù),包括IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)、串口的波特率、端口工作模式、目標(biāo)IP 地址和目標(biāo)端口等,特別說明的是端口工作模式,由于HTTP協(xié)議是基于TCP的,所以實(shí)驗(yàn)中模式設(shè)為TCP Client模式,目標(biāo)端口默認(rèn)設(shè)置為80.
(2)HTTP-POST消息格式
Internet標(biāo)準(zhǔn)定義了兩個(gè)HTTP協(xié)議的標(biāo)準(zhǔn)文檔:RFC1945和RFC2616[6].這兩個(gè)文檔分別描述了HTTP/1.0和HTTP/1.1的實(shí)現(xiàn)標(biāo)準(zhǔn).這兩個(gè)版本的HTTP協(xié)議最大區(qū)別在于前者不支持保持連接,規(guī)定每次的HTTP請求和響應(yīng)后都要關(guān)閉TCP連接,而后者支持持久連接,這意味著可以打開一次TCP連接進(jìn)行多次請求/響應(yīng),大大提高了性能. 由于單片機(jī)系統(tǒng)的處理效率低、資源有限等原因,在其上實(shí)現(xiàn)完整HTTP協(xié)議很不現(xiàn)實(shí),實(shí)際上為了實(shí)現(xiàn)Web Service調(diào)用也沒有必要全部實(shí)現(xiàn),只需實(shí)現(xiàn)基本的HTTP1.1協(xié)議完成單片機(jī)系統(tǒng)和Web服務(wù)器的數(shù)據(jù)通信即可. 經(jīng)過分析研究,找出了一種比較簡單有效的HTTP-POST格式.下面通過一個(gè)具體例子說明實(shí)現(xiàn)的方法.
用C#實(shí)現(xiàn)Web服務(wù)WebService1,定義一個(gè)處理模擬量數(shù)據(jù)的方法:
[WebMethod]
public string SimulateData(byte s,float[] a)
{
…
return OK;
}
SimulateData方法的參數(shù)中,s為下位機(jī)站地址,可以用來區(qū)分哪個(gè)下位機(jī)發(fā)來的數(shù)據(jù),數(shù)組a為下位機(jī)提交的模擬量數(shù)據(jù),數(shù)據(jù)個(gè)數(shù)根據(jù)實(shí)際傳遞的數(shù)據(jù)來定.
下面是HTTP-POST請求包數(shù)據(jù):
POST /WebService1/service1.asmx/SimulateData HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
s=1a=100.0a=100.0a=100.0a=100.0a=100.0
上面為一個(gè)合法的HTTP-POST協(xié)議的包實(shí)例, “/WebService1/service1.asmx/SimulateData”為要調(diào)用的Web Service的方法名及其服務(wù)地址,最后一行為真正的有效數(shù)據(jù)信息,數(shù)據(jù)包括采集站地址,本例中為1,以及5個(gè)模擬量數(shù)據(jù),本例中為5個(gè)100.0.在HTTP-POST包中除了數(shù)據(jù)域以外,“Content-Length: 43”中的43會根據(jù)數(shù)據(jù)域?qū)嶋H字節(jié)個(gè)數(shù)在下位機(jī)中由程序設(shè)置,表示提交的有效數(shù)據(jù)字節(jié)數(shù).由此可以看出,只要加上正確的HTTP請求頭、相應(yīng)的Web Service地址,并且按照HTTP1.1 POST規(guī)范設(shè)置數(shù)據(jù)域數(shù)據(jù)就可以實(shí)現(xiàn)簡單的HTTP-POST協(xié)議,在單片機(jī)系統(tǒng)中只需把這些數(shù)據(jù)通過串口發(fā)出,剩下的工作由嵌入式網(wǎng)絡(luò)模塊實(shí)現(xiàn),和編寫普通的串口發(fā)送程序一樣簡單.經(jīng)絡(luò)模塊轉(zhuǎn)化后的HTTP-POST請求最終到達(dá)Web服務(wù)器,根據(jù)數(shù)據(jù)的對應(yīng)寫入實(shí)時(shí)數(shù)據(jù)庫,如果實(shí)時(shí)性要求不高且數(shù)據(jù)存儲量不大,可以使用ACCESS數(shù)據(jù)庫,不然可以使用專用的數(shù)據(jù)庫服務(wù)器,如Oracle和SQL Server.
調(diào)用Web Service后也會返回給下位機(jī)數(shù)據(jù)以表示執(zhí)行結(jié)果,如果下位機(jī)不關(guān)心執(zhí)行結(jié)果可以忽略返回的數(shù)據(jù),否則可以根據(jù)需要進(jìn)行相應(yīng)的處理,下面給出作者實(shí)驗(yàn)時(shí)的返回?cái)?shù)據(jù):
HTTP/1.1 200 OK
Date: Thu, 08 Feb 2007 07:45:51 GMT
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Content-Length: 101
?xml version=1.0 encoding=utf-8?>
string xmlns=okhttp://219.231.160.11/webservice1>ok/string>
上面的“ok”為方法SimulateData執(zhí)行正確后返回的數(shù)據(jù).
3 優(yōu)點(diǎn)
基于本文提出的方法可以方便的利用單片機(jī)構(gòu)建基于工業(yè)以太網(wǎng)的數(shù)據(jù)采集系統(tǒng),有以下優(yōu)點(diǎn):
(1)可以方便的集成現(xiàn)有設(shè)備和儀表的數(shù)據(jù)采集.只要知道儀表設(shè)備的通訊協(xié)議,在下位機(jī)實(shí)現(xiàn)數(shù)據(jù)通訊,把采集到的數(shù)據(jù)封裝為HTTP-POST請求包通過串口發(fā)出即可.
(2)采用工業(yè)交換以太網(wǎng),基于HTTP協(xié)議,同時(shí)滿足局域和遠(yuǎn)程采集的需要.可以把該系統(tǒng)連至Internet,Web Service和下位機(jī)系統(tǒng)可以不在同一地理位置,而且Web Service可以同時(shí)處理多個(gè)不同地理位置提交的數(shù)據(jù),方便實(shí)現(xiàn)數(shù)據(jù)集中,能更好的管理和使用數(shù)據(jù).
(3)方便維護(hù)和升級,方便增加采樣點(diǎn).可以根據(jù)需要隨意增加下位機(jī),做到需要幾個(gè)模塊調(diào)試增加幾個(gè)模塊.
(4)不同于傳統(tǒng)的專用采集服務(wù)器采集數(shù)據(jù)模式,上位機(jī)服務(wù)器的功能由Web服務(wù)提供,不需要編寫專門的數(shù)據(jù)接收程序和上位機(jī)采集程序,只需編Web Service接口代碼.真正同儀表的通訊由下位機(jī)完成,形成分布式數(shù)據(jù)采集,Web服務(wù)是多線程體系結(jié)構(gòu),可并發(fā)處理多個(gè)下位機(jī)模塊發(fā)送的數(shù)據(jù),使得整個(gè)系統(tǒng)支持更多的數(shù)據(jù)點(diǎn)采集,提高整個(gè)系統(tǒng)的采集效率.
4 結(jié)束語
實(shí)驗(yàn)證明,基于本文方法可以快速有效的部署數(shù)據(jù)采集系統(tǒng),比傳統(tǒng)的串口服務(wù)器采集數(shù)據(jù)的方法有很多優(yōu)越性.上位機(jī)和下位機(jī)通信基于Web Service技術(shù),使得系統(tǒng)的開發(fā)工作主要放在下位機(jī)和儀表的通信上,提高了系統(tǒng)開發(fā)效率,由于Web Service的跨平臺和語言無關(guān)性,使得可以方便的維護(hù)和修改系統(tǒng)方案,大大減少開發(fā)成本.
評論