上節(jié)我們分享了MVC框架、狀態(tài)模式組合在實(shí)際開發(fā)中的應(yīng)用,它能夠讓我們的軟件設(shè)計(jì)流程更加的清晰、易于維護(hù):
嵌入式軟件設(shè)計(jì)之美-以實(shí)際項(xiàng)目應(yīng)用MVC框架與狀態(tài)模式(上)
那么這一節(jié)我們就直接開門見山,從接下來的這個(gè)開源項(xiàng)目分享開始:
項(xiàng)目開源倉庫:
https://github.com/Yangyuanxin/IotSensorDetect
項(xiàng)目獲取方法:
gitclosehttps://github.com/Yangyuanxin/IotSensorDetect
該項(xiàng)目會(huì)不斷的添加新的示例來持續(xù)完善。
這是一個(gè)基于MVC模式+狀態(tài)設(shè)計(jì)模式的物聯(lián)網(wǎng)氣體檢測(cè)開源項(xiàng)目,目前的整體軟件通信框架圖(后續(xù)會(huì)根據(jù)繼續(xù)拓展)如下所示:

如上軟件通信框架圖所示,騰訊連連小程序 & 騰訊云IoT Explorer物聯(lián)網(wǎng)平臺(tái)相對(duì)于設(shè)備端來說是上位機(jī),而下位機(jī)部分則是由四個(gè)主要的任務(wù)來協(xié)作完成的,分別是ControllerTask、IotRecvTask、ModelHnadlerControolerTask以及ModelSensorHandlerTask,而Task與Task之間的通信方式是基于消息隊(duì)列的形式來實(shí)現(xiàn)的。采用消息隊(duì)列通訊是一種軟件設(shè)計(jì)解耦的實(shí)現(xiàn)方式,線程與線程之間通過消息隊(duì)列通信,能夠?qū)崿F(xiàn)業(yè)務(wù)隔離,讓整個(gè)系統(tǒng)的可拓展性大大提高。除此之外,采用消息隊(duì)列的好處是能夠攜帶數(shù)據(jù)載體,數(shù)據(jù)格式也可以由用戶自定義。例如本開源項(xiàng)目的自定義消息結(jié)構(gòu)體如下:
structMsg_t
{
uint8_tType;//消息類型
uint32_tSensorValue;//傳感器數(shù)值
charData[MSG_LEN];//其它可能的數(shù)據(jù)承載
};
其中,軟件通信時(shí)序分為兩種模式:
1、Ctrl Mode
該模式由APP端發(fā)起,對(duì)于APP端來說,APP端可以下發(fā)三種命令,分別是檢測(cè)、停止、返回,如下圖所示:

當(dāng)用戶在APP端按下檢測(cè)時(shí),APP端會(huì)下發(fā)START命令,當(dāng)Controller接收到Iot端下發(fā)的指令時(shí)會(huì)將其轉(zhuǎn)發(fā)給Model模塊來控制傳感器進(jìn)行檢測(cè),期間檢測(cè)過程中的設(shè)備狀態(tài)以及傳感器數(shù)值會(huì)進(jìn)行更新,檢測(cè)過程也可以通過下發(fā)停止來打斷;而返回則是根據(jù)當(dāng)前的設(shè)備狀態(tài)來返回到上一個(gè)檢測(cè)狀態(tài);這一切是通過狀態(tài)模式來維護(hù)的,其狀態(tài)流程圖如下:

在程序中,該狀態(tài)流程圖是通過一個(gè)結(jié)構(gòu)體數(shù)組來定義的:
SensorStateItem_tSensorStateTable[]= { {IDLE,START,CALI},//IDLE->START->CALI {CALI,NEXT,DETECT},//CALI->NEXT->DETECT {CALI,STOP,IDLE},//CALI->STOP->IDLE {DETECT,NEXT,RESULT},//DETECT->NEXT->RESULT {DETECT,PREV,CALI},//DETECT->PREV->CALI {DETECT,STOP,IDLE},//DETECT->STOP->IDLE {RESULT,PREV,DETECT},//RESULT->PREV->DETECT {RESULT,STOP,IDLE},//RESULT->STOP->IDLE };
切換狀態(tài)的過程是由DoSensorStatus來實(shí)現(xiàn)的:
__IOSensorState_tCurState=IDLE;//當(dāng)前狀態(tài) __IOSensorState_tPrevState=IDLE;//上一個(gè)狀態(tài) SensorStateItem_t*FindCurStateAndEvent(SensorState_tCurState,SensorEvent_tEvent) { intIndex=0; //查狀態(tài)表 for(Index=0;IndexNextSate; returnRet; };
2、Auto Report Mode
該模式是由設(shè)備端主動(dòng)定時(shí)上報(bào)給到APP端,如下圖所示:

檢測(cè)設(shè)備在沒有啟動(dòng)檢測(cè)功能時(shí),設(shè)備端也會(huì)定時(shí)上報(bào)傳感器數(shù)值以及設(shè)備狀態(tài);因此,Iot端能夠定時(shí)看到數(shù)據(jù)在不斷發(fā)生變化。
以上便是MCV框架與狀態(tài)模式最簡單的應(yīng)用了。當(dāng)然,從上節(jié)我們就已經(jīng)知道,對(duì)于Controller和View而言,它的體現(xiàn)形式可以有很多種,它不局限于僅僅是Iot的形式,它也可以是由其它模塊來構(gòu)成;這部分待后續(xù)項(xiàng)目更新后上傳。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5199文章
20451瀏覽量
334212 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2945文章
47825瀏覽量
415186 -
MVC
+關(guān)注
關(guān)注
0文章
73瀏覽量
14439
原文標(biāo)題:嵌入式軟件設(shè)計(jì)之美-以實(shí)際項(xiàng)目應(yīng)用MVC框架與狀態(tài)模式(下)
文章出處:【微信號(hào):嵌入式應(yīng)用研究院,微信公眾號(hào):嵌入式應(yīng)用研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
氣體檢測(cè)儀常用的傳感器
基于MVC模式的WEB應(yīng)用框架
MVC模式在教學(xué)考評(píng)系統(tǒng)中的應(yīng)用
基于遙測(cè)的移動(dòng)艙室內(nèi)氣體檢測(cè)方法
基于MVC模式的地圖控件的設(shè)計(jì)
mvc模式的優(yōu)缺點(diǎn)
NDIR氣體檢測(cè)器解決方案和PID氣體檢測(cè)器解決方案
基于MVC模式+狀態(tài)設(shè)計(jì)模式的物聯(lián)網(wǎng)氣體檢測(cè)開源項(xiàng)目
評(píng)論