彭鳳凌,庹先國,2,王洪輝,鐘佳訊,蒲建華
(1.成都理工大學 地質災害防治與地質環境保護國家重點實驗室,四川 成都610059;2.西南科技大學 核廢物與環境安全國防重點學科實驗室,四川 綿陽621010)
數據庫技術的誕生使得人們能夠方便的對大量數據進行存取與管理[1]。隨著智能手機和移動通信技術的快速發展,越來越多的數據庫應用從原來的Windows系統漸漸轉移到了智能設備上,由于智能設備現階段的水平還無法與PC相比,因此訪問數據庫也就不能簡單的在智能設備上開發應用程序來完成。關于智能設備訪問數據庫的技術,前人有一些成果,總結起來主要是通過與Web服務器打交道實現,如文獻[2]和文獻[3]就是采用的這種方法。該方法雖比較成熟且為常用方法,但訪問Web服務器必然需要采用超文本傳輸協議 (即HTTP協議),然后HTTP協議非常復雜,每次進行通信時都必須按照該協議的格式將信息進行封裝從而大大增加了信息傳輸量并提高了傳輸成本,且該方法已經成熟,因此對于數據庫訪問的效率和實時性等方面改進空間已經很小。對此,筆者以Android手機與Oracle數據交互為例,以TCP協議和ODBC技術為基礎提出了另一種智能設備高效、快速的訪問遠程數據庫的方法,該方法與常用方法相比,能夠大大降低傳輸的信息量從而減少智能設備使用流量并在一定程度上提高訪問數據庫的效率和速度,具有一定借鑒價值。
通常移動終端與數據庫交互方法是:移動終端通過API首先與遠程的Web服務器建立連接,再將相關數據嚴格按照HTTP協議格式將其封裝并發送到Web服務器中,Web服務器將信息進行拆封解析然后訪問數據庫,最后將數據庫操作結果按照HTTP協議格式返回給移動終端。即利用手機端的API將數據提交到Web服務端的Servlet或者JSP文件中去。該方法雖然為常用方法,但存在一個問題,那就是每次移動終端與服務器之間的通信,發送方都必須按照HTTP協議格式封裝信息 (即使只是傳輸一個簡單的字符串,也必須嚴格封裝信息),但HTTP協議非常復雜,采用它要除了需要傳輸許多額外的封裝信息 (如html的標記),因此當傳輸的數據信息 (即實際有用信息)小于封裝信息時,該方法顯得浪費流量且大大提高成本。根據TCP/IP參考模型,HTTP實際上是應用層的協議,它是根據傳輸層的TCP協議而來,基于此本文提出直接采用TCP協議實現信息傳輸,并由PC端的Windows應用軟件充當與數據庫交互的中介,避免了與Web服務器打交道,從而大大降低信息的傳輸量且能提高訪問數據庫的效率和速度,這也是本文的出發點。
搭建Android開發環境可以通過采用Eclipse工具配合相關插件和Android的SDK即可完成[4-5],Andriod應用程序主要由四大組件構成:第一 (活動):它是用戶可見且可操作的界面并擁有獨立生命周期;第二 (服務):與活動相似但無界面并且運行于后臺;第三 (廣播接收者):它可以在系統內實現所有廣播;第四 (內容提供者):它為應用程序提供所需要的數據并存儲重要數據。
Socket即套接字的意思,它是一項比較成熟的點對點通信技術[6-11],適用于多種操作環境。通信雙方只需建立各自的Socket,通過操作Socket即可完成通信。它對應于TCP和UDP兩種通信方式,由于TCP通信方式比UDP更加可靠,所以本文采用TCP方式。
ODBC即開放數據庫互連,它是由微軟推出的一種數據庫訪問接口標準,應用程序不必重新編譯、連接就可以與不同的DBMS打交道。驅動程序管理器負責將應用程序對ODBC API的調用傳遞給正確的驅動程序,驅動程序在執行完相應操作后,將結果通過驅動程序管理器返回給應用程序。因此只要創建了ODBC數據源,且測試數據源成功,即可通過調用相關API來操作數據庫。圖1為ODBC的訪問數據庫的流程圖。

圖1 ODBC訪問流程
通過分析Socket通信基本原理和ODBC技術,可以提出一種手機遠程操作數據庫的方案,即手機端利用Socket通信通過移動網絡接入Internet(當然也可利用WIFI接入Internnet)實現與遠程PC的通信,然后PC端再利用ODBC技術與數據庫進行交互,從而使PC端成為手機端與數據庫交互的中介,并使得手機端能夠間接訪問到遠程數據庫。根據這個思路,整個交互過程分為3個過程:第一,手機端將要執行的SQL語句和相關信息發送到PC端;第二,PC端建立與數據庫的連接并執行SQL語句;第三,PC端將執行結果發送回手機端。圖2為方案設計圖。

圖2 方案設計
該部分完成Socket通信的初始化以及PC與數據庫Connection的建立。Socket通信雙方首先需要創建各自的Socket,PC端將IP地址和端口號綁定到Socket,然后開始監聽端口。此時若手機端發出連接請求,PC端則會接受請求并接通連接,此時雙方可相互通信。圖3為初始化流程圖。而數據庫的建立需要分配環境句柄并設置連接屬性。

