孫友林
(金朋物聯(lián)網(wǎng)技術(shù)研究院(廣州)有限公司,廣東 廣州 511400)
物聯(lián)網(wǎng)云平臺(tái)主要為了滿足物聯(lián)網(wǎng)產(chǎn)品的云端接入服務(wù)、后臺(tái)管理、APP 接口等方面的需求[1-4],云平臺(tái)建設(shè)必須滿足以下3 個(gè)方面的要求:
(1)平臺(tái)伸縮性強(qiáng),即能夠滿足前期的小規(guī)模部署,也能方便應(yīng)對(duì)后期用戶的規(guī)?;鲩L(zhǎng)的需求;
(2)平臺(tái)的數(shù)據(jù)結(jié)構(gòu)必須高度抽象,不能過多陷于具體某一款產(chǎn)品的定義和功能開發(fā)中;
(3)云平臺(tái)的代碼應(yīng)該應(yīng)用目前主流的通用方法進(jìn)行開發(fā),便于開發(fā)人員的招聘以及項(xiàng)目的維護(hù)管理。
基于以上要求,同時(shí)考慮到系統(tǒng)的通用性、擴(kuò)展性、高可用性等方面,系統(tǒng)必須采用分布式、節(jié)點(diǎn)多活的部署方式,將相關(guān)業(yè)務(wù)模塊進(jìn)行充分拆分,然后再對(duì)各個(gè)服務(wù)進(jìn)行集群部署,以確保服務(wù)的高可用性。
整個(gè)系統(tǒng)選用MQTT 作為物聯(lián)網(wǎng)通信協(xié)議標(biāo)準(zhǔn),云平臺(tái)架構(gòu)如圖1所示。整個(gè)云平臺(tái)需要提供對(duì)各類設(shè)備的接入和消息收發(fā)服務(wù),除此之外還需要提供對(duì)APP 以及設(shè)備端的REST 服務(wù)。消息服務(wù)器將只作為一個(gè)通道的功能存在,不進(jìn)行業(yè)務(wù)邏輯的處理,MQTT 可以直接傳輸二進(jìn)制數(shù)據(jù),相對(duì)于XMPP 協(xié)議的XML,效率更高,更輕量化。所有暴露的接口和通道綁定域名地址,系統(tǒng)之間的數(shù)據(jù)交互跟IP地址解耦。搭建WebService 服務(wù),開放統(tǒng)一的數(shù)據(jù)接口給APP/Web 客戶端使用,管理人員在Web 控制臺(tái)可以對(duì)設(shè)備進(jìn)行管理。物聯(lián)網(wǎng)平臺(tái)的建立需要經(jīng)過一個(gè)設(shè)備量的增長(zhǎng)過程,在平臺(tái)建設(shè)初期,要充分考慮后期的系統(tǒng)擴(kuò)容[5-7]。云平臺(tái)的任意節(jié)點(diǎn)均可以實(shí)現(xiàn)快速集群,系統(tǒng)可以根據(jù)業(yè)務(wù)發(fā)展情況,通過調(diào)整平臺(tái)的集群部署結(jié)構(gòu),快速實(shí)現(xiàn)系統(tǒng)擴(kuò)容。
圖1 MQTT 物聯(lián)網(wǎng)云服務(wù)系統(tǒng)架構(gòu)
硬件設(shè)備需要在云端注冊(cè)后,才能夠正常使用,設(shè)備接入注冊(cè)流程如圖2所示。注冊(cè)時(shí),需要給云端提供ProductKey和Passcode,云端根據(jù)ProductKey 和Passcode 以及隨機(jī)數(shù)生成 Did 后返回給設(shè)備,設(shè)備收到后保存到FLASH 中,除非設(shè)備被Reset,否則一直使用此Did。同時(shí),設(shè)備在注冊(cè)時(shí)也要提供給服務(wù)器一個(gè)類似MAC 的值,這個(gè)可以是MAC 地址,也可以是設(shè)備序列號(hào),但必須是用戶在設(shè)備外面可以直接見到的唯一標(biāo)識(shí),用來給用戶綁定設(shè)備。開發(fā)者在云上新建一個(gè)產(chǎn)品時(shí),會(huì)得到一個(gè)ProductKey。設(shè)備在初始化后,自身的嵌入式程序隨機(jī)產(chǎn)生 Passcode,用于云端注冊(cè)和APP 綁定的安全鑒權(quán);用戶想通過手機(jī)控制設(shè)備前,必須先與該設(shè)備綁定。綁定的過程其實(shí)就是獲取設(shè)備的Did和Passcode的過程,需要有接觸設(shè)備權(quán)限的用戶才能獲取設(shè)備的Passcode。當(dāng)用戶按下設(shè)備的某個(gè)按鈕后,設(shè)備會(huì)在短時(shí)間內(nèi)處于可被配對(duì)狀態(tài),這時(shí)用戶可以通過手機(jī)獲取到設(shè)備的Did 和Passcode,手機(jī)會(huì)把用戶與設(shè)備的綁定信息同步到云端。
圖2 新設(shè)備接入注冊(cè)流程
設(shè)備接入云并開始正常運(yùn)行之后,各種傳感器的實(shí)時(shí)數(shù)據(jù)會(huì)根據(jù)業(yè)務(wù)設(shè)定,定期上報(bào)數(shù)據(jù)。上報(bào)的數(shù)據(jù)通過MQTT推送到APP 給用戶,同時(shí)云端也會(huì)對(duì)消息進(jìn)行存儲(chǔ)。設(shè)備上報(bào)消息流程如圖3所示。
圖3 設(shè)備上報(bào)消息流程
用戶需要注冊(cè)之后才能使用云平臺(tái)提供的服務(wù),因?yàn)樵破脚_(tái)需要對(duì)設(shè)備進(jìn)行各種綁定,所以即使用戶是通過第三方帳號(hào)注冊(cè)的,也需要?jiǎng)?chuàng)建對(duì)應(yīng)的帳號(hào)。新用戶注冊(cè)賬號(hào)流程如圖4所示。
圖4 新用戶注冊(cè)賬號(hào)流程
用戶發(fā)送的指令成功到達(dá)設(shè)備之后,設(shè)備的狀態(tài)將被更改。設(shè)備狀態(tài)被更改后會(huì)觸發(fā)設(shè)備上報(bào)運(yùn)行數(shù)據(jù)的消息,把設(shè)備的新數(shù)據(jù)推送到APP 和服務(wù)器。APP 控制設(shè)備流程如圖5所示。
圖5 APP 控制設(shè)備流程
在本文設(shè)計(jì)框架中,DB、MQTT 服務(wù)器、MQTT Client、Webservice、Spring MVC 等模塊是相對(duì)獨(dú)立的,可以很輕易地部署在不同的服務(wù)器上而不需要做太多的改動(dòng)。在系統(tǒng)建設(shè)初期,可以安排兩臺(tái)服務(wù)器,一臺(tái)服務(wù)器作為MQTT 服務(wù)器,另外一臺(tái)服務(wù)器則把DB 和業(yè)務(wù)邏輯處理的部分部署上去。根據(jù)Emqttd 官方的測(cè)試,一臺(tái)i3 CPU 配4 GB 內(nèi)存的服務(wù)器就可以支持十萬級(jí)別數(shù)量的并發(fā)[8-10]。后期可以根據(jù)實(shí)際需求,進(jìn)行靈活擴(kuò)展。
物聯(lián)網(wǎng)系統(tǒng)的安全性是至關(guān)重要的,如果系統(tǒng)被人入侵,后果不堪設(shè)想。基于此,系統(tǒng)的安全設(shè)計(jì)要求如下:(1)全站實(shí)現(xiàn)HTTPS 通信;(2)MQTT 實(shí)現(xiàn)賬號(hào)認(rèn)證和非對(duì)稱加密雙重安全機(jī)制;(3)物聯(lián)網(wǎng)云平臺(tái),除暴露必要的端口外,其他全部?jī)?nèi)網(wǎng)運(yùn)行,內(nèi)網(wǎng)運(yùn)行也需要通過防火墻實(shí)現(xiàn)嚴(yán)格的審核機(jī)制;(4)所有的數(shù)據(jù)庫(kù),MongoDB、Redis 等均開啟指定IP 登錄,限制非法登錄來源;(5)所有密碼均采用Hash+Salt 的方式進(jìn)行存儲(chǔ),避免數(shù)據(jù)庫(kù)暴露后賬號(hào)被撞庫(kù);(6)所有對(duì)外的Rest 接口,開啟防刷功能,針對(duì)同一個(gè)API接口,對(duì)同一認(rèn)證賬號(hào),限制每秒訪問次數(shù);(7)對(duì)APP端的接口采用Token 驗(yàn)證機(jī)制,所有Token 均有時(shí)效性,在超過之前,APP 端應(yīng)該主動(dòng)更新Token,否則用戶將需要重新登錄驗(yàn)證;(8)在MQTT 側(cè),對(duì)所有的客戶端開啟ACL鑒權(quán),后臺(tái)開啟監(jiān)控,可隨時(shí)取消非法設(shè)備的MQTT 權(quán)限;(9)所有的MQTT 報(bào)文、Rest 接口請(qǐng)求,均寫入日志或者數(shù)據(jù)庫(kù)中,以備審計(jì)查詢。
新浪微博、QQ、微信、百度等各大社交網(wǎng)站平臺(tái)都開放了第三方登錄的API,申請(qǐng)通過之后,客戶可以利用他們的帳號(hào)體系比較方便地注冊(cè)和登錄。注冊(cè)登錄具體流程如圖6所示。
圖6 第三方賬號(hào)登錄注冊(cè)流程
物聯(lián)網(wǎng)云平臺(tái)的Client 端有兩大類:一類是各種硬件設(shè)備,另一類是使用這些硬件設(shè)備的人。對(duì)于設(shè)備級(jí)別的帳號(hào),可以通過新設(shè)備注冊(cè)流程來實(shí)現(xiàn)。對(duì)于人這個(gè)級(jí)別的用戶,又可以分為設(shè)備的直接使用者、設(shè)備的開發(fā)者以及物聯(lián)網(wǎng)云系統(tǒng)的管理者和超級(jí)管理員等各種類型的用戶,這些用戶可以使用各種手機(jī)APP、電腦瀏覽器等與物聯(lián)網(wǎng)云平臺(tái)交互。這種類型的用戶應(yīng)支持直接注冊(cè)或者第三方帳號(hào)登錄注冊(cè)等方式。
本文構(gòu)建了一個(gè)基于MQTT 協(xié)議的物聯(lián)網(wǎng)云平臺(tái),對(duì)云平臺(tái)的基礎(chǔ)框架及基礎(chǔ)能力進(jìn)行了設(shè)計(jì)及實(shí)現(xiàn),云平臺(tái)已經(jīng)在智能家居、智慧路燈等系統(tǒng)中得到了應(yīng)用。物聯(lián)網(wǎng)平臺(tái)為設(shè)備提供安全可靠的連接通信能力,向下連接海量設(shè)備,支撐設(shè)備數(shù)據(jù)采集上云;向上提供云端API,指令數(shù)據(jù)通過API 調(diào)用下發(fā)至設(shè)備端,實(shí)現(xiàn)遠(yuǎn)程控制。未來,物聯(lián)網(wǎng)平臺(tái)還要提供其他增值能力,如規(guī)則引擎、數(shù)據(jù)分析、邊緣計(jì)算等,為各類IoT 場(chǎng)景和行業(yè)開發(fā)者賦能。