APP下载

基于Android的实时位置共享及应用研究

2016-12-14章义刚

皖西学院学报 2016年5期
关键词:缓冲区线程命令

章义刚

(合肥学院,安徽 合肥 230601)



基于Android的实时位置共享及应用研究

章义刚

(合肥学院,安徽 合肥 230601)

给出了地理位置信息实时共享的应用解决方案。客户端间通过服务器的转发通信,实现了地理位置信息共享,文字信息交流与电子地图服务等功能。服务器端使用I/O完成端口机制对多用户请求进行并发处理,满足请求回复低延迟的要求;服务器端数据转发时通过最小化数据内存拷贝次数以及对多个数据包聚合传输以最大化网络带宽的利用率等技术,保证数据转发的实时性;按客户端的功能与交互分开的原则,将客户端的功能封装成可方便移植的客户端库,简化了多平台客户端的开发。

电子地图;I/O完成端口;位置共享

随着互联网及计算机的发展和不断普及,地图已经从纸上走到了互联网、个人电脑和手持设备里了[1,2]。尤其是智能手机,4G网络,android系统等的发展,使现在的手持设备具备上网速度快,系统开放等优点。人们可以通过手持设备上的电子地图很容易地搜索到各种感兴趣的地点,行车路线及公交线路等,通过把电子地图与GPS定位导航相结合起来,使出行变方便了[3](P388-401),[4](P103-123)。现如今,越来越多的行业都在使用电子地图,尤其是在 GPS 导航中,它让我们的生活及出行变得更加方便快捷[5,6]。

本系统便是电子地图下的一种应用,服务器利用IOCP技术实现将被需要的地理位置信息转发给其他人,实现人与人之间直观的共享地理位置信息。客户端间通过服务器的转发通信,实现了地理位置信息共享,文字信息交流与电子地图服务等功能。

1 系统体系结构与交互设计

1.1 服务器结构

服务器的体系结构采用了分层的体系结构,提供的主要的功能模块包括:网络通信模块、数据存储模块、用户管理模块、逻辑处理模块、服务器界面模块。如图1所示。

图1 服务器模块组成

网络通信模块负责数据的传输和管理连接,上层只需要处理网络通信模块产生的几个事件接口即可,如收到连接请求,收到数据,发送数据成功,连接断开。

数据存储模块负责保存和索引用户的信息等所有需要保存的数据。

用户管理模块负责管理所有用户状态信息,管理用户的命令缓冲区等内存缓冲区。

逻辑处理模块是与协议相关的层,集成了许多重要的逻辑处理过程,如:加解密网络数据(无法加解密用户密码),解析命令和数据,命令的执行逻辑,回复命令等。逻辑处理模块同时给界面层提供了访问或操作用户的接口,如给所有在线用户发广播消息[7,8]。

服务器界面模块负责与管理员交互,实现对服务器的控制。

服务器端线程:界面线程,TCP监听线程,TCP数据收发线程,UDP数据收发线程。线程数不是固定的,某些线程可根据CPU内核数动态创建。

1.2 客户端结构

为了能够对多终端与多系统提供支持,客户端分成了客户端界面程序和Client SDK两部分(如图2所示)。Client SDK用于提供二次开发,以方便系统移植[9](P444-448)。

图2 客户端的组成

客户端的网络通信模块和服务器的网络通信模块的职责是相同的,但它们的功能需求是完全不同的,所以它们的具体设计是不同的。客户端的网络通信部分使用的是Socket编程,每个通道只有一条连接,只开一个线程。

数据存储模块。负责存储用户每次登录成功所使用的用户名和密码,同时还保存一些其他信息(如用户的好友列表,启动时画面广告)。通过将信息使用一定的格式(xml、json、google protobuf)保存到文件中,当程序下次启动时,从文件中读出数据,对界面进行初始化。

内存管理模块负责维护用户的状态,管理用户的命令缓冲区等内存缓冲区。

逻辑处理模块是协议相关模块,集成了主要的处理逻辑,如加解密网络数据,加密用户密码,打包命令数据,解析服务器命令回复,打包、解析位置信息数据等。

api接口负责与应用程序交互。

