劉力維
摘? 要:文章介紹了一種在安卓平臺(tái)上實(shí)現(xiàn)基于HTTP協(xié)議數(shù)據(jù)網(wǎng)關(guān)的方法,并詳細(xì)闡述了數(shù)據(jù)網(wǎng)關(guān)與終端網(wǎng)絡(luò)設(shè)備之間數(shù)據(jù)傳輸?shù)膶?shí)現(xiàn)過程。
關(guān)鍵詞:安卓平臺(tái);服務(wù)器;應(yīng)用開發(fā)
中圖分類號(hào):TP311? ? ? ? ?文獻(xiàn)標(biāo)志碼:A? ? ? ? ?文章編號(hào):2095-2945(2020)34-0086-02
Abstract: This paper introduces a method of implementing data gateway based on HTTP protocol on Android platform, and elaborates the implementation process of data transmission between data gateway and terminal network equipment.
Keywords: Android platform; server; application development
1 HTTP數(shù)據(jù)網(wǎng)關(guān)功能概述
數(shù)據(jù)網(wǎng)關(guān)廣泛應(yīng)用于各種網(wǎng)絡(luò)數(shù)據(jù)采集與傳輸系統(tǒng),為終端網(wǎng)絡(luò)設(shè)備提供數(shù)據(jù)傳輸?shù)慕涌冢瑢?shí)現(xiàn)對(duì)終端網(wǎng)絡(luò)設(shè)備發(fā)起的數(shù)據(jù)傳輸請(qǐng)求的解析和響應(yīng)。HTTP協(xié)議是一種典型的基于請(qǐng)求、響應(yīng)機(jī)制的應(yīng)用層協(xié)議,通過對(duì)協(xié)議報(bào)文的構(gòu)造,可以方便地將HTTP協(xié)議用于實(shí)現(xiàn)數(shù)據(jù)網(wǎng)關(guān)各項(xiàng)功能。
隨著移動(dòng)智能設(shè)備的普及,安卓在嵌入式系統(tǒng)中獲得了越來越廣泛的應(yīng)用。本文介紹的數(shù)據(jù)網(wǎng)關(guān)就是一個(gè)實(shí)現(xiàn)了HTTP數(shù)據(jù)服務(wù)器功能的安卓應(yīng)用系統(tǒng)。系統(tǒng)功能框圖如圖1所示。數(shù)據(jù)網(wǎng)關(guān)和終端網(wǎng)絡(luò)設(shè)備之間通過HTTP協(xié)議進(jìn)行數(shù)據(jù)通信,接收終端網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)傳輸請(qǐng)求,并負(fù)責(zé)向終端網(wǎng)絡(luò)設(shè)備發(fā)出正確的響應(yīng)。數(shù)據(jù)網(wǎng)關(guān)作為終端設(shè)備的數(shù)據(jù)服務(wù)器,其數(shù)據(jù)通常來源于本地或網(wǎng)絡(luò)數(shù)據(jù)庫存儲(chǔ)的數(shù)據(jù),在網(wǎng)絡(luò)采集與傳輸系統(tǒng)中,數(shù)據(jù)也可能獲取自單獨(dú)的數(shù)據(jù)采集設(shè)備。
2 數(shù)據(jù)網(wǎng)關(guān)與終端設(shè)備之間的數(shù)據(jù)傳輸過程
數(shù)據(jù)網(wǎng)關(guān)與終端網(wǎng)絡(luò)設(shè)備之間的數(shù)據(jù)傳輸過程可以按功能分解為兩個(gè)主要部分,如圖2所示。
首先是數(shù)據(jù)的封裝及解析過程。在網(wǎng)絡(luò)終端設(shè)備上,進(jìn)行數(shù)據(jù)發(fā)送前,需要將發(fā)送數(shù)據(jù)按照一定格式進(jìn)行封裝,以便數(shù)據(jù)網(wǎng)關(guān)接收數(shù)據(jù)后能夠通過解析過程得到正確的數(shù)據(jù)。在數(shù)據(jù)網(wǎng)關(guān)向網(wǎng)絡(luò)終端設(shè)備發(fā)送響應(yīng)報(bào)文時(shí)同樣需要數(shù)據(jù)的封裝和解析過程。
第二部分功能是基于HTTP協(xié)議的網(wǎng)絡(luò)報(bào)文收發(fā)。具體包括終端網(wǎng)絡(luò)設(shè)備向數(shù)據(jù)網(wǎng)關(guān)發(fā)送HTTP請(qǐng)求;數(shù)據(jù)網(wǎng)關(guān)對(duì)該HTTP請(qǐng)求的接收;數(shù)據(jù)網(wǎng)關(guān)向網(wǎng)絡(luò)終端設(shè)備發(fā)送HTTP響應(yīng)以及終端網(wǎng)絡(luò)設(shè)備接收處理HTTP響應(yīng)的過程。安卓平臺(tái)上使用HTTP客戶端相關(guān)類和方法實(shí)現(xiàn)終端網(wǎng)絡(luò)設(shè)備功能相對(duì)來說比較簡單,本文主要分析數(shù)據(jù)網(wǎng)關(guān)上述數(shù)據(jù)傳輸過程的具體實(shí)現(xiàn)。
3 數(shù)據(jù)封裝的實(shí)現(xiàn)
終端網(wǎng)絡(luò)設(shè)備與數(shù)據(jù)網(wǎng)關(guān)之間傳輸?shù)臄?shù)據(jù)通常包含多種類型。為了實(shí)現(xiàn)對(duì)多種類型數(shù)據(jù)的傳輸,在HTTP數(shù)據(jù)包中采用了JSON數(shù)據(jù)格式對(duì)數(shù)據(jù)進(jìn)行封裝[1]。數(shù)據(jù)傳輸過程如下:
終端網(wǎng)絡(luò)設(shè)備構(gòu)造HTTP POST請(qǐng)求發(fā)送給數(shù)據(jù)網(wǎng)關(guān),將傳輸數(shù)據(jù)以JSON對(duì)象的形式封裝入HTTP請(qǐng)求的消息實(shí)體中。通過put方法可以向一個(gè)JSON對(duì)象添加數(shù)據(jù)。JSON對(duì)象內(nèi)部包含多個(gè)鍵值對(duì),用來描述具體的請(qǐng)求數(shù)據(jù)。
在數(shù)據(jù)網(wǎng)關(guān)上,首先從接收到的HTTP請(qǐng)求得到消息實(shí)體,然后使用JSON對(duì)象的getString等方法對(duì)消息實(shí)體進(jìn)行解析,即可得到具體的請(qǐng)求數(shù)據(jù)。
在數(shù)據(jù)網(wǎng)關(guān)發(fā)送給終端網(wǎng)絡(luò)設(shè)備的HTTP響應(yīng)數(shù)據(jù)包中,同樣可以進(jìn)行JSON對(duì)象的封裝,并由終端網(wǎng)絡(luò)設(shè)備進(jìn)行解析,以實(shí)現(xiàn)HTTP響應(yīng)報(bào)文的數(shù)據(jù)傳遞。
4 數(shù)據(jù)網(wǎng)關(guān)上HTTP協(xié)議數(shù)據(jù)處理的實(shí)現(xiàn)
數(shù)據(jù)網(wǎng)關(guān)通過NanoHTTPD實(shí)現(xiàn)了HTTP服務(wù)器功能。NanoHTTPD是一個(gè)免費(fèi)、輕量級(jí)的HTTP服務(wù)器,支持多種HTTP請(qǐng)求,通過幾個(gè)主要方法和類實(shí)現(xiàn)對(duì)客戶端連接請(qǐng)求的偵聽和數(shù)據(jù)的傳輸。
實(shí)現(xiàn)HTTP網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)牡谝徊剑墙⒖蛻舳伺c服務(wù)器間的TCP連接并在適當(dāng)?shù)臅r(shí)候斷開該連接。在建立TCP連接的過程中,終端網(wǎng)絡(luò)設(shè)備作為客戶端,其任務(wù)比較簡單:發(fā)起連接請(qǐng)求,等待服務(wù)器的響應(yīng)并完成握手。數(shù)據(jù)網(wǎng)關(guān)作為服務(wù)器,負(fù)責(zé)TCP連接的偵聽、建立和維護(hù)工作。在NanoHTTPD中,這部分工作主要在start方法中完成。首先,創(chuàng)建ServerSocket類的實(shí)例,并綁定本HTTP連接的主機(jī)IP地址和所使用的端口號(hào)。接著,在start方法中創(chuàng)建線程,并改寫線程的run方法,用于等待并接收客戶端的連接。在run方法中首先調(diào)用ServerSocket的accept方法,程序?qū)⒆枞谶@里偵聽客戶端的連接請(qǐng)求。當(dāng)有客戶端請(qǐng)求連接時(shí),程序繼續(xù)運(yùn)行,設(shè)置HTTP session的Keep Alive時(shí)間。一旦客戶端與服務(wù)器之間的HTTP連接持續(xù)處于空閑狀態(tài)超過該時(shí)間,服務(wù)器將關(guān)閉該HTTP連接。
在start方法創(chuàng)建線程并接收客戶端的連接請(qǐng)求后,通過得到的Socket實(shí)例創(chuàng)建用于數(shù)據(jù)收發(fā)的輸入輸出流,并通過AsyncRunner創(chuàng)建一個(gè)獨(dú)立的線程,來處理這個(gè)新的客戶端連接。新線程首先創(chuàng)建一個(gè)本地臨時(shí)文件,該文件將在后面用于存儲(chǔ)客戶端上傳的數(shù)據(jù)。然后,創(chuàng)建對(duì)應(yīng)該連接的HttpSession,并將臨時(shí)文件和輸入輸出流作為輸入?yún)?shù)傳遞給該session。最后,通過while循環(huán)執(zhí)行 HttpSession的exec方法進(jìn)行客戶端數(shù)據(jù)處理,只要該客戶端連接沒有被關(guān)閉,該方法將被循環(huán)調(diào)用。HttpSession的execute方法主要功能是對(duì)接收到的客戶端數(shù)據(jù)進(jìn)行處理,解析出HTTP請(qǐng)求消息的頭域信息和消息實(shí)體信息。對(duì)于本文中的HTTP網(wǎng)絡(luò)數(shù)據(jù)傳輸應(yīng)用,消息實(shí)體中存放的是終端網(wǎng)絡(luò)設(shè)備HTTP請(qǐng)求的具體內(nèi)容。通過改寫exec方法調(diào)用的serve方法,實(shí)現(xiàn)終端網(wǎng)絡(luò)設(shè)備封裝的JSON對(duì)象的解析,可以得到終端網(wǎng)絡(luò)設(shè)備發(fā)送的具體請(qǐng)求。通過上述過程,實(shí)現(xiàn)了終端網(wǎng)絡(luò)設(shè)備到數(shù)據(jù)網(wǎng)關(guān)的一次完整數(shù)據(jù)請(qǐng)求。
數(shù)據(jù)網(wǎng)關(guān)向終端網(wǎng)絡(luò)設(shè)備發(fā)送HTTP響應(yīng)的過程與前述過程類似,這里不再贅述。
5 HTTP數(shù)據(jù)網(wǎng)關(guān)的應(yīng)用
本文中的數(shù)據(jù)網(wǎng)關(guān)采用HTTP協(xié)議,基于IP地址或域名實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸。該方法既可以應(yīng)用于有線局域網(wǎng),也可以基于Wi-Fi等無線網(wǎng)絡(luò)技術(shù)[2]實(shí)現(xiàn)移動(dòng)終端設(shè)備與數(shù)據(jù)網(wǎng)關(guān)間的數(shù)據(jù)傳輸。如果為數(shù)據(jù)網(wǎng)關(guān)分配公網(wǎng)域名和IP地址,則可實(shí)現(xiàn)基于廣域網(wǎng)的遠(yuǎn)程數(shù)據(jù)傳輸。
參考文獻(xiàn):
[1]龔建華.JSON格式數(shù)據(jù)在Web開發(fā)中的應(yīng)用[J].辦公自動(dòng)化:綜合月刊,2013(20):46-48.
[2]李立芬.基于Wi-Fi技術(shù)在電信業(yè)務(wù)中的應(yīng)用[J].中國多媒體通信,2012(12):67-68.
[3]宋銳星,朱小勇,胡琳琳,等.HTTP媒體傳輸方式簡述[J].網(wǎng)絡(luò)新媒體技術(shù),2020,9(03):61-67.