圖3 初始化流程
Socket初始化完成后,通信雙方的連接已經建立,可以進行信息的收發。對于Android端,由于采用Java語言編寫,需要創建Socket對象,并利用getOutputStream()獲取輸出流,最后向輸出流寫入內容并調用flush方法即完成信息的發送。而接收信息則采用read方法實現。對于PC端,由于采用C語言編寫,所以直接采用recv()方法接收信息,采用send()方法發送信息 (此方法僅適用于傳輸普通信息,如果要傳輸文件,需要對此方法進行改進,本文后面會談到)。由于本文重點闡述操作機制在通信過程中的實現過程,對于Android手機和PC端兩方與通信無關的部分 (如Android手機界面設計、PC端怎樣將軟件運行于后臺等)的實現過程不做過多介紹。同時對于信息在傳輸過程中,基本以字符串為主,發送方只需按照協議生成特定字符串,接收方只需按照協議拆分字符串即可獲取需要的信息,從而無需對數據進行封裝和拆封工作,避免傳輸多余信息。
4.3.1 簡單數據庫操作
簡單數據操作指的是手機對數據庫的常用操作,即對數據庫進行增加數據、刪除數據、更改數據3種操作,這3種操作特點是無需從數據庫返回信息。(且增加數據操作不包括將文件增加到數據庫)。對于這種數據庫操作,Android端首先發送數據包A,(其中包含字符 “1”和要操作的SQL語句),PC端接收數據包后以字符 “@@@”分割數據包,當判斷出獲取的第一個字符是 “1”時,PC端明白了本次操作是簡單數據庫操作,因此直接執行收到的SQL語句,執行失敗或者成功都會向手機端返回相關信息(信息Y和Z),圖4為其操作流程圖
4.3.2 查詢數據庫操作

圖4 簡單數據庫操作流程
查詢數據庫除了要執行SQL語句外,還需要使用游標獲取數據庫返回的查詢結果并將結果合成一個字符串發送到手機端。具體過程為:首先手機端發送數據包B(其中包含字符 “2”和要操作的SQL語句),PC端用同樣的方法拆分數據包并判斷出第一個字符是 “2”即明白本次操作是查詢數據庫操作,因此立即執行SQL語句,執行完畢后會使用SQLFetch()方法配合strcat()方法將多項查詢結果以 “--”作為分隔符連接起來生成一個字符串。然后將其傳輸回手機端,手機端只需按 “--”拆分字符串即可獲取需要的信息。圖5為其操作流程圖。

圖5 查詢數據庫操作流程
4.3.3 文件上傳操作
文件上傳相比前面兩種數據庫操作要復雜些,因為文件通常比一般信息要大許多,其傳輸過程需要在通信雙方TCP協議層之上 (即應用層)設計一套通信協議。其實現過程的具體流程為:首先Android手機端發送數據包C(包含字符 “3”、SQL語句和文件名),PC端接收數據包并拆分數據包判斷出第一個字符是 “3”即明白本次操作為文件上傳操作,此時PC端會立即根據收到文件名的后綴名創建出一個同類型的空文件 (這樣可以保證手機端傳輸的文件和PC端聲場的文件類型的一致性)并向手機端發送信息T,表示PC端已經準備好文件的接收。手機端收到信息T后則開始向PC端進行文件傳輸,完畢后PC端則將文件插入數據庫中。整個過程需要解決文件傳輸問題和文件入庫問題。第一:文件傳輸實質是傳輸文件的二進制流,但是文件由于較大,因此不能簡單的利用Socket的相關API一次性將文件的全部二進制流傳輸完畢,需要分批多次傳送且順序不能錯,同時接收方也需要首先創建一個與發送方同類型的空文件,然后按正確順序將收到的二進制流寫入到空文件中。以下為手機端文件傳輸部分重要代碼。
Android端:socket=new Socket(IP,Port);
inputStream=new FileInputStream(pic);
outputStream=socket.getOutputStream();
writer=newOutputStreamWriter(outputStream);
while ((temp=inputStream.read(buffer))?。剑?){
outputStream1.write(buffer,0,temp);
outputStream1.flush();}
PC端:PC端:fp=fopen(" 文件名 .后綴名","ab");
while(1){
rn=recv (sockConn,recvBuf,256,0);
if(rn==0){
break;}
fwrite(recvBuf,1,rn,fp); }
當文件順利傳輸到PC端后,需要將文件入庫。由于Oracle數據庫特性,必須先執行Insert語句向數據庫blob字段插入EMPTY_BLOB(),即空數據,然后采用SQLPrepare()方法以 “準備執行”的方式執行Updata語句,并使用SQLBindParameter()方法將數據庫中的Blob字段與程序中的緩沖區綁定,接著將PC收到的文件分批多次寫入到緩沖區中,最后使用SQLPutData方法將緩沖區內容寫入到數據庫blob字段中。圖6為文件上傳到數據庫的流程圖,表1為以上涉及的每種信息所包含的具體內容。

