不管是從商業(yè)模式導(dǎo)出的業(yè)務(wù)模型,還是從技術(shù)發(fā)展的角度看,文本都傾向于將物聯(lián)網(wǎng)技術(shù)構(gòu)架看作是互聯(lián)網(wǎng)技術(shù)構(gòu)架的延展。而與這個(gè)觀念對立的,是傳統(tǒng)嵌入式軟件開發(fā)的視角。
簡單來說,目前的互聯(lián)網(wǎng)技術(shù)構(gòu)架主流是大前端與后端兩個(gè)世界:大前端包括Web的JavaScript技術(shù)、Android和iOS技術(shù),著眼于解決用戶交互;后端包括數(shù)據(jù)庫、服務(wù)構(gòu)架、運(yùn)維等,著眼于解決存儲(chǔ)、業(yè)務(wù)邏輯、安全與效率等。當(dāng)然,現(xiàn)在前后端技術(shù)爭相更新,比如業(yè)務(wù)邏輯前置化、微服務(wù)構(gòu)架、JavaScript全棧化等新的解決方案也開始模糊前后端的差異。
而物聯(lián)網(wǎng)設(shè)備端的引入,著實(shí)讓這些技術(shù)有點(diǎn)難以歸類,從業(yè)務(wù)性質(zhì)上物聯(lián)網(wǎng)是另外一種前端或是前端的延伸,比如共享單車應(yīng)用中,自行車端的應(yīng)用顯然是跟人交互的另一個(gè)業(yè)務(wù)場景,也在為后端源源不斷地提供著數(shù)據(jù),但是自行車又不像網(wǎng)頁或者App完全是在解決可視化UI的事情。
而且,現(xiàn)在的設(shè)備端開發(fā)技術(shù)跟前端技術(shù)太不像了,由于目前設(shè)備端的開發(fā)技術(shù)都還偏底層,一般來說計(jì)算資源如處理能力、本地存儲(chǔ)都非常有限,反而像后端一樣要考慮資源效率。
那么,我們只好為物聯(lián)網(wǎng)單獨(dú)命名一個(gè)端,不如我們暫時(shí)就叫它設(shè)備端。
2.新后端
2.1 MQTT
新后端核心問題在于加入了面向設(shè)備的接入服務(wù),實(shí)際上在這里,除類似視頻對講或是安防監(jiān)控的多媒體實(shí)時(shí)通道外,這個(gè)接入服務(wù)已經(jīng)基本事實(shí)化為MQTT。
消息隊(duì)列遙感傳輸協(xié)議是在TCP/IP協(xié)議之上使用的,基于發(fā)布/訂閱的“輕量級(jí)”消息協(xié)議,目前為ISO標(biāo)準(zhǔn)(ISO/IEC PRF 20922)。它被設(shè)計(jì)用于輕量級(jí)和低帶寬的遠(yuǎn)程連接,發(fā)布/訂閱消息傳遞模式需要消息代理,消息代理負(fù)責(zé)根據(jù)消息的主題向需要的端發(fā)布消息。
如果需要連接的設(shè)備沒有超過10萬臺(tái),使用8GB內(nèi)存的云主機(jī)跑Mosquitto就可以;如果設(shè)備量是幾十萬臺(tái),可以考慮Mosquitto做集群負(fù)載均衡;如果設(shè)備量是大幾十萬臺(tái)乃至百萬臺(tái)以上,那你需要專業(yè)的團(tuán)隊(duì)或?qū)iT的投入來維護(hù)這件事情,這個(gè)細(xì)節(jié)就不在本文討論范圍了。
2.2 OTA
固件組件在線升級(jí)是必須要做的事情,MQTT傳大文件不靠譜,所以一般傳過去一個(gè)帶Token的URL,設(shè)備端去下載就好,HTTP或者HTTPS都可以。業(yè)務(wù)比較簡單,設(shè)備端幾十萬以內(nèi)沒有什么特別的地方。
2.3 數(shù)據(jù)存儲(chǔ)與服務(wù)
Mosquitto作為MQTT的引擎,需要后端按照業(yè)務(wù)邏輯去調(diào)用,這里按照業(yè)務(wù)需求寫好后端邏輯即可。在各種后端語言中調(diào)用Mosquitto都非常簡單。
3.設(shè)備端
設(shè)備端是物聯(lián)網(wǎng)領(lǐng)域最五花八門并且正在發(fā)展中的地方。其他領(lǐng)域,后端或者前端,經(jīng)過十幾年的發(fā)展,已經(jīng)出現(xiàn)每個(gè)細(xì)節(jié)的主流技術(shù),基本沒有碎片化的情況,但是在設(shè)備端,開發(fā)技術(shù)的碎片化是應(yīng)用發(fā)展還不到位的充分表現(xiàn)。
舉例講,選用不同的芯片,就要用不同的操作系統(tǒng),不同的C庫封裝,各家IDE也不盡相同,編譯工具鏈更是從芯片原廠給出。開發(fā)起來呢,寄存器、內(nèi)存分配、硬件中斷都要深入進(jìn)去。這就是傳統(tǒng)嵌入式開發(fā)的現(xiàn)狀,也是物聯(lián)網(wǎng)設(shè)備端開發(fā)的現(xiàn)狀。
到目前為止,真正生產(chǎn)環(huán)境中用到的語言就是C/C++,極個(gè)別會(huì)在設(shè)備端用到Python,基本沒有其他語言。操作系統(tǒng)超過50種,主流的也有10種以上,其中嵌入式Linux份額并不大,各種實(shí)時(shí)操作系統(tǒng)各具特色,各有一片天地。
簡單總結(jié)一下相對于物聯(lián)網(wǎng)開發(fā),傳統(tǒng)嵌入式開發(fā)的方式主要有以下幾個(gè)問題:
需要考慮中斷、寄存器、內(nèi)存分配等過于底層的工作;
編譯、燒寫、觀察、借助調(diào)試設(shè)備進(jìn)行調(diào)試的開發(fā)生命周期;
不同SoC和系統(tǒng)的差異過大;
缺乏代碼復(fù)用與開源的習(xí)慣;
開發(fā)者在開發(fā)環(huán)境和固件編譯上花費(fèi)的時(shí)間過多。
所以我們看到設(shè)備端的開發(fā)是基于芯片選型完成的。當(dāng)設(shè)備端產(chǎn)品面臨一個(gè)需求時(shí),現(xiàn)有的流程是判斷產(chǎn)品的各項(xiàng)技術(shù)參數(shù),從而確定一個(gè)芯片,進(jìn)而使用這個(gè)芯片的一整套開發(fā)技術(shù)。這也是早期嵌入式場景使用的芯片自生技術(shù)特性所決定:計(jì)算資源(CPU主頻、存儲(chǔ))、外圍接口、使用溫度、通訊協(xié)議等核心參數(shù)的不同導(dǎo)致芯片碎片化,芯片碎片化導(dǎo)致嵌入式開發(fā)碎片化。
目前這個(gè)領(lǐng)域的大趨勢是:物聯(lián)網(wǎng)芯片有望走向趨同,物聯(lián)網(wǎng)開發(fā)環(huán)境與技術(shù)有望趨同。
3.1 物聯(lián)網(wǎng)芯片
早期由于成本所限,物聯(lián)網(wǎng)領(lǐng)域使用的芯片總是表現(xiàn)得非常缺資源,很難找到一個(gè)各方面(計(jì)算資源、外圍接口、使用溫度、通訊協(xié)議等)都比較合適的芯片去適應(yīng)普遍的場景。隨著半導(dǎo)體門檻逐步降低,中國半導(dǎo)體制造業(yè)逐步成型,芯片資源開始走向富余,其中的代表芯片是MTK的MT7697、MT7688和樂鑫的ESP32。
MT7697主要參數(shù)為:ARM Cortex M4 CPU,帶浮點(diǎn)單元,最大主頻192Mhz,內(nèi)存為256KB SRAM,可配置4MB以上的存儲(chǔ)空間,芯片內(nèi)嵌WiFi和BLE 4.2,有足夠的外圍接口,并能夠適應(yīng)工業(yè)級(jí)的使用溫度。
MT7688主要參數(shù)為:MIPS 580Mhz CPU,內(nèi)存最大支持256MB,可配置16GB級(jí)別的存儲(chǔ)空間,芯片內(nèi)嵌WiFi,接口除模擬接口之外數(shù)字接口豐富,價(jià)格在幾十元人民幣,功耗較高不適于電池長期使用。
但是非常有優(yōu)勢的是其提供的Linux開發(fā)環(huán)境,能夠讓開發(fā)者有一種在普通x86機(jī)器上使用linux CLI的體驗(yàn),Node.js、MySQL、OpenCV、Nginx等等在阿里云上怎么用,在這個(gè)幾十塊的物聯(lián)網(wǎng)小模塊上也怎么用。穩(wěn)定性超強(qiáng),幾年不死機(jī)也是正常的。
ESP32的主要參數(shù)為:Tensilica LX6 CP,主頻240 MHz,內(nèi)存為520KB SRAM,可配置4MB以上的存儲(chǔ)空間,芯片內(nèi)嵌WiFi和藍(lán)牙以及BLE,有足夠的外圍接口,并能夠適應(yīng)工業(yè)級(jí)的使用溫度。
這幾顆芯片共同的特征是計(jì)算資源和通訊能力以及接口資源相對于傳統(tǒng)MCU來說有足夠的富余,并保持在同樣的價(jià)位。因此,在這類芯片上,有足夠的資源做抽象化的封裝和開發(fā)框架實(shí)施。我們看到除了這幾顆芯片原廠提供的傳統(tǒng)嵌入式開發(fā)包之外,社區(qū)和其他廠商已經(jīng)在這幾顆芯片上加快了新開發(fā)技術(shù)的實(shí)現(xiàn)。
3.2 開發(fā)技術(shù)
物聯(lián)網(wǎng)設(shè)備端開發(fā)技術(shù)目前有兩個(gè)比較大的發(fā)展方向,一是統(tǒng)一化的物聯(lián)網(wǎng)操作系統(tǒng),二是統(tǒng)一化的物聯(lián)網(wǎng)開發(fā)框架。他們共同的目的是形成“軟件定義物聯(lián)網(wǎng)”,與傳統(tǒng)從芯片選型開始的,著陸于原廠SDK中完成應(yīng)用開發(fā),與需求和產(chǎn)品設(shè)計(jì)匯合的流程完全相反,希望從需求和產(chǎn)品設(shè)計(jì)入手,通過公開統(tǒng)一的軟件構(gòu)架完成開發(fā),再根據(jù)開發(fā)使用到的資源去落地芯片和外圍設(shè)備。這樣做的好處主要在于提高開發(fā)效率和形成可以復(fù)用的應(yīng)用代碼。
操作系統(tǒng)
雖然市場上存在的設(shè)備端操作系統(tǒng)有數(shù)十種之多,但是我們看到活躍的,明顯向“軟件定義物聯(lián)網(wǎng)”方向發(fā)展的有三家:
Zephyr
Zephyr是Linux基金會(huì)于2016年2月發(fā)布的物聯(lián)網(wǎng)操作系統(tǒng),背后主要的支持力量來自于ARM和Linaro,具有目前嵌入式小型實(shí)時(shí)操作系統(tǒng)的普遍特征,比如:輕量到KB級(jí)的最小系統(tǒng)內(nèi)存占用,支持多種芯片構(gòu)架:從ARM Cortex-M、Intel x86、ARC(DSP 內(nèi)核)、NIOS II(FPGA 軟核)到開源的RISC V等,跟Linux一樣的模塊化內(nèi)核組織方式,如圖2所示。
Zephyr目前已經(jīng)升級(jí)到V1.7版本,逐步向一個(gè)可以用到生產(chǎn)環(huán)境的系統(tǒng)靠攏了。Zephyr最大的特色并不在于其完備性而在于其開發(fā)理念完全來自于“軟件定義物聯(lián)網(wǎng)”,并且有很好的資源支持,在未來應(yīng)該會(huì)有自己的位置。
RTthread
RTthread是純國產(chǎn)的小型操作系統(tǒng),植根于中國的各種使用場景,10年來已經(jīng)確立了自己的地位,在很多行業(yè)有自己的一席之地,目前社區(qū)非常活躍,核心團(tuán)隊(duì)以創(chuàng)業(yè)公司的形式推進(jìn),非常專注。技術(shù)上的特征作為一個(gè)成熟的系統(tǒng),沒有什么可以吐槽的地方。Zephyr有的技術(shù)優(yōu)勢RTT都有,而且RTT在生產(chǎn)環(huán)境的裝機(jī)量較為可觀。
華為LiteOS
華為是全球范圍內(nèi)物聯(lián)網(wǎng)技術(shù)的根源廠商之一,LiteOS是一個(gè)華為內(nèi)部很多產(chǎn)品都在用的系統(tǒng),目前也以開源的形式在全力推廣。LiteOS最大的優(yōu)勢在于華為很多根源技術(shù)將利用LiteOS進(jìn)行輸出,目前最大的例子就是即將全面商用的NB-IoT技術(shù),設(shè)備端的開發(fā)包將會(huì)用LiteOS輸出。
以上幾個(gè)系統(tǒng)一致的特點(diǎn)包括小型化、芯片適應(yīng)范圍廣、通信協(xié)議適配比較廣泛等,他們也都是開源的系統(tǒng),研發(fā)或推動(dòng)力量比較活躍。有可能在物聯(lián)網(wǎng)領(lǐng)域里的類似Linux地位的主流操作系統(tǒng)會(huì)是其中某個(gè),也或許會(huì)一直都存在下去但是在技術(shù)上越來越趨同。
開發(fā)框架
首先解釋一下開發(fā)框架,開發(fā)框架可以小到是一個(gè)細(xì)節(jié)的工具,也可以大到規(guī)定開發(fā)的全部邊界。最典型的例子是Android,純粹操作系統(tǒng)意義上,Android是Linux的一個(gè)分支,但是從App開發(fā)角度,除NDK之外,沒有任何與Linux打交道的地方,所以也把Android叫做操作系統(tǒng)。
再廣泛地看,Android除了面向手機(jī)應(yīng)用的開發(fā)框架,還準(zhǔn)備了Google play這樣的應(yīng)用分發(fā)渠道,這是開發(fā)者生態(tài)建設(shè)。同理,我們看Node.js在后端的種種開發(fā)模式,也是將所有后端資源都封裝到JavaScript里,開發(fā)時(shí)可以隨時(shí)npm install各種包來require,解決了代碼復(fù)用問題。
因此我的觀點(diǎn)是,開發(fā)框架以及背后的代碼復(fù)用和開發(fā)者生態(tài)才是真正的操作系統(tǒng)。
目前在物聯(lián)網(wǎng)領(lǐng)域,正在嘗試向生產(chǎn)環(huán)境演進(jìn)的開發(fā)框架基本都基于JavaScript,而在小型實(shí)時(shí)操作系統(tǒng)上使用的JavaScript runtime目前也基本集中到了JerryScript上。JerryScript是三星開發(fā)和開源的一個(gè)小資源占用的引擎,內(nèi)存需要64KB,存儲(chǔ)需要200KB即可,能夠?qū)崿F(xiàn)完整的事件驅(qū)動(dòng),符合ECMAScript 5.1。
如同前文所說,開發(fā)框架或是操作系統(tǒng)在當(dāng)下需要包括以代碼復(fù)用為目的的開發(fā)者生態(tài),甚至需要包括應(yīng)用分發(fā),所以我們看到在JerryScript的基礎(chǔ)上,有兩家做這類工作的團(tuán)隊(duì)值得關(guān)注:
WRTnode
WRTnode是一個(gè)北京的開源硬件團(tuán)隊(duì),提供從開發(fā)到硬件交付的全流程服務(wù)。他們最近開放的node.system和noyun.io即是著眼于實(shí)現(xiàn)物聯(lián)網(wǎng)JavaScript的開發(fā)框架和開發(fā)者生態(tài)。在WRTnode的實(shí)現(xiàn)里,設(shè)備端的JavaScript開發(fā)已經(jīng)變得像cloud9.io一樣全案在線開發(fā),為開發(fā)者屏蔽了嵌入式開發(fā)的繁瑣編譯燒寫工作。
Ruff
Ruff是位于上海的創(chuàng)業(yè)公司,2015年開始一直在演進(jìn)基于物聯(lián)網(wǎng)設(shè)備端JavaScript的開發(fā)者生態(tài),提供了較為可行的代碼復(fù)用框架。目前他們已經(jīng)開始服務(wù)商業(yè)客戶,為物聯(lián)網(wǎng)應(yīng)用的快速實(shí)現(xiàn)提供了可能。
同時(shí),Zephyr和華為LiteOS也都有各自的JavaScript runtime發(fā)布計(jì)劃。
以上我們看到了設(shè)備端開發(fā)的一些新的發(fā)展,目前這些新的設(shè)備端開發(fā)技術(shù),已經(jīng)逐步面向交付轉(zhuǎn)移了。有理由相信經(jīng)過一段時(shí)間的發(fā)展,面向效率的商業(yè)模式驅(qū)動(dòng)下的物聯(lián)網(wǎng)開發(fā)技術(shù)將迎來一大波更新,從而導(dǎo)向物聯(lián)網(wǎng)應(yīng)用的真正大發(fā)展。
評(píng)論
查看更多