本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,尤其涉及一種基于MQTT協(xié)議的面向用戶(hù)的消息推送的方法。
背景技術(shù):
消息發(fā)送端經(jīng)由消息推送服務(wù)器到達(dá)消息接收端的流程是一致的,都需要經(jīng)過(guò)建立連接,訂閱,消息發(fā)布,斷開(kāi)連接四步。隨著互聯(lián)網(wǎng)和智能終端設(shè)備的普及,對(duì)信息的獲取提出了較高的要求,要求在規(guī)定的時(shí)間內(nèi)推送消息,以及在低功耗,低速率的網(wǎng)絡(luò)條件下進(jìn)行傳輸。以往的通訊方式是靠客戶(hù)端主動(dòng)的拉取,這種方式使得應(yīng)用程序會(huì)不停的檢查是否有新的消息通知,浪費(fèi)帶寬。
技術(shù)實(shí)現(xiàn)要素:
為了解決該問(wèn)題,本發(fā)明提出了一種基于MQTT協(xié)議的面向用戶(hù)的消息推送的方法。送的方式是服務(wù)器主動(dòng)的行為,將最新的消息直接發(fā)送給用戶(hù),減少交互次數(shù),縮短通訊時(shí)間,節(jié)省了帶寬。借助該發(fā)明使得開(kāi)發(fā)人員便捷地構(gòu)建消息推送服務(wù),解決消息主題單一、同一用戶(hù)的不同設(shè)備難以區(qū)分的問(wèn)題。
該發(fā)明旨在提供面向用戶(hù)的消息推送服務(wù),這樣消息發(fā)布者只需要關(guān)注消息的接收端是哪個(gè)用戶(hù),而不需要關(guān)注該用戶(hù)有哪些消息接收設(shè)備;通過(guò)細(xì)分主題使得消息發(fā)布者可根據(jù)五類(lèi)推送規(guī)則(單一用戶(hù)推送,批量用戶(hù)推送,標(biāo)簽用戶(hù)推送,所有在線(xiàn)用戶(hù)推送,所有用戶(hù)推送)推送消息至不同類(lèi)別的用戶(hù),滿(mǎn)足不同的推送業(yè)務(wù)場(chǎng)景需求。
本發(fā)明提供基于MQTT協(xié)議實(shí)現(xiàn)消息推送服務(wù)的模型,包括兩大塊:(1)細(xì)分連接通道:在計(jì)算機(jī)應(yīng)用領(lǐng)域,消息推送廣泛應(yīng)用于PC、移動(dòng)設(shè)備(Android,iOS),同一用戶(hù)可能同時(shí)持有PC、Android設(shè)備、iOS設(shè)備??山柚摪l(fā)明使消息發(fā)布者在發(fā)布消息時(shí)只關(guān)注發(fā)送消息給哪些消息接收者,而不需要關(guān)心該消息接收者持有哪些設(shè)備。(2)細(xì)分主題:根據(jù)計(jì)算機(jī)應(yīng)用領(lǐng)域的潛在需求提供不同的推送邏輯;針對(duì)不同的潛在需求定義五類(lèi)推送規(guī)則:?jiǎn)我挥脩?hù)推送,批量用戶(hù)推送,標(biāo)簽用戶(hù)推送,所有在線(xiàn)用戶(hù)推送,所有用戶(hù)推送。
通過(guò)對(duì)連接通道進(jìn)行細(xì)化,將連接通道和用戶(hù)的消息接收端關(guān)聯(lián),一個(gè)用戶(hù)可以持有數(shù)個(gè)消息接收端,即PC、Android設(shè)備、iOS設(shè)備;用戶(hù)A發(fā)送消息給用戶(hù)B,消息到達(dá)消息推送服務(wù)器,消息推送服務(wù)器通過(guò)已維護(hù)的用戶(hù)和設(shè)備的關(guān)聯(lián)關(guān)系獲取用戶(hù)B持有的消息接收端,判斷用戶(hù)B持有的消息接收端當(dāng)前在線(xiàn)的哪種,通過(guò)用戶(hù)B的一個(gè)在線(xiàn)通道即可將消息推送給用戶(hù)B。
連接通道是按照規(guī)則connType_connID進(jìn)行組織的,其中connType表示通道的類(lèi)型,包含三類(lèi)值:1(表示PC端)、2(表示Android端)、3(表示iOS端);connID表示通道ID號(hào),該值的定義規(guī)則和消息接收設(shè)備相關(guān),具體為:PC的通道ID是用戶(hù)的clientId、Android設(shè)備的通道ID是Android設(shè)備的唯一標(biāo)識(shí)、iOS端的通道ID是蘋(píng)果APNS推送服務(wù)器返回的一串device token;
在連接通道正常建立之后,消息推送服務(wù)器需要對(duì)三類(lèi)不同的通道進(jìn)行連接通道的存儲(chǔ)與管理;消息推送服務(wù)器將PC端的通道存儲(chǔ)在所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)和所有用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)中,如果PC端斷開(kāi)連接的話(huà),刪除所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)中的記錄;所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)用于推送主題是在線(xiàn)用戶(hù)的情況,所有用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)用于推送主題是所有用戶(hù)的情況;消息推送服務(wù)器對(duì)Android端和iOS端的存儲(chǔ)稍有不同,除了在所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)和所有用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)連接通道之外,還需要Android端和iOS端將所屬的用戶(hù)信息以訂閱主題的方式告知消息推送服務(wù)器,消息推送服務(wù)器將用戶(hù)與所持設(shè)備的關(guān)聯(lián)關(guān)系存儲(chǔ)在用戶(hù)與所持設(shè)備的關(guān)聯(lián)關(guān)系數(shù)據(jù)結(jié)構(gòu)中,方便后續(xù)消息推送的關(guān)聯(lián)查詢(xún)。
對(duì)訂閱/發(fā)布的主題設(shè)計(jì)五種推送規(guī)則,這五種推送規(guī)則為:/ipush/type/{publishType}/{arguments(arg1/arg2/……)},其中/ipush/type/是固定內(nèi)容,用來(lái)區(qū)分當(dāng)前消息是面向用戶(hù)的消息推送;publishType和arguments是變量,它們的值的詳細(xì)說(shuō)明如下:
1)publishType是1表示單一用戶(hù)推送,arguments描述的是用戶(hù)的clientId,消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID;
2)publishType是2表示批量用戶(hù)推送,arguments描述的是多個(gè)用戶(hù)的clientId,參數(shù)之間使用“/”分隔;消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID;
3)publishType是3表示標(biāo)簽用戶(hù)推送,arguments是用戶(hù)自定義的主題內(nèi)容,消息推送服務(wù)器通過(guò)查找訂閱該主題的所有用戶(hù),消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID;
4)publishType是4表示在線(xiàn)用戶(hù)推送,arguments是固定值“online”。消息推送服務(wù)器查找當(dāng)前在線(xiàn)用戶(hù),消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID;
5)publishType是5表示所有用戶(hù)(包括在線(xiàn)和離線(xiàn)的)推送,argument是固定值 “all”。消息推送服務(wù)器查找所有和消息推送服務(wù)器建立過(guò)連接的用戶(hù),消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID。
本發(fā)明的有益效果是
將本發(fā)明的方案進(jìn)行簡(jiǎn)單的實(shí)現(xiàn),然后針對(duì)每一種情況進(jìn)行測(cè)試。在不同的服務(wù)質(zhì)量下,本發(fā)明所描述的五種推送都可以將信息正確推送給消息接收用戶(hù),用戶(hù)的端包括web端,Android端,iOS端。
附圖說(shuō)明
圖1是本發(fā)明的用戶(hù)消息發(fā)布流程圖;
圖2是本發(fā)明的數(shù)據(jù)流向圖;
圖3是本發(fā)明的推送技術(shù)結(jié)構(gòu)圖第一部分;
圖4是本發(fā)明的推送技術(shù)結(jié)構(gòu)圖第二部分。
具體實(shí)施方式
下面對(duì)本發(fā)明的內(nèi)容進(jìn)行更加詳細(xì)的闡述:
本發(fā)明的所描述的是基于MQTT協(xié)議面向用戶(hù)的消息推送的方法。消息發(fā)送端經(jīng)由消息推送服務(wù)器到達(dá)消息接收端的流程是一致的,都需要經(jīng)過(guò)建立連接,訂閱,消息發(fā)布,斷開(kāi)連接四步。但是本發(fā)明首次提出了用戶(hù)的概念,在MQTT協(xié)議中將所有的連接一視同仁,因此在推送的過(guò)程中會(huì)對(duì)大量的連接進(jìn)行遍歷以選擇出消息接收端的連接通道;而本發(fā)明通過(guò)對(duì)連接通道進(jìn)行細(xì)化,將連接通道和用戶(hù)的消息接收端關(guān)聯(lián),一個(gè)用戶(hù)可以持有多個(gè)消息接收端,例如,用戶(hù)A給用戶(hù)B發(fā)送一條消息,但是用戶(hù)B持有多種消息接收端,如PC、Android設(shè)備、iOS設(shè)備。用戶(hù)A發(fā)送消息給用戶(hù)B,消息到達(dá)消息推送服務(wù)器,消息推送服務(wù)器通過(guò)已維護(hù)的用戶(hù)和設(shè)備的關(guān)聯(lián)關(guān)系獲取用戶(hù)B持有的消息接收端,判斷用戶(hù)B持有的消息接收端當(dāng)前在線(xiàn)的哪種,通過(guò)用戶(hù)B的某個(gè)在線(xiàn)通道即可將消息推送給用戶(hù)B。在上述的情境中,用戶(hù)A發(fā)送消息時(shí),關(guān)注的是發(fā)送什么消息內(nèi)容給哪個(gè)用戶(hù),而不需要關(guān)注用戶(hù)B持有哪些消息接收端,也就是本發(fā)明是將用戶(hù)作為管理的基本單位,消息體的發(fā)送端與接收端都是用戶(hù)的行為。在軟件開(kāi)發(fā)領(lǐng)域,經(jīng)常伴隨任務(wù)的分發(fā),工作進(jìn)度的調(diào)研的情景,最終都是落在特定人上面,因此本發(fā)明在軟件開(kāi)發(fā)領(lǐng)域有廣泛的應(yīng)用前景。
既然本發(fā)明進(jìn)行消息推送是以用戶(hù)為管理單位進(jìn)行組織,那么對(duì)于消息推送服務(wù)器來(lái)說(shuō)如何區(qū)分用戶(hù)下的消息接收端就顯得尤為重要。在本發(fā)明中問(wèn)題的解決辦法是使用連接通道進(jìn)行各種端的區(qū)分。
基于MQTT協(xié)議,本發(fā)明對(duì)連接通道賦予業(yè)務(wù)含義,本發(fā)明的連接通道是按照規(guī)則connType_connID進(jìn)行組織的,其中connType表示通道的類(lèi)型,包含三類(lèi)值:1(表示PC端)、2(表示Android端)、3(表示iOS端);connID表示通道ID號(hào),該值的定義規(guī)則和消息接收設(shè)備相關(guān),具體為:PC的通道ID是用戶(hù)的clientId、Android設(shè)備的通道ID是Android設(shè)備的唯一標(biāo)識(shí)、iOS端的通道ID是蘋(píng)果APNS推送服務(wù)器返回的一串device token。
在連接通道正常建立之后,消息推送服務(wù)器需要對(duì)三類(lèi)不同的通道進(jìn)行連接通道的存儲(chǔ)與管理。消息推送服務(wù)器將PC端的通道存儲(chǔ)在所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)和所有用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)中,如果PC端斷開(kāi)連接的話(huà),刪除所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)中的記錄。所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)用于推送主題是在線(xiàn)用戶(hù)的情況,所有用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)用于推送主題是所有用戶(hù)的情況。消息推送服務(wù)器對(duì)Android端和iOS端的存儲(chǔ)稍有不同,除了在所有在線(xiàn)用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)和所有用戶(hù)通道的數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)連接通道之外,還需要Android端和iOS端將所屬的用戶(hù)信息以訂閱主題的方式告知消息推送服務(wù)器,消息推送服務(wù)器將用戶(hù)與所持設(shè)備的關(guān)聯(lián)關(guān)系存儲(chǔ)在用戶(hù)與所持設(shè)備的關(guān)聯(lián)關(guān)系數(shù)據(jù)結(jié)構(gòu)中,方便后續(xù)消息推送的關(guān)聯(lián)查詢(xún)。
基于MQTT協(xié)議,本發(fā)明對(duì)主題進(jìn)行細(xì)分。MQTT協(xié)議中的主題是一串字符串,在本發(fā)明中,對(duì)訂閱/發(fā)布的主題設(shè)計(jì)五種推送規(guī)則,這五種推送規(guī)則為:/ipush/type/{publishType}/{arguments(arg1/arg2/……)},其中/ipush/type/是固定內(nèi)容,用來(lái)區(qū)分當(dāng)前消息是面向用戶(hù)的消息推送;publishType和arguments是變量,它們的值的詳細(xì)說(shuō)明如下:
1)publishType是1表示單一用戶(hù)推送,arguments描述的是用戶(hù)的clientId,消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID。
比如:用戶(hù)A發(fā)送消息給用戶(hù)B,則用戶(hù)A發(fā)送時(shí)需要指定主題:/ipush/type/1/1/2d7fe0516b8d2295bf92c7a5ae54f346,其中2d7fe0516b8d2295bf92c7a5ae54f346表示用戶(hù)B的clientId。
2)publishType是2表示批量用戶(hù)推送,arguments描述的是多個(gè)用戶(hù)的clientId,參數(shù)之間使用“/”分隔。消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID。
比如:用戶(hù)A發(fā)送消息給用戶(hù)B和用戶(hù)C,則用戶(hù)A發(fā)送時(shí)需要指定主題:/ipush/type/1/2/2d7fe0516b8d2295bf92c7a5ae54f346/2d7fe0516b8d4c95bf92c7a5ae5ca345,其中2d7fe0516b8d2295bf92c7a5ae54f346表示用戶(hù)B的clientId, 2d7fe0516b8d4c95bf92c7a5ae5ca345表示用戶(hù)C的clientId。
3)publishType是3表示標(biāo)簽用戶(hù)推送,arguments是用戶(hù)自定義的主題內(nèi)容,消息推送服務(wù)器通過(guò)查找訂閱該主題的所有用戶(hù),消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID。
比如:用戶(hù)A發(fā)送消息給訂閱主題為山東地域的用戶(hù),則用戶(hù)A發(fā)送時(shí)需要指定主題:/ipush/type/1/3/area=shangdong,其中area=shangdong表示訂閱該主題的用戶(hù)。
4)publishType是4表示在線(xiàn)用戶(hù)推送,arguments是固定值“online”。消息推送服務(wù)器查找當(dāng)前在線(xiàn)用戶(hù),消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID。
比如:用戶(hù)A發(fā)送消息給所有在線(xiàn)用戶(hù),則用戶(hù)A發(fā)送時(shí)需要指定主題:/ipush/type/1/4/online。
5)publishType是5表示所有用戶(hù)(包括在線(xiàn)和離線(xiàn)的)推送,argument是固定值 “all”。消息推送服務(wù)器查找所有和消息推送服務(wù)器建立過(guò)連接的用戶(hù),消息推送服務(wù)器根據(jù)用戶(hù)的clientId,按照規(guī)則拼接出用戶(hù)的PC通道ID(1_clientId),根據(jù)clientId關(guān)聯(lián)獲取用戶(hù)持有的Android設(shè)備、iOS設(shè)備的連接通道ID。
比如:用戶(hù)A發(fā)送消息給所有用戶(hù),則用戶(hù)A發(fā)送時(shí)需要指定主題:/ipush/type/1/5/all。
本發(fā)明使用用戶(hù)的概念進(jìn)行消息的發(fā)布與推送,使用特定的連接通道標(biāo)識(shí)、主題訂閱標(biāo)識(shí)來(lái)區(qū)分用戶(hù)下的不同的消息接收設(shè)備端。應(yīng)對(duì)軟件開(kāi)發(fā)領(lǐng)域中潛在的消息推送需求,定義了五類(lèi)推送規(guī)則,包括:?jiǎn)我煌扑?,批量推送,?biāo)簽用戶(hù)推送,所有在線(xiàn)推送,所有推送。