王 瑩
(廈門東海職業(yè)技術(shù)學(xué)院,福建 廈門 361100)
基于移動互聯(lián)網(wǎng)的終端消息推送方案研究*
王 瑩
(廈門東海職業(yè)技術(shù)學(xué)院,福建 廈門 361100)
針對移動互聯(lián)網(wǎng)環(huán)境,提出了移動設(shè)備上的消息推送方案,通過消息推送方案能夠?qū)崿F(xiàn)穩(wěn)定可靠的消息推送.該消息推送方案是基于服務(wù)器主動向客戶端進行發(fā)送的,在推送中服務(wù)器支持對單獨的終端、多終端消息推送,也可以基于標(biāo)簽的形式向特定的群組進行推送.提出的方案可以為移動互聯(lián)網(wǎng)應(yīng)用提供快速可靠的消息推送.
移動互聯(lián)網(wǎng);終端消息推送;Android/IOS
隨著互聯(lián)網(wǎng)的發(fā)展,客戶機主動的向服務(wù)器請求信息的單一方式已經(jīng)不能夠滿足目前用戶對數(shù)據(jù)的需求,如何通過服務(wù)器向客戶機推送信息,通過為互聯(lián)網(wǎng)上內(nèi)容提供者和內(nèi)容定制方之間提供一種通信機制已經(jīng)成為了目前的研究熱點,服務(wù)端主動向客戶端進行消息推送,提高了服務(wù)器的主動性的同時也增加了服務(wù)器與客戶端的交互性能[1~2].
傳統(tǒng)互聯(lián)網(wǎng)都是客戶端主動向服務(wù)器請求數(shù)據(jù),服務(wù)器接收用戶的請求后將用戶請求的數(shù)據(jù)傳輸?shù)娇蛻舳?而客戶端與服務(wù)器端保持心跳,服務(wù)器主動向客戶端推送信息則是目前新興互聯(lián)網(wǎng)中的PUSH數(shù)據(jù)交互方式[3].PUSH的使用場景有時間不確定性以及時效性兩個特點,在日常應(yīng)用中發(fā)送的團購信息、電子消費賬單等都是通過PUSH數(shù)據(jù)交互方式實現(xiàn)的[4~5],本文基于移動互聯(lián)網(wǎng)的環(huán)境,提出了移動終端推送的解決方案,并且詳細分析了第三方的應(yīng)用如何接入本文的移動解決方案.
消息推送是實現(xiàn)消息從服務(wù)器端發(fā)送到客戶端的過程,由于服務(wù)器端與客戶端的關(guān)系是一對多的關(guān)系,因此,一條消息在服務(wù)器端可能會發(fā)送給多個客戶端.消息推送的過程是啟動客戶端的同時需要在推送服務(wù)器主動注冊,推送服務(wù)器記錄客戶端的消息并且通過心跳方案定時檢查客戶端是否在線,如果服務(wù)器端在心跳方案中檢測客戶端已經(jīng)下線,則服務(wù)器記錄該客戶端為下線狀態(tài),對于下線狀態(tài)的客戶端由于服務(wù)器無法與其建立通訊連接,因此,是不能對下線的客戶端進行消息推送的.當(dāng)服務(wù)器有消息要發(fā)送給客戶端時,服務(wù)器在進行注冊過的客戶端中選擇在線的客戶端,請求通過消息篩選方式選擇需要發(fā)送的客戶端,服務(wù)器與客戶端建立消息連接,通過消息連接將消息發(fā)送到客戶端,完成移動應(yīng)用的消息推送.
在系統(tǒng)需要對下線的客戶端進行消息推送時,我們通過在服務(wù)器記錄需要發(fā)送的消息以及下線的客戶端信息,當(dāng)服務(wù)器檢測到客戶端上線并且在消息服務(wù)器進行注冊時,服務(wù)器與客戶端建立消息推送連接,將客戶端的離線信息推送到對應(yīng)的客戶端.移動應(yīng)用的消息推送主要包括推送服務(wù)器以及客戶端兩個部分,如下對推送服務(wù)器以及客戶端進行介紹.
推送服務(wù)器:推送服務(wù)器負責(zé)維護客戶端的基本情況以及狀態(tài),同時,將消息推送給客戶端,具體包括接收客戶端的連接請求,記錄已經(jīng)連接的客戶端信息,并且通過輪詢的機制對客戶端進行心跳檢查,記錄客戶端的活動狀態(tài).
客戶端:通過TCP/UDP方式主動發(fā)起對推送服務(wù)器的連接請求,連接成功后負責(zé)接收推送服務(wù)器下發(fā)的推送信息以及回復(fù)推送服務(wù)器的心跳檢查.
移動消息推送解決方案如圖1所示.
圖1 移動消息推送解決方案
從圖1可見,對在消息推送過程中的客戶端與服務(wù)器端的交互流程進行了設(shè)計,移動消息推送實施之前需要客戶端到推送服務(wù)器注冊,消息推送服務(wù)器檢查注冊客戶端的在線狀態(tài)以及消息推送服務(wù)器通過消息推送連接發(fā)送消息給客戶端,移動消息推送解決方案的詳細流程如下:
1)啟動推送服務(wù)器,初始化服務(wù)器,并且在服務(wù)器端開啟客戶端連接服務(wù)進程;
2)啟動客戶端,客戶端主動向推送服務(wù)器發(fā)起注冊請求;
3)推送服務(wù)器接收客戶端推送注冊請求,驗證客戶端是否滿足注冊條件,如果滿足則記錄客戶端注冊信息,否則,告知客戶端注冊失?。?/p>
4)客戶端接收服務(wù)器注冊返回結(jié)果,如果注冊失敗,則提示推送注冊失敗,流程結(jié)束;
5)客戶端推送注冊成功,開啟推送服務(wù)器心跳檢查回復(fù)進程,如果在長時間沒有收到服務(wù)器心跳檢查,客戶端需主動向注冊服務(wù)器上報狀態(tài);
6)服務(wù)器端定時需要注冊的客戶端發(fā)送心跳檢查,并且記錄客戶端上報的狀態(tài),如果長時間沒有收到某個客戶端的狀態(tài)上報,則認為此客戶端為睡眠狀態(tài);
7)服務(wù)器端有消息需要推送時,遍歷在服務(wù)器端注冊的處于活躍的客戶端,并且將信息發(fā)送給客戶端.
消息推送在移動互聯(lián)網(wǎng)中的應(yīng)用是目前的一個研究熱點,大量移動應(yīng)用都需要消息推送服務(wù)與用戶進行交互.但是,移動消息推送作為一個與系統(tǒng)業(yè)務(wù)不相關(guān)的功能,如果每個應(yīng)用都開發(fā)自己的一套消息推送系統(tǒng),不僅僅會加大應(yīng)用開發(fā)的成本,降低應(yīng)用開發(fā)的進度,同時,消息推送效率也很難滿足實際要求.因此,目前消息推送在移動應(yīng)用中都是通過接入第三方消息推送系統(tǒng)所提供的移動應(yīng)用消息推送功能來實現(xiàn).
接入第三方消息推送系統(tǒng)的應(yīng)用方式優(yōu)勢在于消息推送與應(yīng)用的業(yè)務(wù)邏輯是完全解耦的,實現(xiàn)了系統(tǒng)的高內(nèi)聚低耦合的要求,使用第三方消息推送可以降低應(yīng)用開發(fā)成本,加快應(yīng)用開發(fā)的進度.由于第三方消息推送專注于解決消息推送過程中的核心技術(shù),因此,在消息推出過程中的耗電問題、網(wǎng)絡(luò)穩(wěn)定性以及推送到達率等核心問題的解決上有一定的優(yōu)勢.
新的移動互聯(lián)網(wǎng)推送方案能夠為移動APP提供推送服務(wù)的解決方案,但是,對于具體的APP開發(fā),由于推送不是其核心業(yè)務(wù),所以,完全沒有必要去開發(fā)和維護一套推送系統(tǒng),因此,如何以第三方的方式接入本文的移動互聯(lián)網(wǎng)推送解決方案,研究如何為移動應(yīng)用提供第三方推送服務(wù)是非常必要的,如圖2所示,是通過第三方推送服務(wù)方案接入本文消息推送系統(tǒng)的詳細設(shè)計圖.
圖2 第三方應(yīng)用接入推送服務(wù)方案
通過第三方的形式提供推送服務(wù)不僅可以減少移動應(yīng)用開發(fā)在消息推送中的投入,而且能夠提高消息推送的到達率等.在應(yīng)用接入第三方的消息推送服務(wù)器過程中只需要移動應(yīng)用的客戶端中包括推送SDK,并且客戶端通過推送SDK到推送服務(wù)器進行注冊以及響應(yīng)消息推送的心跳檢查.在第三方的應(yīng)用程序接入推送服務(wù)方案中通過推送SDK、推送服務(wù)器、應(yīng)用服務(wù)器和應(yīng)用程序之間進行信息交互實現(xiàn)了移動信息的推送,各實體描述如下:
推送SDK:作為應(yīng)用程序的客戶端集成工具包,提供應(yīng)用程序與推送服務(wù)器之間的交互,包括到推送服務(wù)器注冊以及接收并處理推送服務(wù)器推送的信息.
推送服務(wù)器:需要維護已經(jīng)注冊的推送客戶端信息,并且與推送客戶端保持心跳連接,在推送中與指定的客戶端建立消息傳輸連接,將服務(wù)器的信息主動推送到客戶端.
應(yīng)用服務(wù)器:第三方應(yīng)用程序的服務(wù)器,與推送服務(wù)器進行交互,將需要推送的數(shù)據(jù)以及客戶端信息提交給推送服務(wù)器,有推送服務(wù)器完成消息推送.
應(yīng)用程序:即第三方應(yīng)用程序,是集成了推送SDK的移動應(yīng)用,對推送SDK接收的信息進行顯示,并且可以控制推送SDK的消息收發(fā)功能.
應(yīng)用服務(wù)器需要保持Client ID與客戶端UID的映射關(guān)系,在消息推送時通過映射關(guān)系確定推送客戶端,再由推送服務(wù)器實施消息推送,完整的第三方推送服務(wù)推送過程的技術(shù)流程如下:
1)應(yīng)用程序集成推送SDK;
2)應(yīng)用程序啟動時,通過推送SDK到推送服務(wù)器進行注冊,并且與推送服務(wù)器保持心跳連接;
3)應(yīng)用服務(wù)將需要推送的消息以及客戶端信息提交給推送服務(wù)器,由推送服務(wù)器與推送SDK進行交互完成消息推送;
4)推送SDK獲取推送服務(wù)器的消息,通過一定的形式提交給應(yīng)用程序進行消息內(nèi)容展示.
在推送實現(xiàn)中,移動APP通過推送工具包與推送服務(wù)器進行通訊,移動推送的核心代碼是通過向推送服務(wù)器發(fā)送客戶端編號以及需要推送給客戶端的信息內(nèi)容,推送服務(wù)器通過TCP/IP協(xié)議與移動APP的第三方推送SDK建立連接并激活客戶端,將信息發(fā)送到客戶端,移動APP推送的核心代碼如下:
public class PusherUtil {
private static final Logger logger = LoggerFactory.getLogger(PusherUtil.class);
/* 向user 推送消息msg*/
public static void push(String host, int port, String deviceUid, String msg) {
logger.info("ddpush args [ host:{}, port:{}, user:{}, msg:{} ]", host, port, deviceUid, msg);
StopWatch sw = new StopWatch();
sw.start();
Pusher pusher = null;
try {
InetAddress ipAddress = InetAddress.getByName(host);
pusher = new Pusher(ipAddress.getHostAddress(), port, 5000);
pusher.push0x20Message(md5Byte(deviceUid), msg.getBytes("UTF-8"));
} finally {
if (pusher != null) {
try {
pusher.close();
}
}
sw.stop();
logger.info("ddpush time : {} ms", sw.getTotalTimeMillis());
}
public static PushedNotifications push(String apnsFilePath, String password, boolean production, String deviceToken, String msg, String type) {
logger.info("apns args [ password:{}, production:{}, deviceToken:{}, msg:{}, type:{}]", password, production, deviceToken, msg, type);
StopWatch sw = new StopWatch();
sw.start( );
try {
PushNotificationPayload complexPayload = PushNotificationPayload.complex();
complexPayload.addCustomAlertLocKey(msg);
complexPayload.addBadge(0);
complexPayload.addSound("default");
complexPayload.addCustomDictionary("type", type);
PushedNotifications pn = Push.payload(complexPayload, apnsFilePath, password, production, deviceToken);
logger.info("apns time : {} ms", sw.getTotalTimeMillis());
return pn;
} catch (CommunicationException e) {
throw new RuntimeException(e);
}
}
/*向所有人推送消息msg*/
public static void push(String host, int port, String msg) {
push(host, port, KMO_USER, msg);
}
private static byte[] md5Byte(String encryptStr) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(encryptStr.getBytes("UTF-8"));
return md.digest();
}
}
移動互聯(lián)網(wǎng)的快速成長促進了消息推送服務(wù)的發(fā)展,而消息推送本身與應(yīng)用程序具體業(yè)務(wù)無關(guān),因此將消息推送作為第三方的程序為應(yīng)用程序提供服務(wù)的方式應(yīng)運而生.綜上所述提出的移動互聯(lián)網(wǎng)的推送解決方案,分析了推送系統(tǒng)的結(jié)構(gòu)和消息推送流程,并對第三方如何接入該推送服務(wù)進行了介紹.
雖然針對移動終端提出了推送解決方案,但是,目前仍然有耗電問題、網(wǎng)絡(luò)穩(wěn)定性以及推送到達率等技術(shù)問題需要克服,下一步我們的工作將繼續(xù)對移動互聯(lián)網(wǎng)的推送關(guān)鍵技術(shù)進行研究,致力于實現(xiàn)移動互聯(lián)網(wǎng)上最穩(wěn)定可靠的推送服務(wù),并在相關(guān)技術(shù)參數(shù)上做到最優(yōu).
[1]許金喜, 張新有. Android平臺基于MQTT協(xié)議的推送機制[J]. 計算機系統(tǒng)應(yīng)用, 2015, 24(1):185-190.
[2]倪紅軍. 基于Android平臺的消息推送研究與實現(xiàn)[J]. 實驗室研究與探索, 2014, 33(5):96-100.
[3]汪海占, 邸萌, 黃祥林. 基于XMPP協(xié)議的Android消息推送設(shè)計與實現(xiàn)[J]. 科技廣場, 2015(2):40-46.
[4]李文江, 陳詩琴. 基于Android GCM服務(wù)的圖書館信息推送系統(tǒng)設(shè)計[J]. 現(xiàn)代圖書情報技術(shù), 2013, 29(11):91-96.
[5]蘇龍江. 基于iOS的輿情推送系統(tǒng)的設(shè)計與實現(xiàn)[D]. 廈門:廈門大學(xué), 2013.
OnSchemeofTerminalMessagePushBasedonMobileInternet
WANG Ying
(Xiamen Donghai Institute, Xiamen Fujian 361100, China)
Aiming at the mobile internet environment, a message push scheme for mobile devices is proposed to achieve stable and reliable message push. The scheme is sent by the server to the client automatically including individual terminal, multi terminals and specific groups in the form of tags. The proposed scheme can provide fast and reliable message push for mobile internet applications.
mobile internet; terminal message push; Android/IOS
1673-2103(2017)05-0045-05
2017-07-06
2014年福建省中青年教師教育科研項目(JAS14914)
王瑩(1980-),女,山東掖縣人,講師,碩士,研究方向:計算機應(yīng)用技術(shù).
TP393.4
A