嵌入式软件设计之美-以实际项目应用MVC框架与状态模式(下)_嵌入式linux mvc架构-程序员宅基地

技术标签: 嵌入式软件框架设计  嵌入式  

上节我们分享了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框架与状态模式最简单的应用了。当然,从上节我们就已经知道,对于Controller和View而言,它的体现形式可以有很多种,它不局限于仅仅是Iot的形式,它也可以是由其它模块来构成;这部分待后续项目更新后上传。

参考资料
[1]https://www.runoob.com/design-pattern/mvc-pattern.html
[2]https://refactoringguru.cn/design-patterns/state

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/morixinguan/article/details/127972451

智能推荐

Vue+ElementUI 弹窗的表格中(第一列是选择框),在修改弹窗时,需要回显并勾选中在新增时已选择的表格数据。_el-table弹窗将已选择回显-程序员宅基地

文章浏览阅读927次,点赞18次,收藏11次。有时候他是个对象,在对象里找,可能会找到$children,这个$children是个数组,里面的第一项里有toggleRowSelection属性,所以这种情况下可以改成(这种情况一般都是因为各个公司基于el-table进行了二次封装导致的,所以得在里面慢慢找)注意:row只能是表格的data属性指定的数组中的数据,放其它数组中数据是无效的。(3)在打开弹窗时,需要先让弹窗的visible变为true,再调获取表格数据的接口。(1)row:表格的行数据,选中/取消选中哪行,就是哪行的数据。_el-table弹窗将已选择回显

快速了解eBay被封号的原因以及卖家申诉的方法!_ebay 封号-程序员宅基地

文章浏览阅读308次,点赞5次,收藏8次。MuLogin让每个eBay账号的登录环境都是真实且自然的,并且每个eBay账号独立运行,有完全独立的cookie、浏览器、IP地址等,互相安全隔离。另外,当我们的一个eBay账号被封,新注册eBay账号更容易存活,不会产生账号关联和IP关联问题,从源头上抑制问题产生。不要害怕联系 eBay,找出你的账户被封的原因,表明你明白错在哪里,并愿意遵守规则,根据平台要求进行整改。2. 在创建 eBay 账户时,确保你的所有信息都正确无误,而且你的银行信息、付款方式也是最新的。_ebay 封号

使用Qt制作简易的图片查看器_qt 实现图片工具-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏15次。实现图片浏览器用到的知识,包括窗口部件、布局、事件、对象模型与容器类、图形视图、模型/视图编程以及多线程等。大致流程为:首先定义一个图片类,该类包含图片的路径、文件名、文件id以及获取这些变量的函数。然后定义了一个图片数组类,主要包含添加图像以及获取所有图像以及新加入图像的函数。最后通过将图片名字加入到界面左侧QDockWidget部件中的QTreeView中,通过线程将图片的预览加入界面下侧的窗口部件中。最后通过双击可查看完整图片,以及通过滚轮和鼠标等事件来对图片进行一些操作。_qt 实现图片工具

网站合理使用CDN加速,让你的网站速度飞起来!_cdn加速能提高多少-程序员宅基地

文章浏览阅读525次。CDN加速目前为止是网站加速的标准配置了,同样有用户认为套了CDN网站打开速度就完全解决了,实际上并没有这么简单,需要根据我们网站本身特点去深入分析网站速度的难题在什么地方,才可以对症下药,网站加速的方式方法和手段各种各样,我们需要精确分析问题去处理每个难题。碰到一个打开相对来说有点慢的网站,加速前后左右效果明显,从以前的100s提速的3-4s。1、该网站的难题关键在于网站首页文件尺寸十分的大,约20M,全部都是大尺寸图片。2、外链请求相对比较少。3、服务器按固定带宽计费,服务器的带宽比较有限。_cdn加速能提高多少

计算机鼠标怎么设置在哪里,电脑鼠标灵敏度怎么调,在哪里调?这份设置教程收好了非常简单(各系统通用)...-程序员宅基地