客户端程序负责与用户交互。

Client SDK线程:逻辑处理线程,TCP数据收发线程,UDP数据收发线程。

1.3 服务端与客户端交互设计

系统的交互,即客户端与服务器的交互,良好的交互设计可以为客户端(尤其是手机用户)节省流量,同时避免交互出错概率。

图3 客户端与服务器交互图

2 客户端的实现

2.1 命令解析

命令的解析工作CCommandParse类实现。它将命令分解为命令类型,命令的参数对。解析过程如图4。图中出现的“获取参数”操作是一个宏定义,由于获取参数的操作流程具有相似性,可以通过宏进行整合。

图4 命令解析过程图

#define SIVISION { 〗 if(n > m_max) 〗 break; 〗 if((_Src - pc) > 1){ 〗 if(*(pc+1) == '-' && mh){ 〗 m_param[n].prefix = new char[_Src - pc]; 〗 dst = m_param[n].prefix; 〗 }else{ 〗 m_param[n].value = new char[_Src - pc]; 〗 dst = m_param[n].value; 〗 n ++; 〗 } 〗 while(pc != _Src) 〗 *dst++ = *++pc; 〗 *--dst = ''; 〗 }else 〗 pc = _Src; 〗}

2.2 接口与应用程序的交互

从应用程序角度看,应用程序与库的交互步骤如下:

(1)调用库的MC_Init()接口,将库所需的回调函数地址传递给库,传入客户端类型(PC或Android)库内部初始化内存等资源。

(2)调用库的MC_Register()接口,注册新用户,非阻塞接口,结果将由OnCommand()回调来通知。

(3)调用库的MC_Login()接口登录服务器,非阻塞接口,结果将由OnCommand()回调来通知。

(4)调用库的MC_SendCmd()接口,发送获取好友列表等命令,非阻塞接口,结果将由OnCommand()回调来通知。

(5)调用库的MC_Invite()接口,订阅或取消订阅某好友的位置信息,非阻塞接口,结果将由OnCommand()回调来通知。获得到的位置数据将由OnData()回调来通知。被订阅方的GetLocale()回调会被调用,在该回调中填充位置信息给库。

(6)给好友发文字信息时调用MC_SendCmd()接口,收到好友文字信息时,库通过OnInfo()回调通知应用程序。

(7)调用库的MC_Logout()接口退出登录。

(8)调用库的MC_Cleanup()接口释放库占用的资源。

2.3 android客户端的主要界面

用户可以使用电子地图功能和导航功能[10],[11](P341-352),如图5所示。

图5 电子地图

当用户从好友列表跳转到订阅好友位置页面(可订阅多个好友),如图6所示。

图6 订阅好友位置信息

3 服务端核心功能处理流程

3.1 高效数据收发网络模块

(1)命令数据的处理流程

请求的处理流程都在TCP数据收发线程内完成,TCP数据收发线程的线程数是CPU内核数*2+2,当没有数据时,线程处于睡眠状态,当收到数据时,线程由IOCP调度。

例如:收到用户A的网络命令时,命令通道通过回调函数TcpOnReadDataCallBack()通知内存管理层将命令数据插入到A的命令缓冲区内,然后内存管理层循环检查A的命令缓冲区内是否有完整的待执行命令包,如果有,则出栈一个完整命令包Pack,将Pack投递给逻辑层执行,逻辑层执行完命令后,将需要回复给A的回复包Pack2(数据地址)传递给内存管理层,内存管理层将Pack2传递给命令通道,命令通道将Pack2发送给用户A。

图7 TCP线程完成一个请求过程

(2)数据通道高效转发数据

数据转发的逻辑类似于观察者模式,通过定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

图8 位置信息的转发流程图

根据图8可知一个位置信息的转发,无论接收者是多少人,数据都只需两次copy,大大减少内存copy时间。如:用户B、C、D订阅了用户A的位置数据,则A通过数据通道向服务器实时汇报自己当前的位置,服务器收到A的位置数据Data后,先将Data拷贝到A的位置数据缓冲区内,然后检查A的待发缓冲区是否空闲,如果空闲,则从A数据缓冲区内出栈一个位置信息包Pack,将Pack拷贝到A待发缓冲区内,并投递给B、C、D用户,若待发缓冲区不空闲,则直接返回,当A的待发缓冲区空闲时,数据通道收发线程会检查A的数据缓冲区是否有位置信息包。

