彭凤凌,庹先国,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))!=-1){
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.]