前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >嵌入式软件设计之美-以实际项目应用MVC框架与状态模式(下)

嵌入式软件设计之美-以实际项目应用MVC框架与状态模式(下)

作者头像
杨源鑫
发布2022-11-28 14:14:28
5210
发布2022-11-28 14:14:28
举报
文章被收录于专栏:嵌入式开发圈嵌入式开发圈

来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 上节我们分享了MVC框架、状态模式组合在实际开发中的应用,它能够让我们的软件设计流程更加的清晰、易于维护: 嵌入式软件设计之美-以实际项目应用MVC框架与状态模式(上) 那么这一节我们就直接开门见山,从接下来的这个开源项目分享开始: 项目开源仓库: https://github.com/Yangyuanxin/IotSensorDetect 项目获取方法: git close https://github.com/Yangyuanxin/IotSensorDetect 该项目会不断的添加新的示例来持续完善。 这是一个基于MVC模式+状态设计模式的物联网气体检测开源项目,目前的整体软件通信框架图(后续会根据需求继续拓展)如下所示:

如上软件通信框架图所示,腾讯连连小程序 & 腾讯云IoT Explorer物联网平台相对于设备端来说是上位机,而下位机部分则是由四个主要的任务来协作完成的,分别是ControllerTask、IotRecvTask、ModelHnadlerControolerTask以及ModelSensorHandlerTask,而Task与Task之间的通信方式是基于消息队列的形式来实现的。采用消息队列通讯是一种软件设计解耦的实现方式,线程与线程之间通过消息队列通信,能够实现业务隔离,让整个系统的可拓展性大大提高。除此之外,采用消息队列的好处是能够携带数据载体,数据格式也可以由用户自定义。例如本开源项目的自定义消息结构体如下: struct Msg_t { uint8_t Type; //消息类型 uint32_t SensorValue; //传感器数值 char Data[MSG_LEN]; //其它可能的数据承载 }; 其中,软件通信时序分为两种模式:

  • 1、Ctrl Mode

该模式由APP端发起,对于APP端来说,APP端可以下发三种命令,分别是检测、停止、返回,如下图所示:

当用户在APP端按下检测时,APP端会下发START命令,当Controller接收到Iot端下发的指令时会将其转发给Model模块来控制传感器进行检测,期间检测过程中的设备状态以及传感器数值会进行更新,检测过程也可以通过下发停止来打断;而返回则是根据当前的设备状态来返回到上一个检测状态;这一切是通过状态模式来维护的,其状态流程图如下:

在程序中,该状态流程图是通过一个结构体数组来定义的: 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 }; 切换状态的过程是由DoSensorStatus来实现的: __IO SensorState_t CurState = IDLE; //当前状态 __IO SensorState_t PrevState = IDLE; //上一个状态 SensorStateItem_t *FindCurStateAndEvent(SensorState_t CurState, SensorEvent_t Event) { int Index = 0; //查状态表 for(Index = 0; Index < NR_MODEL(SensorStateTable); Index++) { if(SensorStateTable[Index].CurState == CurState \ && SensorStateTable[Index].Event == Event) \ return &SensorStateTable[Index]; } return NULL; } //执行状态机 int DoSensorStatus(SensorEvent_t Event) { int Ret = 1; SensorStateItem_t *Item; //根据当前的状态、事件找到状态表中的那一项,取到那一项的地址 Item = FindCurStateAndEvent(CurState, Event); if (!Item) return 0; //保存上一个状态 PrevState = CurState; //切换到下一个状态 CurState = Item->NextSate; return Ret; };

  • 2、Auto Report Mode

该模式是由设备端主动定时上报给到APP端,如下图所示:

检测设备在没有启动检测功能时,设备端也会定时上报传感器数值以及设备状态;因此,Iot端能够定时看到数据在不断发生变化。 以上便是MCV框架与状态模式最简单的应用了。当然,从上节我们就已经知道,对于ControllerView而言,它的体现形式可以有很多种,它不局限于仅仅是Iot的形式,它也可以是由其它模块来构成;这部分待后续项目更新后上传。

参考资料

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式应用研究院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档