圖6 文件上傳流程

表1 信息內容
測試方法為:首先打開PC端的接收軟件,點擊Android端的 “測試連接”按鈕,若測試通過說明網絡連接已經接通,此時可以編輯SQL語句并點擊 “執行操作”按鈕實現對遠程數據庫的操作。圖7為從數據庫中查詢出信息的效果圖。通過與常用方法 (即用Web服務器訪問數據庫的方法)進行大量的測試對比表明:當傳輸的信息總量在1KB-10KB間時,該方法能夠降低40%-70%的信息傳輸量,并縮短32%-45%的信息傳遞時間。當傳輸的信息量在10KB-200KB間時,該方法能夠降低16%-40%的信息傳輸量并縮短9%-22%的信息傳遞時間,當信息量>200KB時,該方法與常用方法相比差別不大。因此得出結論:該方法在傳輸信息總量不大的情況下,可以大大節約手機流量并提高訪問數據庫的效率和速度。
本文以Android手機與Oracle數據庫交互為例,摒棄了通過Web服務器訪問數據庫訪問的常用方法,提出了另一種智能設備訪問數據庫的方法并通過實驗驗證了該方法的可靠性和優點,本文主要創新點在于:1將Socket通信技術與ODBC技術相結合提出了一種智能設備訪問遠程數據庫的方法2設計了嚴謹的通信協議和數據庫操作機制,不僅能夠一定程度上節約手機流量而且能夠提高訪問數據庫的效率。對于需要用到智能設備訪問遠程數據庫技術的領域 (如移動電子商務等)有一定實用價值和借鑒價值。

圖7 測試效果
[1]GONG Fuyan.Application and development of database technology[J].Programming Skills & Maintenance,2012,12(12):51-52 (in Chinese).[龔伏廷.淺談數據庫技術的應用與發展[J].電腦編程技巧與維護,2012,12 (12):51-52.]
[2]WANG Shaoxiang,SHAO Yubin,LONG Hua.A data interaction method between Android phone and database[J].Journal of Zhengzhou University of Light Industry,2011,26 (6):28-30(in Chinese).[王紹祥,邵玉斌,龍華.Android手機與數據庫的一種數據交互方法[J].鄭州輕工業學院學報,2011,26(6):28-30.]
[3]QUAN Zhongmin,PENG Xijun.An Android efficient and safe method to access the database based on JSON[J].Journal of Shaoguan University,2011,32 (12):16-20 (in Chinese).[權重民,彭昕昀.利用JSON實現Android高效、安全訪問遠程數據庫的一種方式[J].韶關學院學報,2011,32 (12):16-20.]
[4]YU Zhilong,CHEN Xiaofeng.Google android development introductory and practice[M].Beijing:Posts &Telecom Press,2009(in Chinese).[余志龍,陳小風.Google android開發入門與實戰[M].北京:人民郵電出版社,2009.]
[5]LE Yan,YAO Shanglang,CHEN Xiaofeng.Google Android SDK development examples[M].Beijing:Posts & Telecom Press,2009(in Chinese).[勒巖,姚尚郎,陳小風,等.Google Android SDK開發范例大全[M].北京:人民郵電出版社,2009.]
[6]CHEN Lihao.Real-time communication system based on B/S and C/S[J].Computer Engineering,2012,35 (15):27-28(in Chinese).[陳立浩.基于B/S和C/S的即時通信系統[J].計算機工程,2012,35 (15):27-28.]
[7]YAN Bicheng,LI Feng.Communication mechanism between mobile terminal and remote computer[J].Computer Engineering,2010,36 (24):93-95 (in Chinese).[晏弼成,李峰.一種移動終端與遠程計算機間的通信機制[J].計算機工程,2010,36 (24):93-95.]
[8]HUANG Weimin.Design of real-time communication system client based on Android[J].Modern Electronics Technique,2011,34 (16):140-142 (in Chinese).[黃偉敏.Android平臺的即時通信系統客戶端設計方案[J].現代電子技術,2011,34 (16):140-142.]
[9]GENG Dongjiu,SUO Yue,CHEN Yu,et al.Remote access and control system based on Android phones[J].Journal of Computer Applications,2011,31 (2):559-561 (in Chinese).[耿東久,索岳,陳渝,等.基于Android手機的遠程訪問和控制系統[J].計算機應用,2011,31 (2):559-561.]
[10]SONG Qiang,QI Guibao,SONG Zhanwei.H.264video surveillance design based on Android[J].Journal of Jilin University,2012,31 (2):272-278 (in Chinese).[宋強,齊貴寶,宋占偉.基于Android系統的H.264視頻監控設計[J].吉林大學學報 (信息科學版),2012,31 (2):272-278.]
[11]CHEN Hao,LI Benfu.Mobile police system development based on Android[J].Science Technology and Engineering,2012,12 (4):911-913 (in Chinese).[陳浩,李本富.基于Android的移動警務系統開發[J].科學技術與工程,2012,12 (4):911-913.]