国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

  • 正文
    • 1、Ctrl Mode
    • 2、Auto Report Mode
  • 相關推薦
申請入駐 產業(yè)圖譜

嵌入式軟件設計之美-以實際項目應用MVC框架與狀態(tài)模式(下)

01/05 13:57 來源:嵌入式應用研究院
560
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

上節(jié)我們分享了MVC框架、狀態(tài)模式組合在實際開發(fā)中的應用,它能夠讓我們的軟件設計流程更加的清晰、易于維護:嵌入式軟件設計之美-以實際項目應用MVC框架與狀態(tài)模式(上)

那么這一節(jié)我們就直接開門見山,從接下來的這個開源項目分享開始:

項目開源倉庫:

https://github.com/Yangyuanxin/IotSensorDetect

項目獲取方法:

git?close?https://github.com/Yangyuanxin/IotSensorDetect

該項目會不斷的添加新的示例來持續(xù)完善。

這是一個基于MVC模式+狀態(tài)設計模式的物聯(lián)網(wǎng)氣體檢測開源項目,目前的整體軟件通信框架圖(后續(xù)會根據(jù)需求繼續(xù)拓展)如下所示:

如上軟件通信框架圖所示,騰訊連連小程序 & 騰訊云IoT Explorer物聯(lián)網(wǎng)平臺相對于設備端來說是上位機,而下位機部分則是由四個主要的任務來協(xié)作完成的,分別是ControllerTask、IotRecvTask、ModelHnadlerControolerTask以及ModelSensorHandlerTask,而Task與Task之間的通信方式是基于消息隊列的形式來實現(xiàn)的。采用消息隊列通訊是一種軟件設計解耦的實現(xiàn)方式,線程與線程之間通過消息隊列通信,能夠實現(xiàn)業(yè)務隔離,讓整個系統(tǒng)的可拓展性大大提高。除此之外,采用消息隊列的好處是能夠攜帶數(shù)據(jù)載體,數(shù)據(jù)格式也可以由用戶自定義。例如本開源項目的自定義消息結構體如下:

struct?Msg_t
{
??uint8_t?Type;?????????//消息類型
??uint32_t?SensorValue;?//傳感器數(shù)值
??char?Data[MSG_LEN];???//其它可能的數(shù)據(jù)承載
};

其中,軟件通信時序分為兩種模式:

1、Ctrl Mode

該模式由APP端發(fā)起,對于APP端來說,APP端可以下發(fā)三種命令,分別是檢測、停止、返回,如下圖所示:

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

在程序中,該狀態(tài)流程圖是通過一個結構體數(shù)組來定義的:

SensorStateItem_t?SensorStateTable[]?=
{
????{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來實現(xiàn)的:

__IO?SensorState_t?CurState?=?IDLE;??//當前狀態(tài)
__IO?SensorState_t?PrevState?=?IDLE;?//上一個狀態(tài)

SensorStateItem_t?*FindCurStateAndEvent(SensorState_t?CurState,?SensorEvent_t?Event)
{
????int?Index?=?0;
????//查狀態(tài)表
????for(Index?=?0;?Index?<?NR_MODEL(SensorStateTable);?Index++)
????{
????????if(SensorStateTable[Index].CurState?==?CurState?
????????????????&&?SensorStateTable[Index].Event?==?Event)??
????????????return?&SensorStateTable[Index];
????}

????return?NULL;
}
//執(zhí)行狀態(tài)機
int?DoSensorStatus(SensorEvent_t?Event)
{
????int?Ret?=?1;
????SensorStateItem_t?*Item;
????//根據(jù)當前的狀態(tài)、事件找到狀態(tài)表中的那一項,取到那一項的地址
????Item?=?FindCurStateAndEvent(CurState,?Event);

????if?(!Item)
????????return?0;
????//保存上一個狀態(tài)
????PrevState?=?CurState;
????//切換到下一個狀態(tài)
????CurState?=?Item->NextSate;
????return?Ret;
};

2、Auto Report Mode

該模式是由設備端主動定時上報給到APP端,如下圖所示:

檢測設備在沒有啟動檢測功能時,設備端也會定時上報傳感器數(shù)值以及設備狀態(tài);因此,Iot端能夠定時看到數(shù)據(jù)在不斷發(fā)生變化。

以上便是MCV框架與狀態(tài)模式最簡單的應用了。當然,從上節(jié)我們就已經(jīng)知道,對于ControllerView而言,它的體現(xiàn)形式可以有很多種,它不局限于僅僅是Iot的形式,它也可以是由其它模塊來構成;這部分待后續(xù)項目更新后上傳。

參考資料

[1]https://www.runoob.com/design-pattern/mvc-pattern.html

[2]https://refactoringguru.cn/design-patterns/state

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本科畢業(yè)于華南理工大學,現(xiàn)美國卡羅爾工商管理碩士研究生在讀,曾就職于世界名企偉易達、聯(lián)發(fā)科技等,多年嵌入式產品開發(fā)經(jīng)驗,在智能玩具、安防產品、平板電腦、手機開發(fā)有豐富的實戰(zhàn)開發(fā)經(jīng)驗,現(xiàn)任深圳市云之手科技有限公司副總經(jīng)理、研發(fā)總工程師。

申扎县| 花莲市| 怀化市| 宕昌县| 城口县| 恭城| 新沂市| 定南县| 桃园县| 大冶市| 福鼎市| 馆陶县| 马公市| 教育| 洪江市| 扶沟县| 乐安县| 南充市| 教育| 三门县| 开平市| 北流市| 山丹县| 河南省| 苗栗市| 平阳县| 信丰县| 高阳县| 南安市| 定结县| 沭阳县| 台山市| 吉隆县| 昭平县| 崇阳县| 宣武区| 老河口市| 淮滨县| 连山| 榆中县| 南宁市|