文章浏览阅读2.6k次。在日常使用鼠标的过程中我们经常会感觉到鼠标有点飘,比如鼠标轻轻一动,箭头就移动了好长的距离,而且定位并不精准。在日常使用鼠标的过程中我们经常会感觉到鼠标有点飘,比如鼠标轻轻一动,箭头就移动了好长的距离,而且定位并不精准。还有一种经常出现的情况便是明明已经在鼠标垫上移动了很长一段距离,但是在显示器中移动的距离却不大,好像鼠标拖拽不动一样。为何会有这种现象发生呢?其实一切都是鼠标灵敏度的锅。鼠标灵敏度..._鼠标设置在哪里调整

Python项目:爬取智联招聘网站的数据分析职位信息并进行可视化分析_对于爬取的薪资进行可视化分析-程序员宅基地

文章浏览阅读3w次,点赞85次,收藏783次。Python项目:爬取智联招聘网站的数据分析职位信息并进行可视化分析1.项目说明以及流程概要爬取网站:智联招聘(https://sou.zhaopin.com/)开发环境:Python3.7(Pycharm编辑器),全流程通过代码实现爬取时间:2021/3/30 上午1:13 的实时招聘信息数据爬取城市:共12个,上海、北京、广州、深圳、天津、武汉、西安、成都、南京、杭州、重庆、厦门主要用到的python库:requests、BeautifulSoup、pandas、mat.._对于爬取的薪资进行可视化分析

随便推点

h5 Table表格-程序员宅基地

文章浏览阅读5.2k次。table:表格tr:行rowspan:占据行数td列 clospan:占据列数th表头(浏览器默认样式粗体居中)caption标题(浏览器默认样式居中)_h5 table

运维人员必须熟悉的运维工具汇总_运维需要学哪些工具-程序员宅基地

文章浏览阅读1.7w次,点赞9次,收藏55次。运维人员必须熟悉的运维工具汇总操作系统:Centos,※,Ubuntu,Redhat※,,suse,Freebsd网站服务:nginx※,,apache※,,lighttpd,php※,,tomcat※,,resin※,数据 库:MySQL※,,MariaDB,PostgreSQL,Mysql-proxyDB中间件:maxscale,MyCat,atlas,cobar,amoe..._运维需要学哪些工具

iframe 实现内部页面返回上一级_iframe返回上一页-程序员宅基地

文章浏览阅读2w次。1.问题所在后台采用iframe的方式去写的 当用户点击浏览器的返回上一级就会让页面回到登录页面。2.想要实现效果当用户点击上一级的时候只会让iframe里面的内容去返回上一级而不是整个iframe返回3解决问题方案3.1第一种解决方案首先我想到的是给代码加一个返回上一级按钮轻松实现代码如下&lt;span onclick="back()"&gt;返回上一级&..._iframe返回上一页

如何看待鸿蒙应用开发框架采用JavaScript作为开发语言?-程序员宅基地

文章浏览阅读9.1k次。喜闻乐见,其实使用 JavaScript 作为应用开发语言并不是第一家,比如 JerryScript 就是为了三星自家的 IoT 手表开发的,国产 RT Thread 也用了 JS 做 ..._鸿蒙开发语言最好的是java吗

kohana 框架简单小结_kohana框架-程序员宅基地

文章浏览阅读1.7k次。kohana 框架是一个相对比较小众的php框架 ,是有一个开源组织开发的mvc框架。(1)Controller 篇1.接受参数$this -> request -> param('key') 返回的是route路由里定义的参数Arr :: get($_GET, 'key') 获取的是GET作用于里key对应的值2. 重定向$this -> requ_kohana框架

智谱AI发布新一代基座大模型GLM-4;机器学习书籍推荐_glm书籍-程序员宅基地

文章浏览阅读1.1k次,点赞23次,收藏17次。智谱AI发布了全新的基座大模型GLM-4,性能可比GPT-4,拥有超强的中文能力和长文本处理能力。GLM-4的全面跃升在综合能力上提升了60%,支持更长的上下文,具备更强的多模态功能,支持更快的推理,更多并发,推理成本大大降低。智谱AI还发布了定制化的个人GLM大模型GLMs和GLM Store,实现了全家桶能力,让模型自主根据用户意图,自动理解、规划复杂指令,自由调用多种能力,从而完成更加复杂的任务。_glm书籍