趙金幸 肖炳甲 袁旗平
1(中科院等離子體物理研究所 安徽 合肥 230031)2(中國科學技術大學 安徽 合肥 230026)
中國科學院等離子體物理研究所設計實現的EAST(Experimental Advanced Superconductive Tokamak)是世界上第一個建成并真正運行的全超導非圓截面核聚變實驗裝置[1]。目前國際上先進的托卡馬克裝置有位于中國的EAST及HL-2A,位于歐洲的JET,位于美國的DⅢ-D,位于日本的JT-60SA和位于韓國的KSTAR等。裝置在每個放電實驗周期都會產生大量的診斷數據和數值計算數據[2]。為方便實驗人員隨時隨地掌握實驗進程,更加便捷地參與到核聚變實驗當中,考慮到移動通信技術發(fā)展成熟,本文設計并實現了基于Android平臺的集即時通信與消息訂閱功能為一體的移動客戶端。
自即時通信應用ICQ發(fā)布以來,即時通信技術發(fā)展迅猛,催生出國內外眾多即時通信軟件,并且功能日益豐富,應用日益廣泛。國際上,從MSN、Skype到Facebook、Messenger等,提供了越來越豐富的通信服務功能。我國網絡基礎建設發(fā)展迅速,有著廣大的網絡應用市場,應用范圍涉及個人即時通信服務、企業(yè)即時通信服務、游戲即時通信平臺等。功能也從早期的文字聊天拓展為發(fā)送圖像、文件、語音、視頻等。在針對核聚變實驗開發(fā)的即時通信應用中,西南物理研究院提出的基于HL-2A實驗的即時通信系統(tǒng)BCOS,在投入使用后取得了不錯的效果,因此啟發(fā)了開發(fā)EAST平臺即時通信系統(tǒng)的想法。
近年來隨著智能手機操作系統(tǒng)和無線移動網絡的高速發(fā)展,一些優(yōu)秀的手機應用程序如騰訊QQ、微信等成為人們日常交流必備的工具。專注于提高辦公效率的騰訊TIM、阿里釘釘等手機應用軟件,也在企業(yè)辦公人員的工作交流中發(fā)揮了便捷的作用。本文希望將移動通信技術應用到托卡馬克實驗當中,為實驗人員提供更加高效的交流方式。
然而,一方面我們對于軟件服務商提供的移動端即時通信解決方案沒有完全的控制權,無法保證數據安全性;另一方面作為科研人員的交流平臺,不希望受過多冗余功能的干擾,而專注于定制特色功能,如訂閱實驗數據等,以更好地滿足實驗人員的需求。通過選型調研和需求分析,PC端選用了基于開源軟件Openfire+Spark框架來搭建EAST即時通信系統(tǒng)[3],其優(yōu)勢在于開源免費,可拓展性強,可以根據需求定制特色功能。但是,PC端應用相比于手機應用不夠便捷,用戶需要利用臺式計算機或者筆記本電腦,而手機更輕便靈活,并且PC端即時通信系統(tǒng)的實驗數據訂閱部分是獨立的網頁開發(fā),本文希望將網頁訂閱功能整合到客戶端設計中,因此移動端EAST即時通信系統(tǒng)的開發(fā)十分必要。
移動設備終端的主流操作系統(tǒng)有Android、iOS等,其中Android操作系統(tǒng)依靠其代碼開源、編程友好、界面可視等特點,在移動設備系統(tǒng)框架配置市場中占有很大的份額。在抽樣調查中科院等離子體物理研究所科研人員手機操作系統(tǒng)類型之后,推斷出使用Android操作系統(tǒng)的科研人員占絕大多數比例,因此選擇基于Android系統(tǒng)開發(fā)該應用程序。
基于Android平臺的EAST即時通信系統(tǒng)的開發(fā)將沿用對PC端開源服務器Openfire的二次開發(fā),Android客戶端通過使用開源的XMPP類庫Smack,在Android Studio中進行自主開發(fā)。整體框架如圖1所示,系統(tǒng)主要由5個部分組成:通信服務器,數據處理模塊,信息數據庫,文件服務器,Android客戶端。
圖1 基于Android平臺的EAST即時通信系統(tǒng)框架圖
通信服務器即Openfire服務器二次開發(fā)實現的信息中心,用于實現即時通信、推送訂閱數據等功能。數據處理模塊使用Openfire外部組件開發(fā)技術設計,主要由監(jiān)聽線程、讀線程、處理線程、發(fā)送線程等4個線程組成,用于獲取需要推送的數據進行處理打包發(fā)送給通信服務器。信息數據庫使用了關系型數據庫管理系統(tǒng)MySQL,用戶的個人信息、用戶訂閱信息、用于訂閱的實驗數據信息等都保存在數據庫中,各個模塊通過各自的數據庫接口與信息數據庫進行交互。文件服務器是圖片、語音聊天的中轉站,并且作為Android客戶端與MySQL數據庫進行交互的中間件。Android客戶端是用戶使用該系統(tǒng)功能的交互工具,用戶可以與好友進行文字、圖片、語音聊天;訂閱實驗數據、管理訂閱數據、接收推送數據;設置個人信息,查看通信錄,管理聊天記錄等。
圖1中提到的EPICS平臺,即實驗物理及工業(yè)控制系統(tǒng)(Experimental Physics and Industrial Control System),是后期計劃接入的控制軟件系統(tǒng)?;诜植际綐藴实腅PICS系統(tǒng)由3層結構組成,主要包括輸入輸出控制器(IOC)、操作接口層(OPI)和局域網(LAN)[4]。源數據庫MDSPlus作為磁聚變能源計劃中使用最廣泛的數據管理系統(tǒng),用于數據采集和存儲[5]。
用戶可以通過登錄網頁版訂閱系統(tǒng),訂閱實驗信號,并對訂閱信號進行管理,也可以直接在Android即時通信客戶端實現訂閱功能。Android客戶端通過文件服務器模塊將訂閱信息存儲在信息數據庫MySQL中。每次聚變實驗放電完成后,由Openfire組件開發(fā)的數據處理模塊監(jiān)聽MDSPlus數據存儲完畢的事件,讀取源數據庫MDSPlus中的最新實驗數據進行處理,根據信息數據庫MySQL中的用戶訂閱表,將處理后的數據和用戶唯一標識打包發(fā)送給通信服務器,由通信服務器推送消息到用戶的Android客戶端。
基于Android平臺的EAST即時通信系統(tǒng)建立在開源即時通信系統(tǒng)解決方案Openfire+Smack框架上。圖2對實現通信協議部分的關系進行了描述。
圖2 即時通信系統(tǒng)解決方案Smack和Openfire的關系
XMPP(Extensible Messaging and Presence Protocol)指的是可拓展和表示協議,是解決即時通信的一種標準,可用于實時應用程序中的可擴展標記語言(XML)數據元流式傳輸。XMPP以Jabber協議為基礎,而Jabber是即時通信中常用的開放式協議[6]。
Openfire作為服務器,負責管理客戶端的通信連接,以及提供客戶端一些通信信息和連接信息。它是基于XMPP、采用Java編程語言開發(fā)的實時協作服務器,具有免費、開源等特點,并且提供了外部插件開發(fā)的方式,以實現定制系統(tǒng)功能。
Smack是一個開源的,易于使用的XMPP客戶端類庫。在Android客戶端的開發(fā)中使用XMPP協議實現通信,Smack是客戶端與服務器之間傳遞數據的媒介,其優(yōu)勢是開發(fā)人員不需要熟悉XMPP底層實現甚至是XML格式,直接利用其提供的一套簡單實用的應用程序編程接口(Application Programming Interface,API),就可以實現強大的功能,其被應用在Android的版本為Asmack。
文件服務器模塊使用Java Servlet技術開發(fā),作為處理HTTP客戶端的請求和HTTP服務器上的數據庫或應用程序之間的中間層。使用Tomcat作為服務器,調用Servlet響應客戶端請求,并將結果返回給客戶端。
Volley框架是一款基于Android平臺的網絡框架,它可以自動調度網絡請求,支持多個并發(fā)的網絡連接,并且通過使用標準的HTTP緩存機制保持磁盤和內存響應的一致,支持請求優(yōu)先級,支持取消請求,能使網絡通信更快、更簡單、更健全[7]。
基于Android平臺的EAST即時通信客戶端的功能大致分為3個模塊:用戶管理模塊,即時通信模塊以及消息訂閱模塊。用戶管理模塊包含登錄、查看聯系人、維護個人信息資料和手機設置等子模塊;即時通信模塊包含文字聊天、圖片發(fā)送、語音發(fā)送、群組聊天和接收推送五個子模塊;消息訂閱模塊包括訂閱消息和對已訂閱消息進行管理2個子模塊。模塊劃分圖如圖3所示。
圖3 Android客戶端模塊劃分圖
文件服務器模塊使用Servlet技術。Servlet運行于Web容器Tomcat中,被Tomcat動態(tài)加載,接收請求,調用其他組件處理請求,然后把處理結果返回。
Android客戶端使用Volley框架與文件服務器模塊進行交互,需要實現圖片和語音的上傳與下載,讀取MySQL數據庫并返回訂閱信息表內容、讀寫數據庫中個人信息表、已訂閱信息表等功能。
初次運行Openfire時,需要進入其控制臺配置頁面進行初始化配置:連接到MySQL數據庫用以支持服務器的各項服務;為實現客戶端查找服務器上相關用戶的功能,在服務器上安裝search插件;安裝subscription插件實現自動同意好友申請等。
由于系統(tǒng)不需要注冊功能,用戶使用中科院合肥物質研究院等離子體物理研究所統(tǒng)一的EAST賬號進行登錄,服務器進行LDAP(輕量目錄訪問協議)登錄驗證[8],成功后建立XMPP連接。Openfire已經實現了LDAP驗證方式,只需要在控制臺配置目錄服務器IP地址以及登錄到指定目錄服務器的賬號名和密碼即可。
手機客戶端的實現是采用Android Studio3.2版本作為開發(fā)工具進行開發(fā)的,使用Android移動端進行界面的顯示。Android開發(fā)中,主要負責創(chuàng)建與用戶進行交互的顯示窗口組件是Activity,其界面中的一部分或一種行為稱為Fragment,簡稱碎片[9]??蛻舳说母鞣N可視化功能表現在多個Activity和Fragment的顯示窗口中,可以通過點擊相應的控件進行功能跳轉。
聊天記錄保存在Android系統(tǒng)集成的嵌入式關系型數據庫SQLite中,并且在設置界面提供了清理消息記錄的功能,以減輕手機內存負擔。
用戶登錄驗證成功后,進入到主頁面,接收好友消息和訂閱消息。從主頁面可以跳轉至聯系人頁面、功能頁面、用戶頁面。主頁面實現效果圖如圖4所示。
圖4 主頁面實現效果圖
3.2.1 文字聊天
在消息Fragment頁面,用Android開發(fā)中的ListView列表控件來存放聊天的信息,在登錄后增加聊天監(jiān)聽。利用Asmack的API:sendMessage來發(fā)送信息。發(fā)送信息的格式設置約定為“發(fā)送者卍是否群聊卍消息類型卍消息內容卍發(fā)送時間卍群名卍語音時長”(“卍”為分隔標志),發(fā)送消息后更新對話框以及存放對話的ListView列表控件,在消息顯示的Fragment中進行顯示。接收信息時則根據約定的消息格式,對消息進行拆分,然后根據信息的屬性,更新對應ListView列表及Fragment。
3.2.2 圖片聊天
客戶端A首先點擊按鈕,調用相機或相冊,得到Bitmap圖片類型后,將Bitmap類型通過Base64編碼方式轉為String字符串類型。然后通過使用Volley框架,用Post方法將參數傳到服務器。服務器獲取參數后,用Base64解碼寫入文件,即完成將圖片上傳到服務器。然后用Response方法返回圖片在服務器上的URL??蛻舳薃獲得URL后,將message用類似發(fā)送文字一樣的方式發(fā)送,只不過消息內容是URL,發(fā)送到客戶端B,該過程詳情如圖5所示??蛻舳薆獲得URL后開子線程,在子線程中用ImageLoader框架將URL加載成Bitmap類型,并賦給ImageView圖片控件,完成圖像的接收。
圖5 圖片發(fā)送過程
3.2.3 語音聊天
語音發(fā)送和圖像發(fā)送的流程比較類似,首先調用麥克風進行音頻錄制,錄制完成后用Base64編碼方式轉為String類型,用Volley框架的Post方法發(fā)送到服務器,服務器再解碼轉為3GP視頻格式類型存在服務器本地,將URL返回??蛻舳私邮盏経RL后用類似發(fā)送文字的方式,消息內容為該URL,發(fā)給接收方,接收方收到后,設置message中的語音URL,點擊調用MediaPlayer工具,傳入對應URL即可完成語音的播放。文字、圖片和語音三種聊天方式的實現效果如圖6所示。
圖6 三種聊天方式的實現和推送信號的接收
3.2.4 接收推送信息
數據處理模塊將用戶訂閱的實驗信號處理成二維圖片,通信服務器將消息推送給目標用戶。服務器用戶名設置為east@chat,推送的消息類型是圖片,在服務器端已經轉換為String類型,客戶端接收到推送信息后,將其解析為圖片格式,賦給ImageView圖片控件,完成推送信號的接收。
3.2.5 群 聊
利用Asmack中的MultiUserChat類,可以實現用戶建立聊天室,并對聊天室進行相關配置,設置群名和密碼,設置最大用戶數量,設置為永久房間,設置允許邀請用戶,設置需要密碼驗證進入房間等。想要加入特定群聊的用戶,可以使用聯系人頁面的搜索功能,搜索群名,輸入加群密碼,進入群聊與多人進行對話。
3.2.6 消息訂閱的實現
客戶端作為消息訂閱系統(tǒng),用戶可以由主頁面點擊“功能”選項,進入功能Fragment,點擊“消息訂閱”選項,進入消息訂閱頁面。
系統(tǒng)實現了訂閱信號的多級列表顯示,客戶端使用Volley框架請求文件服務器端,對MySQL數據庫中相關表進行讀操作,顯示各個分支下的訂閱信號。即用Post方法將請求參數傳到文件服務器,文件服務器查詢MySQL數據庫后使用Response方法返回信號列表,客戶端解析后使用嵌套列表控件ListView進行顯示。
用戶通過點擊左側圖標展開/收起信號列表,點擊右側圖標進行單選或者全選操作;使用Volley框架請求文件服務器對MySQL數據庫進行寫操作,提交訂閱,便可以在“已訂閱”頁面查看訂閱消息詳情。消息訂閱實現效果如圖7所示。
圖7 訂閱功能的實現
文件服務器模塊在IntelliJ IDEA 2018.3.3中使用Java語言開發(fā),其功能實現過程大致如下:
(1) Android客戶端發(fā)送請求至文件服務器;
(2) 文件服務器根據web.xml文件中的Servlet相關配置信息,將客戶端請求轉發(fā)到相應的Servlet;
(3) Servlet引擎調用service()方法,根據request對象中封裝的用戶請求與信息數據庫MySQL進行交互,返回數據之后,Servlet會將返回的數據封裝到response對象中;
(4) 根據客戶端的請求Servlet生成響應內容并將其傳給文件服務器;
(5) 服務器將響應內容返回給Android客戶端。
Android客戶端的請求有:將新用戶保存到數據庫相應表中、上傳/下載圖片和語音、設置/讀取個人資料、設置/讀取數據庫中的訂閱信息、保存/查詢已訂閱信息、清空已訂閱信息等功能。文件服務器Servlet通過解析HTTP請求,取得客戶端的提供的參數,根據不同的請求做出動態(tài)的響應。
在“用戶”界面中設計了清空聊天記錄功能,用戶聊天和接收推送的信息保存在SQLite數據庫中,用戶可以點擊清理聊天記錄的按鈕來清理緩存。
通過調用系統(tǒng)通知,設置消息提醒方式,實現開啟或者關閉聲音及振動提醒的功能。
值得注意的是,在Android 6.0版本以前,本文App開發(fā)中對權限的處理是直接在AndroidManifest.xml文件中配置。這種情況在Android 6.0之后就改變了,對于一些涉及用戶隱私的危險權限,不但需要在AndroidManifest.xml文件中進行配置,還需要在使用到該權限的地方用API來對權限進行動態(tài)申請[10],如調用系統(tǒng)相機、讀寫存儲空間以及調用系統(tǒng)錄音等功能都需要進行動態(tài)申請。
本文主要介紹了基于Openfire+Smack開源框架的EAST即時通信系統(tǒng)Android客戶端的設計與實現。系統(tǒng)作為簡潔實用的即時通信手段,使實驗人員能夠交流過程更加便利;作為消息訂閱系統(tǒng),不同部門的實驗人員通過使用客戶端訂閱各自感興趣的實驗數據,實驗完成后即時推送到Android設備,使實驗人員能夠隨時隨地參與到實驗進程中,更好地掌握實驗動態(tài)。系統(tǒng)功能基本滿足設計要求,但也存在許多需要改進的地方,下一步將增加訂閱信息種類,并根據實際情況考慮接入到EPICS系統(tǒng)等。