姜慶彬, 涂志瑩
(哈爾濱工業大學 計算機科學與技術學院, 哈爾濱 150001)
隨著科技的迅速發展和生活水平的不斷提高,人與人之間的交互更加密切和頻繁,在各種社交場合中經常出現需要迅速的了解其他人的個人信息的情況,尤其是在現實場景中經常會出現“機會式社交”,即某幾個人僅存在短暫交集的需要,在很短的時間中需要互相傳遞信息,過了這段時間之后,就不需要再了解彼此,甚至可能再也不見。例如:在一個國際會議的場景中,大家彼此不認識,也沒有任何的社交聯系,會議結束后很可能不會再聯系了,但是在會議上需要知曉其他人的研究領域、研究內容等重要信息;再例如:在醫院這個場景中,醫生與每一個病人只有很短的交集,病人需要快速的將過去的病例信息傳遞給醫生,幫助醫生迅速了解病人的情況并對癥診斷,診斷結束后病人和醫生很可能不會有任何交集。因此,研究新型的個人信息交互方式具有重要的應用及市場價值。
移動端個人服務系統是將機會式社交中短時間傳遞信息的行為作為個人服務,主動分享信息的一方作為服務發布者,接收分享信息的一方作為服務使用者,使用JADE框架運行個人服務以及在服務發布者和服務使用者之間實現服務內容傳遞[1]。系統分為兩個部分:Android客戶端和服務器后端,服務使用者和服務發布者要在Android客戶端進行服務下載、編輯服務內容、服務注冊、服務查詢、獲取服務內容、查看分享者等操作,相關的數據層支持由服務器后端來完成。
移動端個人服務發布者與使用者之間的消息傳遞使用JADE框架來實現。JADE是基于對等通信體系結構的分布式多agent應用程序開發的中間件框架[2]。 JADE框架是基于agent實現的,允許每個agent程序動態發現其他agent程序,并通過混合型p2p的方式與之通信。由于agent具有獨立性,即每個agent程序獨立運行,所以可以在個人服務用戶登錄Android客戶端的同時根據該用戶的信息運行一個唯一的agent程序,向其他個人服務用戶發送服務請求或服務內容[3];考慮到個人服務用戶并不像企業級服務那樣穩定,個人服務的發布者和使用者在發布服務和使用服務時可能受到時間、地點等影響,無法按時進行服務內容的傳遞[4],而JADE框架下agent之間的異步消息通訊方法可以很好地解決這個問題,每個agent接收到其他agent傳來的信息時不會立刻響應,而是根據自身的邏輯判斷動態地響應。在Android客戶端中,使用JADE框架可以為每一個移動端服務用戶建立一個agent節點,服務發布者和服務使用者登錄時會加入p2p網絡,系統在服務器端也建立一個manager-agent節點作為各個agent的管理中心和混合型p2p網絡的中心節點,專門用于記錄移動端用戶的服務節點信息和服務發布情況,相關結構圖和操作步驟如圖1所示。

圖1 系統agent結構與用戶操作步驟圖
使用JADE框架實現agent之間傳遞消息時需要設計自定義Behaviour類,發送消息時構建DataSend類型的ACLMessage,滿足JADE的發送條件時調用agent.send方法將消息發送給指定接受者agent,如果不指定接受者將會發送到manager-agent,由其進一步廣播給所有agent;指定接受者agent在Behaviour類中使用agent.receive方法接收Serializable類型的ACLMessage,根據個人服務消息格式對ACLMessage進行解析。
JADE中agent之間的通信使用ACLMessage類作為載體,通信時記錄了發送者agent信息、接受者agent信息和通信內容,本系統中需要對通信內容的數據結構進行設計。個人服務消息傳輸的內容可以是服務請求消息、服務反饋消息、服務注冊消息以及服務解除消息,其中服務請求消息和服務反饋消息均需要記錄服務發布者信息和服務使用者信息,服務請求信息還需要記錄服務請求參數,服務反饋消息還需要記錄服務結果,服務注冊消息和服務解除消息是發送給manager-agent的,所以均只需要記錄服務發布者信息。除此之外,這四類消息還要記錄服務標識信息,包括服務名、服務id、服務簡介等。發送者agent使用MessageContent類表示服務信息,通信時將服務信息注入MessageContent類,使用GSON框架的toJson方法將其轉換成JSON對象,賦值給ACLMessage的通信內容參數。接受者agent接收到ACLMessage后,讀取其中通信內容參數,將其使用fromJson方法反序列化成MessageContent對象,讀取其中信息,判斷其屬于哪一種個人服務消息,然后進行不同的操作。
系統整體技術架構如圖2所示,其中左側是服務器后端框架,后端使用SpringMVC框架作為應用層框架,Controller通過DispactcherServlet與Android客戶端前端界面進行交互,同時又通過數據操作處理組件與底層的mysql持久化數據庫以及redis緩存數據庫進行文件和數據庫的交互[5]。Android客戶端實現移動端個人服務平臺的基礎界面和服務界面,服務加載組件使用文件操作工具FileUtils和Dalvik類加載機制加載服務鏡像,并與個人服務邏輯組件密切交互。JADE框架同時存在與這兩個子系統,用來服務間的消息傳輸; manager-agent包含已發布服務的管理組件,與redis中的服務緩存交互數據,個人服務平臺的user-agent作為移動端用戶的agent啟動,包含用戶緩存加載組件,對移動端用戶信息和服務緩存操作;Agent之間通過JADE框架提供的Behavior類和ACLMessage類傳輸服務信息。
系統Android客戶端使用Android SDK 27作為開發版本,兼容了Android6.0以上的系統,使用AndroidStudio作為開發工具。移動端個人服務系統客戶端需要實現的功能模塊劃分如下:
(1)賬號管理模塊:系統用戶需要使用賬號管理模塊提供的功能登錄和注冊,并且允許用戶修改自己的個人信息,在服務的發布與使用過程中使用;
(2)服務發布模塊:服務發布者通過此模塊發布服務,將服務發布信息發送給manager-agent供給服務使用者查詢;
(3)服務運行模塊:服務發布者發布個人服務后,個人服務需要運行在發布者agent中,等待服務使用者獲取服務結果;
(4)服務查詢模塊:服務使用者使用此模塊在manager-agent查詢已發布的服務;
(5)服務使用模塊:獲取到服務發布者信息后,服務使用者使用此模塊使用p2p方式從服務發布者處直接獲取服務結果。