3.2 订阅、取消订阅数据请求处理逻辑

订阅的目的是让某个用户不断地将自己的位置信息数据告诉订阅用户,实现的方式是在用户A-服务器-用户B间建立数据通道,用户B不断将自己的最新位置通过数据通道上报给服务器,服务器再将该位置数据转发给订阅者(如用户A)。如果用户A只是订阅他人位置数据,而没有人订阅用户A的位置数据,则用户A不用上报自己的位置数据,以节约流量。

4 结论

使用本APP用户可实时共享自己的地理位置信息,系统的主要技术特点包括:(1) 服务器端使用IOCP机制对多用户请求进行并发处理,满足请求回复低延迟的要求;(2) 服务器端数据转发时通过最小化数据内存拷贝次数以及对多个数据包聚合传输以最大化网络带宽的利用率等技术,保证数据转发的实时性;(3)按客户端的功能与交互分开的原则,将客户端的功能封装成可方便移植的客户端库,简化多平台客户端的开发。

图9 用户A订阅用户B位置信息流程

[1]张国平,王建玺,董桂.基于Android平台的手机地图服务设计[J].计算技术与自动化,2015,34(1):111-115.

[2]王存宇,朱琪,彭敏佳,等.基于Android手机地图的实现[J].计算机时代,2015(4):32-35.

[3]陆均良,沈华玉,朱照君.旅游信息化管理—理论与实务[M].杭州:浙江大学出版社,2014.

[4]黄羊山,刘文娜,李修福.智慧旅游—面向游客的应用[M].南京:东南大学出版社,2013.

[5]吴敬征,武延军,武志飞,等.基于有向信息流的Android隐私泄露类恶意应用检测方法[J].中国科学院大学学报,2015,32(6):807-815.

[6]张意中,游彬,闫伟.基于Android的移动GIS系统的应用与实现[J].物联网技术,2015(11):70-76.

[7]张补宏,闫艳芳.国内外旅游信息化研究综述[J].地理与地理信息科学,2012,28(5):95-98.

[8]罗伟.基于Android平台的即时通讯系统的研究与实现[D].长沙:湖南师范大学(硕士学位论文),2010.

[9]王世江.Google Android SDK开发范例大全(第2版)[M].北京:人民邮电出版社,2010.

[10]祝忠方.基于Android的移动互联终端的设计和实现[D].北京:北方工业大学(硕士学位论文),2014.

[11]孙更新,邵长恒.Android从入门到精通[M].北京:电子工业出版,2011.

Researchon Application and Real-time Location Share Based on Android

ZHANG Yigang

(HefeiUniversity,Hefei230601,China)

The application solution for real-time sharing of location information was put forward in this paper. By forwarding location information between the clients, many services such as geographical location information sharing can be provided by the server, text information exchange and electronic map navigation. On the server-side, IOCP (I/O Completion Port) mechanism was used to process the multi-user request, thus meeting the requirements of low response latency. By minimizing the number of memory copy operator and aggregating multiple packet data into one transmission, the server can optimize the utilization of network bandwidth and ensure real-time requirements of data forwarding. The client functions were packed into client library which can be easily transplanted. Therefore, the development of the multi-platform client applications can be greatly simplified.

electronic map; I/O Completion Port (IOCP); location sharing

2016-09-03

安徽高校省级自然科学研究重点项目(KJ2014A210);安徽高校自然科学研究重点项目(KJ2015A162)。

章义刚(1965-),男,安徽南陵人,硕士,副教授,研究方向:计算机网络与数据库。

TP393.01

A

1009-9735(2016)05-0049-05

猜你喜欢

缓冲区线程命令
只听主人的命令
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
移防命令下达后
基于网络聚类与自适应概率的数据库缓冲区替换*
浅谈linux多线程协作
这是人民的命令
关键链技术缓冲区的确定方法研究
初涉缓冲区
多目标缓冲区生成算法