張 倩
(沈陽(yáng)工程學(xué)院自動(dòng)化學(xué)院,遼寧 沈陽(yáng) 110136)
遠(yuǎn)程控制系統(tǒng)由智能手機(jī)、受控設(shè)備和Web服務(wù)器三大主要部分組成,其結(jié)構(gòu)框圖如圖1所示。無(wú)線(xiàn)路由(AP)為系統(tǒng)提供WiFi無(wú)線(xiàn)網(wǎng)絡(luò)。手機(jī)、平板等智能終端可以遠(yuǎn)程監(jiān)測(cè)和控制處于工廠和車(chē)間的設(shè)備。受控設(shè)備通過(guò)單片機(jī)接收WiFi無(wú)線(xiàn)模塊的控制指令,通過(guò)PLC或繼電器可以實(shí)現(xiàn)對(duì)設(shè)備的遠(yuǎn)程智能控制。系統(tǒng)的設(shè)計(jì)思路是將服務(wù)器應(yīng)用程序部署在Tomcat網(wǎng)絡(luò)服務(wù)器上,負(fù)責(zé)提供用戶(hù)邏輯和MySQL數(shù)據(jù)庫(kù)查詢(xún)服務(wù),并與Android智能手機(jī)和受控設(shè)備通信。用戶(hù)通過(guò)手機(jī)軟件可以完成登錄、設(shè)備添加、監(jiān)控和控制等功能。
客戶(hù)端和服務(wù)器的通信過(guò)程由雙方的接口實(shí)現(xiàn)。首先,客戶(hù)端通過(guò)httpClient接口發(fā)送一個(gè)請(qǐng)求給服務(wù)器端;其次,Web服務(wù)器將來(lái)自于客戶(hù)端的請(qǐng)求送到Servlet接口,在接口中進(jìn)行用戶(hù)邏輯分析后,將響應(yīng)內(nèi)容從Servlet接口返回給客戶(hù)端。Tomcat服務(wù)器作為Servlet接口類(lèi)的容器,負(fù)責(zé)接收和響應(yīng)手機(jī)客戶(hù)端請(qǐng)求。在無(wú)線(xiàn)網(wǎng)絡(luò)通信過(guò)程中,雙方使用的通信協(xié)議是HTTP協(xié)議,規(guī)定了傳輸數(shù)據(jù)的內(nèi)容和格式。
圖1 遠(yuǎn)程控制系統(tǒng)結(jié)構(gòu)
HTTP協(xié)議,即超文本傳輸協(xié)議,定義客戶(hù)端和服務(wù)器端之間文件傳輸?shù)臏贤ǚ绞健TTP協(xié)議的內(nèi)容是HTTP報(bào)文,報(bào)文是由一行一行字符串組成的。協(xié)議采用客戶(hù)端/服務(wù)器結(jié)構(gòu),即Client/Server模式,客戶(hù)端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文,服務(wù)器返回一個(gè)響應(yīng)報(bào)文。HTTP請(qǐng)求和響應(yīng)實(shí)現(xiàn)流程:首先,客戶(hù)端發(fā)送連接請(qǐng)求到Web服務(wù)器,客戶(hù)端和服務(wù)器建立起一個(gè)TCP連接,客戶(hù)端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文;其次,服務(wù)器接收客戶(hù)端請(qǐng)求并返回HTTP響應(yīng),在服務(wù)器程序中解析用戶(hù)請(qǐng)求,并根據(jù)用戶(hù)邏輯做出響應(yīng),由TCP連接返回給客戶(hù)端;最后,根據(jù)連接類(lèi)型保持或釋放TCP連接,若連接類(lèi)型為keepalive,在一段時(shí)間內(nèi)服務(wù)器可以繼續(xù)接收該客戶(hù)端的請(qǐng)求,若連接類(lèi)型為close,則服務(wù)器在做出響應(yīng)后會(huì)釋放連接。網(wǎng)絡(luò)通信的客戶(hù)端/服務(wù)器模型如圖2所示,httpClient和httpServlet為客戶(hù)端和服務(wù)器的通信接口函數(shù)。
圖2 網(wǎng)絡(luò)通信的客戶(hù)端/服務(wù)器模型
HTTP事務(wù)=請(qǐng)求命令+響應(yīng)結(jié)果。命令和響應(yīng)以報(bào)文的形式傳遞,HTTP請(qǐng)求報(bào)文主要由請(qǐng)求行、請(qǐng)求頭部、請(qǐng)求正文組成。HTTP響應(yīng)報(bào)文由狀態(tài)行、響應(yīng)頭部和響應(yīng)包體組成。
2.2.1 請(qǐng)求報(bào)文結(jié)構(gòu)
請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求頭部、空行和請(qǐng)求正文4部分組成,請(qǐng)求報(bào)文結(jié)構(gòu)如圖3所示。請(qǐng)求行由請(qǐng)求方法類(lèi)型、URL地址和協(xié)議版本字段組成,需使用空格隔開(kāi)。請(qǐng)求類(lèi)型有GET和POST兩種方法。GET方法是要求服務(wù)器把URL定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,一般用于客戶(hù)端向服務(wù)器請(qǐng)求某個(gè)資源。POST方法一般用于客戶(hù)端向服務(wù)器提交數(shù)據(jù),如智能電器向服務(wù)器發(fā)送設(shè)備狀態(tài)數(shù)據(jù)的表單,將數(shù)據(jù)提交給服務(wù)器處理,例如:POST/index.jsp HTTP/1.1,其中POST是請(qǐng)求方法,/index.jsp是訪問(wèn)路徑,HTTP/1.1是協(xié)議版本。請(qǐng)求頭部由關(guān)鍵字和值對(duì)組成,用于通知服務(wù)器關(guān)于客戶(hù)端的請(qǐng)求信息。例如,host∶192.168.24.56,用于指定訪問(wèn)服務(wù)器地址。請(qǐng)求頭部之后是一個(gè)空行,發(fā)送回車(chē)符和換行符,通知服務(wù)器以下內(nèi)容是請(qǐng)求包體。請(qǐng)求包體在POST方法中用于傳遞大量數(shù)據(jù),與請(qǐng)求包體相關(guān)的最常用的包體類(lèi)型和包體長(zhǎng)度,最后將傳送數(shù)據(jù)附在后面構(gòu)成請(qǐng)求報(bào)文。
圖3 請(qǐng)求報(bào)文結(jié)構(gòu)
2.2.2 響應(yīng)報(bào)文結(jié)構(gòu)
HTTP響應(yīng)報(bào)文由響應(yīng)狀態(tài)行、響應(yīng)頭部、空行和響應(yīng)包體4部分組成。響應(yīng)狀態(tài)行由協(xié)議版本、狀態(tài)碼和狀態(tài)描述組成。響應(yīng)狀態(tài)碼由三位數(shù)字組成,200 OK表明客戶(hù)端請(qǐng)求成功,400 Bad Request表明客戶(hù)端請(qǐng)求出現(xiàn)了語(yǔ)法錯(cuò)誤。響應(yīng)頭部和請(qǐng)求頭部的格式相同,Content-Type和Content-Length是對(duì)響應(yīng)內(nèi)容的類(lèi)型和長(zhǎng)度進(jìn)行設(shè)置。響應(yīng)頭部后是一個(gè)空行,通知客戶(hù)端以下為響應(yīng)包體內(nèi)容。響應(yīng)包體中主要附加服務(wù)器返回給客戶(hù)端的數(shù)據(jù)信息。圖4為手機(jī)客戶(hù)端的請(qǐng)求報(bào)文和服務(wù)器的響應(yīng)報(bào)文舉例。
圖4 請(qǐng)求報(bào)文和響應(yīng)報(bào)文舉例
手機(jī)客戶(hù)端點(diǎn)擊Button按鈕觸發(fā)一個(gè)訪問(wèn)服務(wù)器的操作,客戶(hù)端會(huì)調(diào)用訪問(wèn)服務(wù)器的通信請(qǐng)求程序,服務(wù)器則通過(guò)Tomcat服務(wù)器中的Servlet通信接口接收客戶(hù)端請(qǐng)求,并按照用戶(hù)邏輯做出響應(yīng)并返回給客戶(hù)端。單片機(jī)通過(guò)WiFi無(wú)線(xiàn)模塊接收信號(hào)也是作為客戶(hù)端與Web服務(wù)器連接,單片機(jī)中采用C語(yǔ)言編程,數(shù)據(jù)的報(bào)文格式和手機(jī)一致,以Android手機(jī)客戶(hù)端為例加以說(shuō)明,應(yīng)用程序采用Java語(yǔ)言編程實(shí)現(xiàn)??蛻?hù)端和服務(wù)器通信的流程如圖5所示。
客戶(hù)端首先新建一個(gè)HttpClient接口、一個(gè)HttpGet對(duì)象,指向所訪問(wèn)服務(wù)器IP地址,并把需要傳遞的數(shù)據(jù)附在地址后面?zhèn)鬟f,采用的語(yǔ)句如下:
httpGet=new HttpGet("http∶//192.168.1.3"+"id");
圖5 客戶(hù)端和服務(wù)器的HTTP通信接口程序流程
GET傳遞方式適合傳遞較少數(shù)據(jù),當(dāng)需要完成大量數(shù)據(jù)傳遞需要使用POST方法。在try函數(shù)中調(diào)用通信接口中的execute方法,執(zhí)行客戶(hù)端向服務(wù)器的連接請(qǐng)求,準(zhǔn)備通過(guò)HttpResponse類(lèi)接收服務(wù)器返回的響應(yīng)。當(dāng)接收到響應(yīng)數(shù)據(jù)后,調(diào)取狀態(tài)碼判斷連接是否成功,將返回?cái)?shù)據(jù)用getEntity()方法取出,并轉(zhuǎn)化成字符串??蛻?hù)端訪問(wèn)服務(wù)器通信接口任務(wù)完成。
try{
HttpResponse serverResponse=httpCient.execute(httpGet);
if(serverResponse.getStatusLine().getStatus-Code()==200){
HttpEntity serverEntity = serverResponse.getEntity();
String response=EntityUtils.toString(serverEntity,"utf-8");
}
服務(wù)器接收請(qǐng)求的接口是HttpServlet,在其中重寫(xiě)了doGet()方法,完成Servlet接口接收請(qǐng)求數(shù)據(jù)(HttpServletRequest)和返回服務(wù)器響應(yīng)(HttpServletResponse)的任務(wù)。在doGet()方法中,首先調(diào)用了getParamete()方法獲取request請(qǐng)求參數(shù),然后設(shè)置response響應(yīng)內(nèi)容類(lèi)型和數(shù)據(jù)格式,在try函數(shù)中進(jìn)行用戶(hù)邏輯處理之后,把響應(yīng)數(shù)據(jù)封裝為JSON格式并裝載到JSONObject對(duì)象中,調(diào)用getWriter()方法返回服務(wù)器給客戶(hù)端的response響應(yīng),最后通過(guò)PrintWriter對(duì)象把jObject響應(yīng)發(fā)送給客戶(hù)端,關(guān)閉連接響應(yīng)任務(wù)結(jié)束。doGet()方法的程序內(nèi)容如下:
doGet(){String nidStr=request.getParameter("id");
response.setContentType("text/html;charset=UTF-8");
JSONObject jObject=new JSONObject();
try{jObject.put("data",nidStr);}catch(Exceptione){…}
PrintWriter out=response.getWriter();
out.println(jObject);out.flush();out.close();}
在Android手機(jī)端點(diǎn)擊相應(yīng)控制按鈕,通過(guò)智能手機(jī)的HttpClient通信接口將指令發(fā)送到Web服務(wù)器端,服務(wù)器通過(guò)HttpServlet通訊接口接收客戶(hù)端指令,再把命令通過(guò)無(wú)線(xiàn)網(wǎng)絡(luò)發(fā)送給Wifi模塊,指令由單片機(jī)負(fù)責(zé)接收并執(zhí)行電器控制動(dòng)作。安卓手機(jī)和服務(wù)器的開(kāi)發(fā)采用Eclipse平臺(tái),包括界面設(shè)計(jì)、通信接口和數(shù)據(jù)庫(kù)操作等模塊;單片機(jī)采用Keil平臺(tái)開(kāi)發(fā),負(fù)責(zé)收發(fā)指令和執(zhí)行繼電器控制;服務(wù)器采用Tomcat輕量級(jí)Web服務(wù)器為系統(tǒng)提供用戶(hù)應(yīng)答和數(shù)據(jù)庫(kù)訪問(wèn)。經(jīng)過(guò)系統(tǒng)現(xiàn)場(chǎng)調(diào)試和測(cè)試,實(shí)現(xiàn)了無(wú)線(xiàn)網(wǎng)絡(luò)中智能手機(jī)對(duì)電器設(shè)備的遠(yuǎn)程監(jiān)控。
設(shè)計(jì)一個(gè)基于Android手機(jī)的遠(yuǎn)程控制電器的通信系統(tǒng),闡述了無(wú)線(xiàn)網(wǎng)絡(luò)中通信接口的原理和設(shè)計(jì)方法,測(cè)試并驗(yàn)證了該控制系統(tǒng)的正確性和有效性。手機(jī)用戶(hù)通過(guò)訪問(wèn)Web服務(wù)監(jiān)測(cè)和管理電器設(shè)備,通信模式采用HTTP協(xié)議下的C/S網(wǎng)絡(luò)結(jié)構(gòu),通過(guò)客戶(hù)端的HttpClient接口和服務(wù)器的HttpServlet接口完成請(qǐng)求和響應(yīng)報(bào)文的傳遞。該系統(tǒng)可根據(jù)用戶(hù)需求靈活設(shè)計(jì),可移植性強(qiáng),可廣泛應(yīng)用于工廠和車(chē)間設(shè)備的遠(yuǎn)程監(jiān)控。