物聯(lián)網(wǎng)系統(tǒng)開(kāi)發(fā)工作涉及哪些方面?
物聯(lián)網(wǎng)的概念已經(jīng)被炒了好多年了,奇怪的是:市場(chǎng)中對(duì)這個(gè)概念的反應(yīng)總是不溫不火。隨著5G技術(shù)的迅速普及,不知道是否能夠再次把這個(gè)領(lǐng)域帶火起來(lái)。目前國(guó)內(nèi)的很多大學(xué)已經(jīng)開(kāi)設(shè)了物聯(lián)網(wǎng)這個(gè)專(zhuān)業(yè)。
今天就從開(kāi)發(fā)者的角度,來(lái)簡(jiǎn)單看一下物聯(lián)網(wǎng)這個(gè)領(lǐng)域使用了哪些技術(shù)棧、有哪些開(kāi)發(fā)工作。
一、物聯(lián)網(wǎng)系統(tǒng)架構(gòu)
這張圖從開(kāi)發(fā)者的角度,展示了一個(gè)物聯(lián)網(wǎng)系統(tǒng)中的各種角色,包括它們之間的通信。如果從軟件開(kāi)發(fā)崗位的角度來(lái)對(duì)這幾個(gè)模塊進(jìn)行劃分的話,這個(gè)系統(tǒng)中主要包括:
前端、后端開(kāi)發(fā):負(fù)責(zé)物聯(lián)網(wǎng)平臺(tái)和業(yè)務(wù)應(yīng)用的開(kāi)發(fā);
嵌入式軟件:主要是設(shè)備端的開(kāi)發(fā),這部分根據(jù)使用的不同技術(shù)(或者說(shuō)硬件模塊),又可以分為很多不同的子領(lǐng)域;
移動(dòng)端開(kāi)發(fā):Android APP, iOS APP, H5 小程序,還有目前的鴻蒙系統(tǒng)APP。
當(dāng)前的物聯(lián)網(wǎng)應(yīng)用,所要做的就是控制和數(shù)據(jù)處理。指令,由用戶到終端一層一層往下下達(dá),直到硬件端由設(shè)備去執(zhí)行。而數(shù)據(jù),便是一層一層往上上報(bào),直至被可視化。
因此,與互聯(lián)網(wǎng)的架構(gòu)相比,起點(diǎn)與終點(diǎn)不一樣了:指令的終點(diǎn)與數(shù)據(jù)的起點(diǎn),變成了硬件層,而非最后的用戶層。
數(shù)據(jù)由客戶端 A 發(fā)送到服務(wù)端,客戶端 B 再?gòu)姆?wù)端獲取 A 的數(shù)據(jù),如此便算是完成了一個(gè)回路。而物聯(lián)網(wǎng)架構(gòu)則稍微麻煩了一些,多了一個(gè)層級(jí),便多了一個(gè)步驟。
硬件層上的微控制器通過(guò)直連的方式,采集各式各樣的數(shù)據(jù),比如溫度、濕度等。而受限于微控制器的成本、環(huán)境條件等因素,它可能無(wú)法直接連接到互聯(lián)網(wǎng)。因此,需要連接到一些額外的聯(lián)網(wǎng)設(shè)備才能實(shí)現(xiàn)。
而這些聯(lián)網(wǎng)設(shè)備,會(huì)負(fù)責(zé)處理來(lái)自各個(gè)硬件設(shè)備的數(shù)據(jù),并將其上傳至服務(wù)器。同時(shí),它會(huì)提供一個(gè)無(wú)線(如藍(lán)牙、紅外、ZigBee)接口作為數(shù)據(jù)的入口。因此,這一層級(jí)需要有更好的數(shù)據(jù)處理能力,并且它應(yīng)該要可以快速開(kāi)發(fā)。
二、開(kāi)發(fā)技術(shù)
物聯(lián)網(wǎng)設(shè)備端開(kāi)發(fā)技術(shù)目前有兩個(gè)比較大的發(fā)展方向,一是統(tǒng)一化的物聯(lián)網(wǎng)操作系統(tǒng),二是統(tǒng)一化的物聯(lián)網(wǎng)開(kāi)發(fā)框架。他們共同的目的是形成“軟件定義物聯(lián)網(wǎng)”,與傳統(tǒng)從芯片選型開(kāi)始的,著陸于原廠SDK中完成應(yīng)用開(kāi)發(fā),與需求和產(chǎn)品設(shè)計(jì)匯合的流程完全相反,希望從需求和產(chǎn)品設(shè)計(jì)入手,通過(guò)公開(kāi)統(tǒng)一的軟件構(gòu)架完成開(kāi)發(fā),再根據(jù)開(kāi)發(fā)使用到的資源去落地芯片和外圍設(shè)備。這樣做的好處主要在于提高開(kāi)發(fā)效率和形成可以復(fù)用的應(yīng)用代碼。
三、開(kāi)發(fā)框架
首先解釋一下開(kāi)發(fā)框架,開(kāi)發(fā)框架可以小到是一個(gè)細(xì)節(jié)的工具,也可以大到規(guī)定開(kāi)發(fā)的全部邊界。最典型的例子是Android,純粹操作系統(tǒng)意義上,Android是Linux的一個(gè)分支,但是從App開(kāi)發(fā)角度,除 NDK之外,沒(méi)有任何與Linux打交道的地方,所以也把Android叫做操作系統(tǒng)。再?gòu)V泛地看,Android除了面向手機(jī)應(yīng)用的開(kāi)發(fā)框架,還準(zhǔn)備了Google play這樣的應(yīng)用分發(fā)渠道,這是開(kāi)發(fā)者生態(tài)建設(shè)。同理,我們看Node.js在后端的種種開(kāi)發(fā)模式,也是將所有后端資源都封裝到 JavaScript里,開(kāi)發(fā)時(shí)可以隨時(shí)npm install各種包來(lái)require,解決了代碼復(fù)用問(wèn)題。
因此,開(kāi)發(fā)框架以及背后的代碼復(fù)用和開(kāi)發(fā)者生態(tài)才是真正的操作系統(tǒng)。目前在物聯(lián)網(wǎng)領(lǐng)域,正在嘗試向生產(chǎn)環(huán)境演進(jìn)的開(kāi)發(fā)框架基本都基于 JavaScript,而在小型實(shí)時(shí)操作系統(tǒng)上使用的 JavaScript runtime 目前也基本集中到了 JerryScript 上。JerryScript 是三星開(kāi)發(fā)和開(kāi)源的一個(gè)小資源占用的引擎,內(nèi)存需要 64KB,存儲(chǔ)需要 200KB 即可,能夠?qū)崿F(xiàn)完整的事件驅(qū)動(dòng),符合 ECMAScript 5.1。
四、設(shè)備端的開(kāi)發(fā)
這里描述的設(shè)備,還是屬于比較狹隘的范疇,僅僅包含了具有通信功能的物理硬件實(shí)體。如果從廣義的物聯(lián)網(wǎng)來(lái)看,任何物品,只要能夠接入網(wǎng)絡(luò),都可以稱(chēng)之為設(shè)備,或者稱(chēng)之為 thing。比如:把一件衣服附上一個(gè)電子標(biāo)簽,也是物聯(lián)網(wǎng)的一個(gè)小分子。
我們?nèi)耘f以傳統(tǒng)意義上的設(shè)備來(lái)講解,比如:智慧路燈,智能手表,智能家居里的門(mén)磁、報(bào)警器等等。
對(duì)設(shè)備端的開(kāi)發(fā)進(jìn)行分類(lèi)的話,從通信方式這個(gè)角度來(lái)進(jìn)行劃分比較清晰。
一個(gè)設(shè)備要想接入到網(wǎng)絡(luò),肯定需要通信功能,包括:有線通信,無(wú)線通信。在一些傳統(tǒng)行業(yè),或者對(duì)通信質(zhì)量要求比較高的場(chǎng)景下,部署有線網(wǎng)絡(luò)還是比較常見(jiàn)的,例如一些工業(yè)場(chǎng)景中。對(duì)于一些民用領(lǐng)域,大部分還是以無(wú)線通信為主。
4.1、不需要網(wǎng)關(guān)的設(shè)備
這一類(lèi)設(shè)備,利用 2G/3G/4G 基站來(lái)進(jìn)行數(shù)據(jù)的傳輸,產(chǎn)品的形態(tài)是:
也就是單片機(jī)+通信模塊的方式。
通信模塊包括:GPRS 模塊、4Gor5G模塊、NB-IoT等等。
在開(kāi)發(fā)這一類(lèi)產(chǎn)品的時(shí)候,單片機(jī)負(fù)責(zé)產(chǎn)品的功能部分;通信模塊負(fù)責(zé)通信部分。單片機(jī)與通信模塊之間,在硬件上通過(guò) UART 口通信居多,在協(xié)議上可以通過(guò) AT 指令,或者其他的一些專(zhuān)有協(xié)議。
近幾年,在傳統(tǒng)的消費(fèi)類(lèi)電子產(chǎn)品上,添加一個(gè)通信模塊,讓產(chǎn)品達(dá)到連網(wǎng)的功能,還是比較流行的。這一類(lèi)的產(chǎn)品的軟件開(kāi)發(fā)工作,與一般的單片機(jī)開(kāi)發(fā)并無(wú)兩樣。無(wú)非是增加了一些通過(guò)網(wǎng)絡(luò)來(lái)上報(bào)數(shù)據(jù),或者從網(wǎng)絡(luò)接收控制指令。只要熟悉所使用的通信協(xié)議即可。
上面的這種產(chǎn)品形態(tài),需要對(duì)硬件進(jìn)行重新設(shè)計(jì),比較適合從零開(kāi)始的產(chǎn)品開(kāi)發(fā)。那么對(duì)于那些已有的產(chǎn)品,如果想連接到物聯(lián)網(wǎng)平臺(tái)上,但是又不想重新設(shè)計(jì),又該怎么辦呢?
比如:一些掃地機(jī)、吸塵器的廠商,由于找不到其他可以創(chuàng)新、突破的點(diǎn),于是就開(kāi)始內(nèi)卷,紛紛加上連網(wǎng)的功能。
他們直接在產(chǎn)品中,添加一個(gè)ESP8266或者ESP32模組,就立刻升級(jí)成一個(gè)智能產(chǎn)品。ESP8266 或者 ESP32 與一般的通信模組有一點(diǎn)不一樣:它是一個(gè)完整的單片機(jī),只不過(guò)它們的主要用途就是專(zhuān)門(mén)用來(lái)解決通信問(wèn)題,而不是一般的功能控制。
4.2、需要網(wǎng)關(guān)的設(shè)備
如果提到智能家居,可能大部分的人會(huì)想到一個(gè)詞語(yǔ)ZigBee,這是一個(gè)局域網(wǎng)的無(wú)線通信協(xié)議,大概在2005年左右就開(kāi)始在智能家居中嶄露頭角了。與 ZigBee類(lèi)似的無(wú)線通信協(xié)議還有:LoRa、ZWave、RF433、BLE等等。它們的作用都是類(lèi)似的:都是為了讓多個(gè)設(shè)備能夠組網(wǎng),節(jié)點(diǎn)之間以多跳的方式傳輸數(shù)據(jù),達(dá)到通信的目的。
這些數(shù)據(jù)最終會(huì)匯總到一個(gè)叫做網(wǎng)關(guān)的設(shè)備,然后與云端的服務(wù)器進(jìn)行通信。
這一類(lèi)產(chǎn)品的開(kāi)發(fā),包括:網(wǎng)關(guān)開(kāi)發(fā)和設(shè)備開(kāi)發(fā)這兩種。網(wǎng)關(guān)的開(kāi)發(fā)稍微復(fù)雜一些。從功能上來(lái)說(shuō),網(wǎng)關(guān)需要實(shí)現(xiàn):
設(shè)備的管理(與物聯(lián)網(wǎng)平臺(tái)的設(shè)備管理不是一個(gè)概念);
規(guī)則引擎(在斷網(wǎng)的狀態(tài)下實(shí)現(xiàn)場(chǎng)景聯(lián)動(dòng)等功能);
通信協(xié)議轉(zhuǎn)換(把物理網(wǎng)平臺(tái)的通信協(xié)議轉(zhuǎn)成設(shè)備私有協(xié)議);
有些網(wǎng)關(guān)中,還會(huì)集成不同的無(wú)線通信協(xié)議模塊,比如:把 ZigBee、BLE、LoRa、紅外等功能,集成在一個(gè)網(wǎng)關(guān)中,這樣的話,不同通信方式的設(shè)備就可以在一個(gè)系統(tǒng)中共存了。
此時(shí),網(wǎng)關(guān)就要做更多的工作:
上行鏈路(連接到云平臺(tái)):需要做到協(xié)議的統(tǒng)一,也就是說(shuō)云平臺(tái)才不關(guān)系下面到底是什么樣的無(wú)線通信技術(shù),云平臺(tái)只會(huì)以統(tǒng)一的數(shù)據(jù)格式來(lái)表示每個(gè)設(shè)備;
下行鏈路(連接到設(shè)備):協(xié)議轉(zhuǎn)換,把云平臺(tái)發(fā)來(lái)的統(tǒng)一的數(shù)據(jù)格式,轉(zhuǎn)換成不同的無(wú)線通信協(xié)議特有的數(shù)據(jù)格式;
設(shè)備的開(kāi)發(fā)工作就相對(duì)純粹一點(diǎn)了,它只需要處理某一種無(wú)線協(xié)議即可。這一類(lèi)設(shè)備的開(kāi)發(fā),一般都是使用相應(yīng)的通信模組,底層的協(xié)議棧都是提供好的。開(kāi)發(fā)者需要做的工作主要就是熟悉應(yīng)用層的通信協(xié)議,完成指令的解析和數(shù)據(jù)上報(bào)工作。
4.3、WiFi類(lèi)設(shè)備
這一類(lèi)產(chǎn)品最常見(jiàn)的就是各種品牌的網(wǎng)絡(luò)攝像頭(IPCamera),比如:小米、360、螢石等等。攝像頭如果作為一個(gè)單品來(lái)使用,只要把家中的 WiFi SSID 和密碼配置到攝像頭中,就可以使用官方的 APP 來(lái)遠(yuǎn)程查看實(shí)時(shí)畫(huà)面了。
如果把攝像頭集成在一個(gè)智能家居的系統(tǒng)中,就需要二次開(kāi)發(fā)。攝像頭廠家一般都會(huì)提供 SDK,作為開(kāi)發(fā)者需要做的事情就是:調(diào)用 SDK 中的 API 函數(shù),獲取實(shí)時(shí)畫(huà)面、發(fā)送指令控制攝像頭云臺(tái)轉(zhuǎn)動(dòng)。
這里有一個(gè)底層的技術(shù)很有意思:P2P 網(wǎng)絡(luò)穿透。我們買(mǎi)來(lái)一個(gè)網(wǎng)絡(luò)攝像機(jī),是不可能有一個(gè)獨(dú)立的 IP 地址的。也就是說(shuō):其他設(shè)備(手機(jī))是沒(méi)辦法通過(guò) IP:PORT 的編程方式,直接連接到攝像頭的。但是為了實(shí)時(shí)畫(huà)面的傳輸質(zhì)量,為了減輕服務(wù)器的轉(zhuǎn)發(fā)壓力,手機(jī)最好可以直接與攝像頭建立 TCP 通信。此時(shí),P2P 網(wǎng)絡(luò)穿透給這種需求提供了可能。
在P2P Master(就是一臺(tái)服務(wù)器)的協(xié)助下,實(shí)現(xiàn)移動(dòng)端與攝像頭之間的網(wǎng)絡(luò)穿透,直接建立TCP連接。
五、物聯(lián)網(wǎng)平臺(tái)開(kāi)發(fā)
物聯(lián)網(wǎng)平臺(tái),作為連接業(yè)務(wù)應(yīng)用和設(shè)備的中間層,屏蔽了各種復(fù)雜的設(shè)備接口,實(shí)現(xiàn)設(shè)備的快速接入。目前,做的比較大的就是那么幾家巨頭:亞馬遜的 AWS 平臺(tái),阿里云、騰訊、華為的物聯(lián)網(wǎng)平臺(tái)。
以上這幾家的物聯(lián)網(wǎng)平臺(tái),僅僅是他們的云平臺(tái)中的一個(gè)組成部分。它們的目標(biāo)就是提供一個(gè)通用的通信標(biāo)準(zhǔn)和 SDK,快速的接入各種硬件設(shè)備,通過(guò)設(shè)備接入數(shù)量、通信數(shù)據(jù)的流量,以及提供各種業(yè)務(wù)層的服務(wù)來(lái)賺錢(qián)。
出于不同的原因,諸如保密、安全、可擴(kuò)展、核心技術(shù)等原因,一定規(guī)模的公司會(huì)采用自主開(kāi)發(fā)的方式。這種開(kāi)發(fā)方式與 Web 應(yīng)用開(kāi)發(fā)方式并沒(méi)有太大區(qū)別,都是在數(shù)據(jù)進(jìn)行 CRUD 操作。并且和前后端分離架構(gòu)一樣,使用 API 作為接口,同時(shí)再加上支持不同的傳輸協(xié)議,如 MQTT、CoAP 等。
物聯(lián)網(wǎng)系統(tǒng)在存儲(chǔ)上,采用 NoSQL 作為存儲(chǔ)介質(zhì)會(huì)有更大的優(yōu)勢(shì)。一般來(lái)說(shuō),物聯(lián)網(wǎng)系統(tǒng)的數(shù)據(jù)都是寫(xiě)入遠(yuǎn)遠(yuǎn)多于讀取的場(chǎng)景。與此同時(shí),由于設(shè)備的種類(lèi)繁多,不可能為每一類(lèi)設(shè)備創(chuàng)建表;或者考慮到大量設(shè)備的特性,來(lái)建立一個(gè)通用的表,但在未來(lái)這樣的表可能仍不適用。
因此,對(duì)于物聯(lián)網(wǎng)數(shù)據(jù)來(lái)說(shuō),選用諸如 MongoDB 這一類(lèi)的 NoSQL 數(shù)據(jù)庫(kù),有這么一些優(yōu)點(diǎn):
靈活性。采用非結(jié)構(gòu)化的數(shù)據(jù)模型,可以存儲(chǔ)和處理任何結(jié)構(gòu)的數(shù)據(jù);
支持水平擴(kuò)展。NoSQL 數(shù)據(jù)庫(kù)的分布式存儲(chǔ)架構(gòu),帶來(lái)了優(yōu)秀的水平擴(kuò)展性;
實(shí)時(shí)數(shù)據(jù)分析。如 MongoDB 可以通過(guò)豐富的索引和查詢支持,包括二次、地理空間和文本搜索索引,聚合框架和本地 MapReduce,可以針對(duì)傳感器數(shù)據(jù)就地運(yùn)行報(bào)告分析。
然而,這樣的系統(tǒng)不免存在研發(fā)周期長(zhǎng)的問(wèn)題。如果需要快速驗(yàn)證,那么應(yīng)該考慮使用云服務(wù)來(lái)完成部分功能。
另外,還有一些下一梯隊(duì)的公司,開(kāi)發(fā)了自己的、專(zhuān)門(mén)針對(duì)物聯(lián)網(wǎng)領(lǐng)域的平臺(tái)。由于知名度不高,只能以合作開(kāi)發(fā)項(xiàng)目的形式來(lái)吸引硬件設(shè)備的接入。從開(kāi)發(fā)的角度來(lái)看,物聯(lián)網(wǎng)平臺(tái)的開(kāi)發(fā)技術(shù)棧主要是后臺(tái)開(kāi)發(fā)。由于這部分技術(shù)棧我不太熟悉,就不去深入討論了。物聯(lián)網(wǎng)平臺(tái)最寶貴的就是數(shù)據(jù),如何利用這些數(shù)據(jù),這就是業(yè)務(wù)應(yīng)用的事情了。
六、業(yè)務(wù)應(yīng)用開(kāi)發(fā)
所謂的業(yè)務(wù)應(yīng)用,簡(jiǎn)單來(lái)說(shuō),就是通過(guò)調(diào)用物聯(lián)網(wǎng)平臺(tái)提供的 API,實(shí)現(xiàn)設(shè)備管理、數(shù)據(jù)上報(bào)、命令下發(fā)等業(yè)務(wù)場(chǎng)景。設(shè)備管理是在設(shè)備接入基礎(chǔ)上,提供了更豐富完備的設(shè)備管理能力,簡(jiǎn)化海量設(shè)備管理復(fù)雜性,提升管理效率。從物聯(lián)網(wǎng)平臺(tái)的設(shè)備和數(shù)據(jù)中,可以衍生出各種不同的業(yè)務(wù)應(yīng)用場(chǎng)景,這就要根據(jù)實(shí)際的系統(tǒng)功能來(lái)進(jìn)行按需開(kāi)發(fā)了。
七、物聯(lián)網(wǎng)云服務(wù)
對(duì)于硬件團(tuán)隊(duì)來(lái)說(shuō),直接使用云服務(wù)是一種更簡(jiǎn)單、快速的搭建物聯(lián)網(wǎng)系統(tǒng)的方法。而使用物聯(lián)網(wǎng)云服務(wù),就意味著:我們可以直接上硬件層的傳感器數(shù)據(jù),并在應(yīng)用層獲取、分析這些數(shù)據(jù)。這一類(lèi)的服務(wù),比較成熟的有 AWS IoT Things、Azure IoT 等。
AWS IoT Things 參考架構(gòu)
基于 AWS IoT Things,我們只需要在云端,定義好對(duì)應(yīng)的數(shù)據(jù)處理規(guī)則,便可以在硬件端直接對(duì)接服務(wù)。不過(guò)值得注意的是,單一的云服務(wù)無(wú)法提供復(fù)雜的功能,這個(gè)時(shí)候就需要一些搭配額外的服務(wù)。
7.1、Serverless
Serverless架構(gòu)是云服務(wù)的一種,但是它在可編程與云服務(wù)之間做了一個(gè)折中。它是一種基于互聯(lián)網(wǎng)的技術(shù)架構(gòu)理念,應(yīng)用邏輯并非全部在服務(wù)端實(shí)現(xiàn),而是采用 FaaS(Function as a Service)架構(gòu),通過(guò)功能組合來(lái)實(shí)現(xiàn)應(yīng)用程序邏輯。
Serverless 物聯(lián)網(wǎng)參考架構(gòu)
從理論上來(lái)講,這些服務(wù)提供的是一層 API 封裝,它不會(huì)限制我們所使用的語(yǔ)言。使用 Serverless 服務(wù),我們可以具備更好的快速開(kāi)發(fā)能力,并且能使用同一種語(yǔ)言(JavaScript)來(lái)完成編程。
在這個(gè)過(guò)程中,開(kāi)發(fā)者要所做的便是:在不同的服務(wù)之間傳輸數(shù)據(jù),每一次都只處理下一個(gè)服務(wù)所需要的數(shù)據(jù),類(lèi)似于 Pipe and Filters 架構(gòu)模式。如一個(gè)典型的物聯(lián)網(wǎng)應(yīng)用的數(shù)據(jù)傳輸過(guò)程中是這樣的:
對(duì)設(shè)備進(jìn)行鑒權(quán);
轉(zhuǎn)換、存儲(chǔ)設(shè)備的數(shù)據(jù);
廣播通知其他監(jiān)聽(tīng)此設(shè)備數(shù)據(jù)的服務(wù);
后臺(tái)查詢數(shù)據(jù);
分析數(shù)據(jù)(AI);
可視化數(shù)據(jù)。
只需要少量的編程,我們就可以完成服務(wù)端的開(kāi)發(fā)。隨后,專(zhuān)注于硬件層的開(kāi)發(fā),以及應(yīng)用層的業(yè)務(wù)功能。


