基于Android平台的EAST即时通信系统
2020-09-02赵金幸肖炳甲袁旗平
赵金幸 肖炳甲 袁旗平
1(中科院等离子体物理研究所 安徽 合肥 230031)2(中国科学技术大学 安徽 合肥 230026)
0 引 言
中国科学院等离子体物理研究所设计实现的EAST(Experimental Advanced Superconductive Tokamak)是世界上第一个建成并真正运行的全超导非圆截面核聚变实验装置[1]。目前国际上先进的托卡马克装置有位于中国的EAST及HL-2A,位于欧洲的JET,位于美国的DⅢ-D,位于日本的JT-60SA和位于韩国的KSTAR等。装置在每个放电实验周期都会产生大量的诊断数据和数值计算数据[2]。为方便实验人员随时随地掌握实验进程,更加便捷地参与到核聚变实验当中,考虑到移动通信技术发展成熟,本文设计并实现了基于Android平台的集即时通信与消息订阅功能为一体的移动客户端。
1 研究背景
自即时通信应用ICQ发布以来,即时通信技术发展迅猛,催生出国内外众多即时通信软件,并且功能日益丰富,应用日益广泛。国际上,从MSN、Skype到Facebook、Messenger等,提供了越来越丰富的通信服务功能。我国网络基础建设发展迅速,有着广大的网络应用市场,应用范围涉及个人即时通信服务、企业即时通信服务、游戏即时通信平台等。功能也从早期的文字聊天拓展为发送图像、文件、语音、视频等。在针对核聚变实验开发的即时通信应用中,西南物理研究院提出的基于HL-2A实验的即时通信系统BCOS,在投入使用后取得了不错的效果,因此启发了开发EAST平台即时通信系统的想法。
近年来随着智能手机操作系统和无线移动网络的高速发展,一些优秀的手机应用程序如腾讯QQ、微信等成为人们日常交流必备的工具。专注于提高办公效率的腾讯TIM、阿里钉钉等手机应用软件,也在企业办公人员的工作交流中发挥了便捷的作用。本文希望将移动通信技术应用到托卡马克实验当中,为实验人员提供更加高效的交流方式。
然而,一方面我们对于软件服务商提供的移动端即时通信解决方案没有完全的控制权,无法保证数据安全性;另一方面作为科研人员的交流平台,不希望受过多冗余功能的干扰,而专注于定制特色功能,如订阅实验数据等,以更好地满足实验人员的需求。通过选型调研和需求分析,PC端选用了基于开源软件Openfire+Spark框架来搭建EAST即时通信系统[3],其优势在于开源免费,可拓展性强,可以根据需求定制特色功能。但是,PC端应用相比于手机应用不够便捷,用户需要利用台式计算机或者笔记本电脑,而手机更轻便灵活,并且PC端即时通信系统的实验数据订阅部分是独立的网页开发,本文希望将网页订阅功能整合到客户端设计中,因此移动端EAST即时通信系统的开发十分必要。
移动设备终端的主流操作系统有Android、iOS等,其中Android操作系统依靠其代码开源、编程友好、界面可视等特点,在移动设备系统框架配置市场中占有很大的份额。在抽样调查中科院等离子体物理研究所科研人员手机操作系统类型之后,推断出使用Android操作系统的科研人员占绝大多数比例,因此选择基于Android系统开发该应用程序。
2 系统设计
2.1 整体架构
基于Android平台的EAST即时通信系统的开发将沿用对PC端开源服务器Openfire的二次开发,Android客户端通过使用开源的XMPP类库Smack,在Android Studio中进行自主开发。整体框架如图1所示,系统主要由5个部分组成:通信服务器,数据处理模块,信息数据库,文件服务器,Android客户端。
图1 基于Android平台的EAST即时通信系统框架图
通信服务器即Openfire服务器二次开发实现的信息中心,用于实现即时通信、推送订阅数据等功能。数据处理模块使用Openfire外部组件开发技术设计,主要由监听线程、读线程、处理线程、发送线程等4个线程组成,用于获取需要推送的数据进行处理打包发送给通信服务器。信息数据库使用了关系型数据库管理系统MySQL,用户的个人信息、用户订阅信息、用于订阅的实验数据信息等都保存在数据库中,各个模块通过各自的数据库接口与信息数据库进行交互。文件服务器是图片、语音聊天的中转站,并且作为Android客户端与MySQL数据库进行交互的中间件。Android客户端是用户使用该系统功能的交互工具,用户可以与好友进行文字、图片、语音聊天;订阅实验数据、管理订阅数据、接收推送数据;设置个人信息,查看通信录,管理聊天记录等。
图1中提到的EPICS平台,即实验物理及工业控制系统(Experimental Physics and Industrial Control System),是后期计划接入的控制软件系统。基于分布式标准的EPICS系统由3层结构组成,主要包括输入输出控制器(IOC)、操作接口层(OPI)和局域网(LAN)[4]。源数据库MDSPlus作为磁聚变能源计划中使用最广泛的数据管理系统,用于数据采集和存储[5]。
用户可以通过登录网页版订阅系统,订阅实验信号,并对订阅信号进行管理,也可以直接在Android即时通信客户端实现订阅功能。Android客户端通过文件服务器模块将订阅信息存储在信息数据库MySQL中。每次聚变实验放电完成后,由Openfire组件开发的数据处理模块监听MDSPlus数据存储完毕的事件,读取源数据库MDSPlus中的最新实验数据进行处理,根据信息数据库MySQL中的用户订阅表,将处理后的数据和用户唯一标识打包发送给通信服务器,由通信服务器推送消息到用户的Android客户端。
2.2 框架介绍
基于Android平台的EAST即时通信系统建立在开源即时通信系统解决方案Openfire+Smack框架上。图2对实现通信协议部分的关系进行了描述。
图2 即时通信系统解决方案Smack和Openfire的关系
XMPP(Extensible Messaging and Presence Protocol)指的是可拓展和表示协议,是解决即时通信的一种标准,可用于实时应用程序中的可扩展标记语言(XML)数据元流式传输。XMPP以Jabber协议为基础,而Jabber是即时通信中常用的开放式协议[6]。
Openfire作为服务器,负责管理客户端的通信连接,以及提供客户端一些通信信息和连接信息。它是基于XMPP、采用Java编程语言开发的实时协作服务器,具有免费、开源等特点,并且提供了外部插件开发的方式,以实现定制系统功能。
Smack是一个开源的,易于使用的XMPP客户端类库。在Android客户端的开发中使用XMPP协议实现通信,Smack是客户端与服务器之间传递数据的媒介,其优势是开发人员不需要熟悉XMPP底层实现甚至是XML格式,直接利用其提供的一套简单实用的应用程序编程接口(Application Programming Interface,API),就可以实现强大的功能,其被应用在Android的版本为Asmack。
文件服务器模块使用Java Servlet技术开发,作为处理HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Tomcat作为服务器,调用Servlet响应客户端请求,并将结果返回给客户端。
Volley框架是一款基于Android平台的网络框架,它可以自动调度网络请求,支持多个并发的网络连接,并且通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致,支持请求优先级,支持取消请求,能使网络通信更快、更简单、更健全[7]。
2.3 Android客户端设计
基于Android平台的EAST即时通信客户端的功能大致分为3个模块:用户管理模块,即时通信模块以及消息订阅模块。用户管理模块包含登录、查看联系人、维护个人信息资料和手机设置等子模块;即时通信模块包含文字聊天、图片发送、语音发送、群组聊天和接收推送五个子模块;消息订阅模块包括订阅消息和对已订阅消息进行管理2个子模块。模块划分图如图3所示。
图3 Android客户端模块划分图
2.4 文件服务器设计
文件服务器模块使用Servlet技术。Servlet运行于Web容器Tomcat中,被Tomcat动态加载,接收请求,调用其他组件处理请求,然后把处理结果返回。
Android客户端使用Volley框架与文件服务器模块进行交互,需要实现图片和语音的上传与下载,读取MySQL数据库并返回订阅信息表内容、读写数据库中个人信息表、已订阅信息表等功能。
3 系统实现
3.1 通信服务器实现
初次运行Openfire时,需要进入其控制台配置页面进行初始化配置:连接到MySQL数据库用以支持服务器的各项服务;为实现客户端查找服务器上相关用户的功能,在服务器上安装search插件;安装subscription插件实现自动同意好友申请等。
由于系统不需要注册功能,用户使用中科院合肥物质研究院等离子体物理研究所统一的EAST账号进行登录,服务器进行LDAP(轻量目录访问协议)登录验证[8],成功后建立XMPP连接。Openfire已经实现了LDAP验证方式,只需要在控制台配置目录服务器IP地址以及登录到指定目录服务器的账号名和密码即可。
3.2 Android客户端实现
手机客户端的实现是采用Android Studio3.2版本作为开发工具进行开发的,使用Android移动端进行界面的显示。Android开发中,主要负责创建与用户进行交互的显示窗口组件是Activity,其界面中的一部分或一种行为称为Fragment,简称碎片[9]。客户端的各种可视化功能表现在多个Activity和Fragment的显示窗口中,可以通过点击相应的控件进行功能跳转。
聊天记录保存在Android系统集成的嵌入式关系型数据库SQLite中,并且在设置界面提供了清理消息记录的功能,以减轻手机内存负担。
用户登录验证成功后,进入到主页面,接收好友消息和订阅消息。从主页面可以跳转至联系人页面、功能页面、用户页面。主页面实现效果图如图4所示。
图4 主页面实现效果图
3.2.1 文字聊天
在消息Fragment页面,用Android开发中的ListView列表控件来存放聊天的信息,在登录后增加聊天监听。利用Asmack的API:sendMessage来发送信息。发送信息的格式设置约定为“发送者卍是否群聊卍消息类型卍消息内容卍发送时间卍群名卍语音时长”(“卍”为分隔标志),发送消息后更新对话框以及存放对话的ListView列表控件,在消息显示的Fragment中进行显示。接收信息时则根据约定的消息格式,对消息进行拆分,然后根据信息的属性,更新对应ListView列表及Fragment。
3.2.2 图片聊天
客户端A首先点击按钮,调用相机或相册,得到Bitmap图片类型后,将Bitmap类型通过Base64编码方式转为String字符串类型。然后通过使用Volley框架,用Post方法将参数传到服务器。服务器获取参数后,用Base64解码写入文件,即完成将图片上传到服务器。然后用Response方法返回图片在服务器上的URL。客户端A获得URL后,将message用类似发送文字一样的方式发送,只不过消息内容是URL,发送到客户端B,该过程详情如图5所示。客户端B获得URL后开子线程,在子线程中用ImageLoader框架将URL加载成Bitmap类型,并赋给ImageView图片控件,完成图像的接收。
图5 图片发送过程
3.2.3 语音聊天
语音发送和图像发送的流程比较类似,首先调用麦克风进行音频录制,录制完成后用Base64编码方式转为String类型,用Volley框架的Post方法发送到服务器,服务器再解码转为3GP视频格式类型存在服务器本地,将URL返回。客户端接收到URL后用类似发送文字的方式,消息内容为该URL,发给接收方,接收方收到后,设置message中的语音URL,点击调用MediaPlayer工具,传入对应URL即可完成语音的播放。文字、图片和语音三种聊天方式的实现效果如图6所示。
图6 三种聊天方式的实现和推送信号的接收
3.2.4 接收推送信息
数据处理模块将用户订阅的实验信号处理成二维图片,通信服务器将消息推送给目标用户。服务器用户名设置为east@chat,推送的消息类型是图片,在服务器端已经转换为String类型,客户端接收到推送信息后,将其解析为图片格式,赋给ImageView图片控件,完成推送信号的接收。
3.2.5 群 聊
利用Asmack中的MultiUserChat类,可以实现用户建立聊天室,并对聊天室进行相关配置,设置群名和密码,设置最大用户数量,设置为永久房间,设置允许邀请用户,设置需要密码验证进入房间等。想要加入特定群聊的用户,可以使用联系人页面的搜索功能,搜索群名,输入加群密码,进入群聊与多人进行对话。
3.2.6 消息订阅的实现
客户端作为消息订阅系统,用户可以由主页面点击“功能”选项,进入功能Fragment,点击“消息订阅”选项,进入消息订阅页面。
系统实现了订阅信号的多级列表显示,客户端使用Volley框架请求文件服务器端,对MySQL数据库中相关表进行读操作,显示各个分支下的订阅信号。即用Post方法将请求参数传到文件服务器,文件服务器查询MySQL数据库后使用Response方法返回信号列表,客户端解析后使用嵌套列表控件ListView进行显示。
用户通过点击左侧图标展开/收起信号列表,点击右侧图标进行单选或者全选操作;使用Volley框架请求文件服务器对MySQL数据库进行写操作,提交订阅,便可以在“已订阅”页面查看订阅消息详情。消息订阅实现效果如图7所示。
图7 订阅功能的实现
3.3 文件服务器
文件服务器模块在IntelliJ IDEA 2018.3.3中使用Java语言开发,其功能实现过程大致如下:
(1) Android客户端发送请求至文件服务器;
(2) 文件服务器根据web.xml文件中的Servlet相关配置信息,将客户端请求转发到相应的Servlet;
(3) Servlet引擎调用service()方法,根据request对象中封装的用户请求与信息数据库MySQL进行交互,返回数据之后,Servlet会将返回的数据封装到response对象中;
(4) 根据客户端的请求Servlet生成响应内容并将其传给文件服务器;
(5) 服务器将响应内容返回给Android客户端。
Android客户端的请求有:将新用户保存到数据库相应表中、上传/下载图片和语音、设置/读取个人资料、设置/读取数据库中的订阅信息、保存/查询已订阅信息、清空已订阅信息等功能。文件服务器Servlet通过解析HTTP请求,取得客户端的提供的参数,根据不同的请求做出动态的响应。
3.4 其他功能实现
在“用户”界面中设计了清空聊天记录功能,用户聊天和接收推送的信息保存在SQLite数据库中,用户可以点击清理聊天记录的按钮来清理缓存。
通过调用系统通知,设置消息提醒方式,实现开启或者关闭声音及振动提醒的功能。
值得注意的是,在Android 6.0版本以前,本文App开发中对权限的处理是直接在AndroidManifest.xml文件中配置。这种情况在Android 6.0之后就改变了,对于一些涉及用户隐私的危险权限,不但需要在AndroidManifest.xml文件中进行配置,还需要在使用到该权限的地方用API来对权限进行动态申请[10],如调用系统相机、读写存储空间以及调用系统录音等功能都需要进行动态申请。
4 结 语
本文主要介绍了基于Openfire+Smack开源框架的EAST即时通信系统Android客户端的设计与实现。系统作为简洁实用的即时通信手段,使实验人员能够交流过程更加便利;作为消息订阅系统,不同部门的实验人员通过使用客户端订阅各自感兴趣的实验数据,实验完成后即时推送到Android设备,使实验人员能够随时随地参与到实验进程中,更好地掌握实验动态。系统功能基本满足设计要求,但也存在许多需要改进的地方,下一步将增加订阅信息种类,并根据实际情况考虑接入到EPICS系统等。