大家在玩游戲或使用QQ等IM工具時(shí),想必都見(jiàn)到過(guò)彈出被頂號(hào)或者是您的賬號(hào)于xx時(shí)間在另一設(shè)備登錄,您已被迫下線(xiàn)這樣的提示,然后不得不點(diǎn)退出按鈕退出整個(gè)應(yīng)用,或者點(diǎn)擊重新登錄把另一設(shè)備再頂下來(lái)。最近我參與的一個(gè)項(xiàng)目,正好就有這樣的需求,而且,由于我們項(xiàng)目中已經(jīng)使用到了MQTT協(xié)議進(jìn)行消息推送,實(shí)現(xiàn)遠(yuǎn)程控制,后臺(tái)用Java實(shí)現(xiàn),緩存使用了Redis,因此,正好可以利用現(xiàn)有的技術(shù)來(lái)實(shí)現(xiàn)這個(gè)功能。 實(shí)現(xiàn)的思路大概如下:首先,登錄時(shí)不僅需要賬號(hào)密碼,還可以將設(shè)備關(guān)鍵信息記錄下來(lái),如設(shè)備型號(hào)(Android|iPhone)、登錄時(shí)間、登錄IP、設(shè)備唯一標(biāo)識(shí)(UUID)等,這就需要前臺(tái)登錄功能與后臺(tái)接口一起配合實(shí)現(xiàn),并在后臺(tái)把userId已經(jīng)相關(guān)設(shè)備信息保存到Redis中,當(dāng)在另外一臺(tái)新設(shè)備上登錄同一賬號(hào)時(shí),將userId對(duì)應(yīng)的相關(guān)登錄設(shè)備信息直接進(jìn)行覆蓋,此時(shí)如果舊設(shè)備進(jìn)行重連時(shí),因?yàn)樵搖uid已經(jīng)不是當(dāng)前服務(wù)端的uuid了,所以直接返回下線(xiàn)通知,為了進(jìn)行友好提示,也可以將新登錄設(shè)備的主要信息(設(shè)備型號(hào)、登錄時(shí)間)進(jìn)行返回。 下面簡(jiǎn)單介紹一下實(shí)現(xiàn)的方法。 軟件安裝Linux下mqtt服務(wù)器Apollo的安裝下載選擇一個(gè)目錄用來(lái)下載保存 創(chuàng)建broker一個(gè)broker實(shí)例是一個(gè)文件夾,其中包含所有的配置文件及運(yùn)行時(shí)的數(shù)據(jù),不如日志和消息數(shù) 首先解壓:tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz 開(kāi)始創(chuàng)建broker實(shí)例:
下圖是Apache官方給的一些建議截圖: 啟動(dòng)broker實(shí)例啟動(dòng)broker實(shí)例可以有兩種方法,如下圖中所示: 可以執(zhí)行
或者
使其作為一個(gè)service進(jìn)行啟動(dòng),以后系統(tǒng)重啟后只需運(yùn)行/etc/init.d/apollo-broker-service start 訪(fǎng)問(wèn)Apollo的監(jiān)控頁(yè)面: http://localhost:61680/默認(rèn)用戶(hù)名、密碼為為 admin/password Linux下Redis的安裝與配置Redis的安裝非常簡(jiǎn)單,已經(jīng)有現(xiàn)成的Makefile文件,解壓后在src目錄下使用make命令完成編譯即可,redis-benchmark、redis-cli、redis-server、redis-stat 這四個(gè)文件,加上一個(gè) redis.conf 就構(gòu)成了整個(gè)redis的最終可用包。它們的作用如下: redis-server:Redis服務(wù)器的daemon啟動(dòng)程序 下載安裝:
啟動(dòng)編譯后生成的可執(zhí)行文件: ./redis-server & 不指定配置直接運(yùn)行,這時(shí)采用默認(rèn)配置,無(wú)密碼 最好還是使用最后一種方式進(jìn)行啟動(dòng) 如果只是在本機(jī)連接,那麼使用默認(rèn)配置文件不會(huì)有什么問(wèn)題,但是,如果是連接遠(yuǎn)程服務(wù)器端的Redis,則需要對(duì)配置文件進(jìn)行一些修改:
至于如何將Redis設(shè)置后臺(tái)服務(wù),開(kāi)機(jī)自啟等,這里就不介紹了,可以去搜索一下。 功能實(shí)現(xiàn)后臺(tái)接口Redis客戶(hù)端使用的是Jedis,如下代碼是一個(gè)對(duì)Jedis簡(jiǎn)單的封裝
然后在登錄接口中,當(dāng)判斷完登錄的用戶(hù)名密碼正確后,可以參考如下代碼的思路去實(shí)現(xiàn),首先判斷Redis中是否已保存有這個(gè)userId對(duì)用的值,有的話(huà)說(shuō)明當(dāng)前已經(jīng)有登錄,需要被替換到,同時(shí)使用MQTT發(fā)送消息給客戶(hù)端使其退出,Redis中不存在則只需保存userId和uuidStr即可
至于MQTT協(xié)議的實(shí)現(xiàn),這里使用的是Paho,如果后臺(tái)項(xiàng)目是使用Maven構(gòu)建的話(huà),在pom.xml中加入如下幾行即可:
然后對(duì)其進(jìn)行了一個(gè)簡(jiǎn)單的封裝
app端客戶(hù)端的做法思路也很簡(jiǎn)單,由于使用了MQTT,因此客戶(hù)端和服務(wù)器端其實(shí)已經(jīng)保持了一個(gè)長(zhǎng)連接,可以為客戶(hù)端寫(xiě)一個(gè)MQTTService,隨時(shí)監(jiān)聽(tīng)服務(wù)器推送過(guò)來(lái)的消息進(jìn)行處理
總結(jié)上述代碼可能在嚴(yán)謹(jǐn)性和可靠性上還會(huì)存在一些問(wèn)題,還需要經(jīng)過(guò)不斷的完善,但思路是很明確的。在這里尤其要安利一下MTQQ,現(xiàn)在越來(lái)越多的產(chǎn)品都是基于這個(gè)協(xié)議進(jìn)行開(kāi)發(fā),進(jìn)行消息推送等。它開(kāi)銷(xiāo)很小,支持各種流行編程語(yǔ)言,能夠適應(yīng)不穩(wěn)定的網(wǎng)絡(luò)傳輸需求,在未來(lái)幾年,相信MQTT的應(yīng)用會(huì)越來(lái)越廣。 |
|
來(lái)自: WindySky > 《待分類(lèi)》