圖2 系統整體技術架構圖
對移動端agent服務交互的類模型設計如下,UserAgent類會在用戶登錄成功時啟動,在JADE框架生成的container中,自動調用setup方法初始化agent。UserAgent依賴于4個類ParticipantsManager、ServiceListener、ServiceSpeaker和MessageContent,其中前3個類都間接繼承自Behavior類,為agent之間消息傳輸提供支持,ParticipantsManager類用于實時更新移動端服務使用者列表,ServiceListener類用于實時監聽移動端服務使用者發來的服務請求,ServiceSpeaker類用于移動端服務發布者向服務使用者返回服務結果;MessageContent是一個服務消息的實體類,標注了服務消息的類型、發布者和使用者的信息、服務內容、服務參數、服務結果等信息,agent之間會傳輸MessageContent的json格式。詳細類圖如圖3所示。

圖3 移動端agent服務交互類模型設計
服務器后端起到兩個作用:一個是manager-agent作為管理中心,agent需要運行在服務器端,保證其可以穩定運行并作為混合型p2p的中心節點,使得只要服務器正在運行,移動端服務用戶就可以接入p2p網絡進行服務的發布和使用;另一個作用是移動端服務用戶的用戶信息、服務發布與使用情況需要記錄,所以需要后端提供數據層持久化支持,本系統使用Springmvc+mysql作為web service技術框架。SpringMVC是常用的服務器端框架,具有穩定性和易維護性。
服務器后端的功能模塊:
(1)服務注冊模塊:manager-agent接收到服務發布者的服務發布消息后,使用服務注冊模塊記錄服務發布信息;
(2)服務查詢模塊:manager-agent向服務使用者返回已發布服務信息;
(3)服務數據統計模塊:服務器后端對移動端服務發布者和服務使用者的服務發布和使用情況進行統計;
(4)服務權限控制模塊:允許服務發布者指定只有某些用戶才能使用其發布的服務。
個人服務必須至少擁有一個發布者和一個使用者,并且在實際的應用場景中,還會經常出現一個發布者發布的服務供多個使用者使用,甚至在一個服務場景中,每一個用戶既是服務發布者也是服務使用者,在使用其他用戶提供的服務時也在向其他用戶提供服務[6]。前者可以簡稱為一對多場景服務,后者可以簡稱為多對多場景服務。系統實現了分享通訊錄服務和快捷討論組服務。分享通訊錄是一個一對多場景服務,移動端獲取Android讀寫通訊錄的權限,服務發布者預先設置分享的通訊錄內容,不指定服務使用者,以便所有滿足權限的用戶均可以使用服務,獲取到其分享的通訊錄內容,選擇性的添加到自己的手機上。快捷討論組服務是一個多對多場景服務,每個人都可以看到其他人的發言,并且自己可以發言給別人看。為了避免混亂,多對多場景服務的實現讓一個服務發布者作為總發布者,其他服務參與者都作為服務使用者,只有當其發言時才作為服務發布者,調用服務發布模塊操作。
通過對JADE框架技術在移動端服務消息傳遞的研究,使用軟件設計方法,設計并實現了移動端個人服務系統,該系統運行在Android設備上,允許用戶在其中發布和使用個人服務。整體系統操作簡單,功能清晰,為用戶提供了一種新型的個人服務使用方式,并且易于維護和擴展。