姜慶彬, 涂志瑩
(哈爾濱工業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院, 哈爾濱 150001)
隨著科技的迅速發(fā)展和生活水平的不斷提高,人與人之間的交互更加密切和頻繁,在各種社交場合中經(jīng)常出現(xiàn)需要迅速的了解其他人的個人信息的情況,尤其是在現(xiàn)實場景中經(jīng)常會出現(xiàn)“機會式社交”,即某幾個人僅存在短暫交集的需要,在很短的時間中需要互相傳遞信息,過了這段時間之后,就不需要再了解彼此,甚至可能再也不見。例如:在一個國際會議的場景中,大家彼此不認(rèn)識,也沒有任何的社交聯(lián)系,會議結(jié)束后很可能不會再聯(lián)系了,但是在會議上需要知曉其他人的研究領(lǐng)域、研究內(nèi)容等重要信息;再例如:在醫(yī)院這個場景中,醫(yī)生與每一個病人只有很短的交集,病人需要快速的將過去的病例信息傳遞給醫(yī)生,幫助醫(yī)生迅速了解病人的情況并對癥診斷,診斷結(jié)束后病人和醫(yī)生很可能不會有任何交集。因此,研究新型的個人信息交互方式具有重要的應(yīng)用及市場價值。
移動端個人服務(wù)系統(tǒng)是將機會式社交中短時間傳遞信息的行為作為個人服務(wù),主動分享信息的一方作為服務(wù)發(fā)布者,接收分享信息的一方作為服務(wù)使用者,使用JADE框架運行個人服務(wù)以及在服務(wù)發(fā)布者和服務(wù)使用者之間實現(xiàn)服務(wù)內(nèi)容傳遞[1]。系統(tǒng)分為兩個部分:Android客戶端和服務(wù)器后端,服務(wù)使用者和服務(wù)發(fā)布者要在Android客戶端進行服務(wù)下載、編輯服務(wù)內(nèi)容、服務(wù)注冊、服務(wù)查詢、獲取服務(wù)內(nèi)容、查看分享者等操作,相關(guān)的數(shù)據(jù)層支持由服務(wù)器后端來完成。
移動端個人服務(wù)發(fā)布者與使用者之間的消息傳遞使用JADE框架來實現(xiàn)。JADE是基于對等通信體系結(jié)構(gòu)的分布式多agent應(yīng)用程序開發(fā)的中間件框架[2]。 JADE框架是基于agent實現(xiàn)的,允許每個agent程序動態(tài)發(fā)現(xiàn)其他agent程序,并通過混合型p2p的方式與之通信。由于agent具有獨立性,即每個agent程序獨立運行,所以可以在個人服務(wù)用戶登錄Android客戶端的同時根據(jù)該用戶的信息運行一個唯一的agent程序,向其他個人服務(wù)用戶發(fā)送服務(wù)請求或服務(wù)內(nèi)容[3];考慮到個人服務(wù)用戶并不像企業(yè)級服務(wù)那樣穩(wěn)定,個人服務(wù)的發(fā)布者和使用者在發(fā)布服務(wù)和使用服務(wù)時可能受到時間、地點等影響,無法按時進行服務(wù)內(nèi)容的傳遞[4],而JADE框架下agent之間的異步消息通訊方法可以很好地解決這個問題,每個agent接收到其他agent傳來的信息時不會立刻響應(yīng),而是根據(jù)自身的邏輯判斷動態(tài)地響應(yīng)。在Android客戶端中,使用JADE框架可以為每一個移動端服務(wù)用戶建立一個agent節(jié)點,服務(wù)發(fā)布者和服務(wù)使用者登錄時會加入p2p網(wǎng)絡(luò),系統(tǒng)在服務(wù)器端也建立一個manager-agent節(jié)點作為各個agent的管理中心和混合型p2p網(wǎng)絡(luò)的中心節(jié)點,專門用于記錄移動端用戶的服務(wù)節(jié)點信息和服務(wù)發(fā)布情況,相關(guān)結(jié)構(gòu)圖和操作步驟如圖1所示。
圖1 系統(tǒng)agent結(jié)構(gòu)與用戶操作步驟圖
使用JADE框架實現(xiàn)agent之間傳遞消息時需要設(shè)計自定義Behaviour類,發(fā)送消息時構(gòu)建DataSend類型的ACLMessage,滿足JADE的發(fā)送條件時調(diào)用agent.send方法將消息發(fā)送給指定接受者agent,如果不指定接受者將會發(fā)送到manager-agent,由其進一步廣播給所有agent;指定接受者agent在Behaviour類中使用agent.receive方法接收Serializable類型的ACLMessage,根據(jù)個人服務(wù)消息格式對ACLMessage進行解析。
JADE中agent之間的通信使用ACLMessage類作為載體,通信時記錄了發(fā)送者agent信息、接受者agent信息和通信內(nèi)容,本系統(tǒng)中需要對通信內(nèi)容的數(shù)據(jù)結(jié)構(gòu)進行設(shè)計。個人服務(wù)消息傳輸?shù)膬?nèi)容可以是服務(wù)請求消息、服務(wù)反饋消息、服務(wù)注冊消息以及服務(wù)解除消息,其中服務(wù)請求消息和服務(wù)反饋消息均需要記錄服務(wù)發(fā)布者信息和服務(wù)使用者信息,服務(wù)請求信息還需要記錄服務(wù)請求參數(shù),服務(wù)反饋消息還需要記錄服務(wù)結(jié)果,服務(wù)注冊消息和服務(wù)解除消息是發(fā)送給manager-agent的,所以均只需要記錄服務(wù)發(fā)布者信息。除此之外,這四類消息還要記錄服務(wù)標(biāo)識信息,包括服務(wù)名、服務(wù)id、服務(wù)簡介等。發(fā)送者agent使用MessageContent類表示服務(wù)信息,通信時將服務(wù)信息注入MessageContent類,使用GSON框架的toJson方法將其轉(zhuǎn)換成JSON對象,賦值給ACLMessage的通信內(nèi)容參數(shù)。接受者agent接收到ACLMessage后,讀取其中通信內(nèi)容參數(shù),將其使用fromJson方法反序列化成MessageContent對象,讀取其中信息,判斷其屬于哪一種個人服務(wù)消息,然后進行不同的操作。
系統(tǒng)整體技術(shù)架構(gòu)如圖2所示,其中左側(cè)是服務(wù)器后端框架,后端使用SpringMVC框架作為應(yīng)用層框架,Controller通過DispactcherServlet與Android客戶端前端界面進行交互,同時又通過數(shù)據(jù)操作處理組件與底層的mysql持久化數(shù)據(jù)庫以及redis緩存數(shù)據(jù)庫進行文件和數(shù)據(jù)庫的交互[5]。Android客戶端實現(xiàn)移動端個人服務(wù)平臺的基礎(chǔ)界面和服務(wù)界面,服務(wù)加載組件使用文件操作工具FileUtils和Dalvik類加載機制加載服務(wù)鏡像,并與個人服務(wù)邏輯組件密切交互。JADE框架同時存在與這兩個子系統(tǒng),用來服務(wù)間的消息傳輸; manager-agent包含已發(fā)布服務(wù)的管理組件,與redis中的服務(wù)緩存交互數(shù)據(jù),個人服務(wù)平臺的user-agent作為移動端用戶的agent啟動,包含用戶緩存加載組件,對移動端用戶信息和服務(wù)緩存操作;Agent之間通過JADE框架提供的Behavior類和ACLMessage類傳輸服務(wù)信息。
系統(tǒng)Android客戶端使用Android SDK 27作為開發(fā)版本,兼容了Android6.0以上的系統(tǒng),使用AndroidStudio作為開發(fā)工具。移動端個人服務(wù)系統(tǒng)客戶端需要實現(xiàn)的功能模塊劃分如下:
(1)賬號管理模塊:系統(tǒng)用戶需要使用賬號管理模塊提供的功能登錄和注冊,并且允許用戶修改自己的個人信息,在服務(wù)的發(fā)布與使用過程中使用;
(2)服務(wù)發(fā)布模塊:服務(wù)發(fā)布者通過此模塊發(fā)布服務(wù),將服務(wù)發(fā)布信息發(fā)送給manager-agent供給服務(wù)使用者查詢;
(3)服務(wù)運行模塊:服務(wù)發(fā)布者發(fā)布個人服務(wù)后,個人服務(wù)需要運行在發(fā)布者agent中,等待服務(wù)使用者獲取服務(wù)結(jié)果;
(4)服務(wù)查詢模塊:服務(wù)使用者使用此模塊在manager-agent查詢已發(fā)布的服務(wù);
(5)服務(wù)使用模塊:獲取到服務(wù)發(fā)布者信息后,服務(wù)使用者使用此模塊使用p2p方式從服務(wù)發(fā)布者處直接獲取服務(wù)結(jié)果。
圖2 系統(tǒng)整體技術(shù)架構(gòu)圖
對移動端agent服務(wù)交互的類模型設(shè)計如下,UserAgent類會在用戶登錄成功時啟動,在JADE框架生成的container中,自動調(diào)用setup方法初始化agent。UserAgent依賴于4個類ParticipantsManager、ServiceListener、ServiceSpeaker和MessageContent,其中前3個類都間接繼承自Behavior類,為agent之間消息傳輸提供支持,ParticipantsManager類用于實時更新移動端服務(wù)使用者列表,ServiceListener類用于實時監(jiān)聽移動端服務(wù)使用者發(fā)來的服務(wù)請求,ServiceSpeaker類用于移動端服務(wù)發(fā)布者向服務(wù)使用者返回服務(wù)結(jié)果;MessageContent是一個服務(wù)消息的實體類,標(biāo)注了服務(wù)消息的類型、發(fā)布者和使用者的信息、服務(wù)內(nèi)容、服務(wù)參數(shù)、服務(wù)結(jié)果等信息,agent之間會傳輸MessageContent的json格式。詳細(xì)類圖如圖3所示。
圖3 移動端agent服務(wù)交互類模型設(shè)計
服務(wù)器后端起到兩個作用:一個是manager-agent作為管理中心,agent需要運行在服務(wù)器端,保證其可以穩(wěn)定運行并作為混合型p2p的中心節(jié)點,使得只要服務(wù)器正在運行,移動端服務(wù)用戶就可以接入p2p網(wǎng)絡(luò)進行服務(wù)的發(fā)布和使用;另一個作用是移動端服務(wù)用戶的用戶信息、服務(wù)發(fā)布與使用情況需要記錄,所以需要后端提供數(shù)據(jù)層持久化支持,本系統(tǒng)使用Springmvc+mysql作為web service技術(shù)框架。SpringMVC是常用的服務(wù)器端框架,具有穩(wěn)定性和易維護性。
服務(wù)器后端的功能模塊:
(1)服務(wù)注冊模塊:manager-agent接收到服務(wù)發(fā)布者的服務(wù)發(fā)布消息后,使用服務(wù)注冊模塊記錄服務(wù)發(fā)布信息;
(2)服務(wù)查詢模塊:manager-agent向服務(wù)使用者返回已發(fā)布服務(wù)信息;
(3)服務(wù)數(shù)據(jù)統(tǒng)計模塊:服務(wù)器后端對移動端服務(wù)發(fā)布者和服務(wù)使用者的服務(wù)發(fā)布和使用情況進行統(tǒng)計;
(4)服務(wù)權(quán)限控制模塊:允許服務(wù)發(fā)布者指定只有某些用戶才能使用其發(fā)布的服務(wù)。
個人服務(wù)必須至少擁有一個發(fā)布者和一個使用者,并且在實際的應(yīng)用場景中,還會經(jīng)常出現(xiàn)一個發(fā)布者發(fā)布的服務(wù)供多個使用者使用,甚至在一個服務(wù)場景中,每一個用戶既是服務(wù)發(fā)布者也是服務(wù)使用者,在使用其他用戶提供的服務(wù)時也在向其他用戶提供服務(wù)[6]。前者可以簡稱為一對多場景服務(wù),后者可以簡稱為多對多場景服務(wù)。系統(tǒng)實現(xiàn)了分享通訊錄服務(wù)和快捷討論組服務(wù)。分享通訊錄是一個一對多場景服務(wù),移動端獲取Android讀寫通訊錄的權(quán)限,服務(wù)發(fā)布者預(yù)先設(shè)置分享的通訊錄內(nèi)容,不指定服務(wù)使用者,以便所有滿足權(quán)限的用戶均可以使用服務(wù),獲取到其分享的通訊錄內(nèi)容,選擇性的添加到自己的手機上??旖萦懻摻M服務(wù)是一個多對多場景服務(wù),每個人都可以看到其他人的發(fā)言,并且自己可以發(fā)言給別人看。為了避免混亂,多對多場景服務(wù)的實現(xiàn)讓一個服務(wù)發(fā)布者作為總發(fā)布者,其他服務(wù)參與者都作為服務(wù)使用者,只有當(dāng)其發(fā)言時才作為服務(wù)發(fā)布者,調(diào)用服務(wù)發(fā)布模塊操作。
通過對JADE框架技術(shù)在移動端服務(wù)消息傳遞的研究,使用軟件設(shè)計方法,設(shè)計并實現(xiàn)了移動端個人服務(wù)系統(tǒng),該系統(tǒng)運行在Android設(shè)備上,允許用戶在其中發(fā)布和使用個人服務(wù)。整體系統(tǒng)操作簡單,功能清晰,為用戶提供了一種新型的個人服務(wù)使用方式,并且易于維護和擴展。