陳純純



摘 要:通過對比國內外同類軟件,服務端采用Netty+WebSocket技術,客戶端采用基于Android平臺的JSON解析技術,設計并實現了一款智能小區增值服務軟件系統,可以向小區用戶分組及時推送重要資訊,向小區周圍配套服務系統提供接口。文中主要介紹了該系統推送服務的設計原理。
關鍵詞:Netty;WebSocket;JSON;增值平臺
中圖分類號:TP393.0 文獻標識碼:A 文章編號:2095-1302(2016)12-00-03
0 引 言
隨著人們逐漸從PC解放,需求開始轉移到移動設備的應用上。目前福建地區的小區住戶、物業和周邊配套服務都還處于離散狀態,人們迫切希望有一款基于移動設備的智能社區服務平臺,可以通過該系統方便住戶隨時獲取小區的重要資訊,了解住宅的實時情況,監控和控制住宅內的電器設備。而小區周邊的其他配套服務系統可以通過該平臺提供的接口直接與平臺對接,向住戶提供服務。
1 系統設計原理圖
本系統建立在J2EE平臺上,運用 MySQL數據庫管理系統將 JSON解析與Netty、 WebSocket等技術相結合,構建更加智能的社區增值服務平臺。社區增值服務系統搭建在云平臺之上,充分利用現代化信息技術手段實現社區管理及服務的信息化、集約化,依托云平臺的理念和優勢,將已有的專業系統納入其中,為社區居民、物業管理、周邊服務機構提供便利豐富的終端服務。系統設計原理圖如圖1所示。
該平臺的亮點是信息的分類推送,開發之前對信息推送的兩種方式進行分析:
(1)第一種是客戶端使用Pull(拉)的方式,即定時到服務器上獲取,看是否有更新的信息。
(2)第二種是服務器使用Push(推送)的方式,把最新的信息Push到客戶端上。
雖然Pull和Push兩種方式都能實現獲取服務端更新信息的功能,但Push方式比Pull方式更優越[1,2]。
本文通過對比分析國內現有的移動設備推送解決方案,采用Netty+WebSocket持久連接的方式,實現了消息的實時性推送和分類推送。
2 推送與控制實現
平臺可實現系統用戶的需求,如查看家中的光照強度、室內溫度、空氣濕度、煙霧濃度等實時數據,并對家中的家居進行控制操作,對硬件與手機之間的鏈接通信進行了詳細合理的設計。Netty與WebSocket的結合完美解決了此通路問題,為實現平臺的實時推送和分類推送奠定了基礎。
2.1 推送的設計與實現
平臺的服務器分為Netty Server與WebSocket Server兩個部分。
(1)Netty Server集成了WebSocket Client,用來實現與各硬件之間的數據傳送,Netty Server在初始化時與WebSocket Server建立長鏈接;
(2)WebSocket Server實現了與集成在Netty服務器中的WebSocket Client之間的數據傳送以及與用戶手機端(或網頁)的交互。
推送和控制詳細設計原理圖如圖2所示。
平臺將傳感器的數據推送到用戶的流程描述:單片機采集各傳感器的實時數據,將這些數據通過TCP上傳到Netty服務器,當TCP與Netty服務器第一次建立連接時,觸發channelActive()方法建立通道,該通道在傳感器斷開之前一直存在,此后傳感器定時發送數據,并直接觸發channelRead0()方法接收,接收到的數據由集成在本服務器的WebSocket Client模塊處理,通過WebSocketClient.send()方法發送給WebSocket服務器,WebSocket服務器中的WebSocket Server通過onMessage()方法接收,接收到實時數據后,則由client.session.getBasicRemote().sendText(msg)將數據推送給手機或網頁終端。
Netty服務器采用多線程服務器,對于每一個連接請求,dispatcher都會為其創建并分配一個線程,該線程負責這個請求的處理,優點是執行粒度是完整的處理流程,處理邏輯清晰,易于開發。但也存在隨著處理請求的不斷增加,會導致并發執行的線程數量太多等問題。過多的線程數量會導致系統在線程調度和資源爭用上的開銷過大,從而引起系統性能急劇下降,導致系統處理能力下降。該平臺采用了改進措施,引入線程池,系統最多只能創建一定數量的線程,該平臺規定最多能創建的線程數量為100。當所有線程都飽和運行時,新到達的處理請求只能等待或者被拋棄。
在實現WebSocket的鏈接過程中, 客戶端和普通的瀏覽器都通過80或者443端口和服務器進行請求握手,服務器根據http header識別是否是一個WebSocket請求,如果是,則將請求升級為一個WebSocket連接,握手成功后就進入雙向長連接的數據傳輸階段。WebSocket的數據傳輸基于幀方式:0x00 表示數據開始, 0xff表示數據結束,數據以utf-8編碼。第一次請求客戶端發送的是http請求,請求頭中包含WebSocket相關的信息,服務器端對請求進行驗證,驗證成功后,將請求升級為一個WebSocket連接,之后的通信就進入雙向長連接的數據傳輸階段,通過send和onMessage方法通信。
2.2 分類推送
平臺采用WebSocket協議不僅實現了Netty服務器與WebSocket服務器的實時通信,在分類通信上也做了一定嘗試,如推送工作,推送給哪一類型的用戶,可以根據數據的格式來進行劃分,在本平臺中只做了初步劃分,如數據格式為:{ "from":"SMSG","room":"1201","temperature":"1","humidity":"2.0","smoke?":"3"}(JSON形式),從“room”字段可以知道該數據是準備傳送給1201室的用戶,目前平臺只做了這個分類,平臺的下一步工作將在數據的格式上進行進一步細化和分類,如按不同的樓棟,甚至不同的樓層分類,在分類推送上完善平臺的功能。