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