徐獻(xiàn)圣 張震
摘要:針對(duì)基于OpenCPU的NB-IoT模塊上作為兼任主處理器和數(shù)據(jù)傳輸功能時(shí)具有的內(nèi)存壓力,該文設(shè)計(jì)一種嵌入式腳本Lua腳本語(yǔ)言實(shí)現(xiàn)NB-IoT模塊的內(nèi)存優(yōu)化方案。通過(guò)該方案,利用Lua腳本語(yǔ)言中自動(dòng)內(nèi)存管理和增量垃圾回收的特點(diǎn)彌補(bǔ)C語(yǔ)言的短板,從而優(yōu)化內(nèi)存空間,節(jié)省NB-IoT模塊資源的消耗,降低功耗。
關(guān)鍵詞:OpenCPU;嵌入式腳本;Lua;NB-IoT模塊;內(nèi)存;優(yōu)化
中圖分類(lèi)號(hào):TP393.409? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)25-0051-02
為了適應(yīng)物聯(lián)網(wǎng)的發(fā)展,滿(mǎn)足更多的應(yīng)用場(chǎng)景和市場(chǎng)需求,傳感網(wǎng)中誕生了一批適合物與物之間遠(yuǎn)距離通信的無(wú)線(xiàn)通信技術(shù),統(tǒng)稱(chēng)為低功耗廣域網(wǎng),即LPWAN。NB-IoT是一種工作于授權(quán)頻譜下的LPWAN,其具有廣覆蓋、低功耗、低成本、大連接等多個(gè)優(yōu)點(diǎn),深受?chē)?guó)內(nèi)物聯(lián)網(wǎng)企業(yè)的青睞。在傳統(tǒng)方案中,往往會(huì)將NB-IoT外接至MCU。這種方式主要由MCU接收傳感器采集的數(shù)據(jù),再通過(guò)UART方式將數(shù)據(jù)傳至NB-IoT模組,最后上傳至云平臺(tái)[1-2]。肖磊[3]提出將OpenCPU應(yīng)用到NB-IoT模組上,讓NB-IoT模塊本身成為處理器,這樣用戶(hù)能夠在NB-IoT模塊上同時(shí)實(shí)現(xiàn)數(shù)據(jù)采集和數(shù)據(jù)上云,降低了MCU成本,節(jié)省了MCU功耗,提高了系統(tǒng)的穩(wěn)定性和數(shù)據(jù)上傳的實(shí)時(shí)效率。但是,由于處理器功能的轉(zhuǎn)移,是以犧牲NB-IoT模組的內(nèi)部資源作為代價(jià),影響自身的運(yùn)行效率。
針對(duì)此類(lèi)問(wèn)題,本文提出一種基于Lua腳本語(yǔ)言實(shí)現(xiàn)內(nèi)置中移M5311模組的LM-NB-M-01模塊通信的解決方案,以TCP協(xié)議傳輸作為使用案例。此方案將外圍設(shè)備數(shù)據(jù)獲取和TCP通信任務(wù)都交由Lua虛擬機(jī)處理,根據(jù)獲取的數(shù)據(jù),決定是否調(diào)用啟動(dòng)關(guān)于TCP通信任務(wù)的Lua腳本,由此節(jié)省NB-IoT模組資源的消耗,提升運(yùn)行效率。
1 Lua腳本語(yǔ)言簡(jiǎn)介
Lua[4-6]是一種遵循標(biāo)準(zhǔn)C寫(xiě)成的輕量級(jí)嵌入式腳本語(yǔ)言,其具有擴(kuò)展性好、簡(jiǎn)單小巧、與平臺(tái)無(wú)關(guān)的特點(diǎn)。Lua提供了易于使用的擴(kuò)展接口和機(jī)制,尤其是當(dāng)C/C++作為其宿主語(yǔ)言時(shí),它們之間很容易完成交互,如同本身就是內(nèi)置的功能一樣,因此Lua非常方便移植到基于C語(yǔ)言的OpenCPU中使用,不會(huì)引起硬件增大消耗的額問(wèn)題?;贚ua實(shí)現(xiàn)TCP協(xié)議傳輸?shù)腘B-IoT通信方案,主要依靠Lua的下列特點(diǎn)。
(1)Lua是動(dòng)態(tài)類(lèi)型語(yǔ)言,即其變量沒(méi)有預(yù)定義的類(lèi)型,值才有類(lèi)型,并且函數(shù)也可以看成是一個(gè)值。Lua還提供了一種通用類(lèi)型的表,用它可以實(shí)現(xiàn)數(shù)組,哈希表,集合。這些特點(diǎn)使得Lua除了支持面向過(guò)程編程和函數(shù)式編程,還支持面向?qū)ο缶幊蹋瑥浹a(bǔ)了C語(yǔ)言在設(shè)計(jì)上的短板。
(2)Lua簡(jiǎn)單小巧,Lua5.3.4發(fā)行版所有標(biāo)準(zhǔn)庫(kù)加起來(lái)只有640kb大小,編譯后僅一百余K,能夠有效節(jié)省系統(tǒng)內(nèi)部資源。
(3)Lua具有自動(dòng)內(nèi)存管理和增量垃圾回收功能。設(shè)計(jì)者不需要擔(dān)心如何管理資源,只需要分配內(nèi)存,同時(shí)這個(gè)內(nèi)存由Lua管理。當(dāng)程序不需要某個(gè)對(duì)象時(shí),Lua會(huì)自動(dòng)刪除這個(gè)失效的對(duì)象,節(jié)省系統(tǒng)內(nèi)部資源。
(4)Lua提供的協(xié)同進(jìn)程機(jī)制使得Lua腳本作為獨(dú)立線(xiàn)程,與主程序和其他線(xiàn)程互不影響地同時(shí)工作,提升程序的運(yùn)行效率。
2 設(shè)計(jì)方案介紹
本方案圍繞基于中移M5311 NB-IoT模組的LM-NB-M-01模塊與私有云平臺(tái)實(shí)現(xiàn)TCP通信來(lái)進(jìn)行設(shè)計(jì),系統(tǒng)設(shè)計(jì)方案框架如圖1所示,系統(tǒng)運(yùn)行流程圖如圖2所示。
啟動(dòng)LM-NB-M-01模塊,主程序建立OpenCPU任務(wù),等待注冊(cè)網(wǎng)絡(luò)。網(wǎng)絡(luò)在線(xiàn)后,外圍傳感器設(shè)備開(kāi)始將感知到的數(shù)據(jù)通過(guò)外設(shè)接口傳入至LM-NB-M-01模塊中,接著主程序?qū)?shù)據(jù)進(jìn)行處理,判斷是否需要將數(shù)據(jù)傳上云平臺(tái)。例如數(shù)據(jù)在所設(shè)閾值范圍內(nèi),不向云平臺(tái)執(zhí)行發(fā)送行為。這種情況在監(jiān)測(cè)系統(tǒng)[7]尤為常見(jiàn)。當(dāng)終端模塊判斷數(shù)據(jù)超過(guò)閾值時(shí),需要發(fā)送報(bào)警信號(hào)給云平臺(tái),此時(shí)創(chuàng)建Lua虛擬機(jī),將編寫(xiě)的TCP通信的C函數(shù)注冊(cè)到Lua虛擬機(jī)中,然后讀取Flash文件中獨(dú)立于C程序的Lua腳本文件,完成TCP任務(wù)。之后關(guān)閉虛擬機(jī),依靠Lua本身特點(diǎn)自動(dòng)收集垃圾并清理內(nèi)存,節(jié)省內(nèi)存資源。
私有云服務(wù)器的設(shè)計(jì),采用IOCP高并發(fā)架構(gòu)設(shè)計(jì),通過(guò)花生殼內(nèi)網(wǎng)穿透軟件,實(shí)現(xiàn)云服務(wù)器與私有內(nèi)網(wǎng)服務(wù)器建立連接,同時(shí)把內(nèi)網(wǎng)端口映射到云端。
3設(shè)計(jì)方案介紹
為了節(jié)省系統(tǒng)內(nèi)部資源和提升程序的運(yùn)行效率,本設(shè)計(jì)重點(diǎn)不在如何實(shí)現(xiàn)獲取或處理傳感器數(shù)據(jù),而是著重于采用Lua與C語(yǔ)言混合編程的方案如何實(shí)現(xiàn)NB-IoT基于TCP協(xié)議的傳輸。具體步驟如下。
(1)將Lua移植到LM-NB-M-01模塊的OpenCPU環(huán)境
將Lua5.3.4源碼包中src目錄內(nèi)部除了lua.c與luac.c外的所有.c和.h加入到M5311-OPENCPU_SDK 3.3.0中。由于OpenCPU采用make-clean編譯方式,因此可以使用Visual Studio Code IDE完成此項(xiàng)工作。但要編譯成功,還需要注意將Lua源碼中用到的clock()、remove(filename)以及rename(fromname, toname)函數(shù)刪掉或修改,否則與原來(lái)OpenCPU的源碼有沖突。
(2)建立Lua與C交互環(huán)境
C與Lua之間通過(guò)C API進(jìn)行交互,其關(guān)鍵在于構(gòu)建一個(gè)虛擬的棧,通過(guò)操作棧上的值來(lái)實(shí)現(xiàn)API調(diào)用和C與Lua之間數(shù)據(jù)交換。
①通過(guò)以下格式創(chuàng)建Lua虛擬機(jī)。
lua_State *L = NULL;
L = luaL_newstate();? //創(chuàng)建Lua狀態(tài)機(jī)