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

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

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

来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 上节我们分享了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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类
在Spring Boot 3中,ServletWebServerFactoryAutoConfiguration 类扮演着至关重要的角色,它负责自动配置内嵌的 Servlet 容器,例如 Tomcat、Jetty 或 Undertow。这种自动配置能力是 Spring Boot 框架的核心特性之一,它极大地简化了 Spring 应用的开发和部署过程。本文将深入探讨ServletWebServerFactoryAutoConfiguration 类的工作原理、配置方式以及如何通过它来定制内嵌Servlet容器。
CoderJia
2024/10/18
1710
重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类
在Spring Boot中使用HTTPS
在本文中,我们将学习在Spring Boot中使用自签名证书配置SSL(HTTPS),并且要在嵌入式Tomcat上启用Spring Boot应用程序的SSL,我们需要学习以下步骤: 1.创建SSL证书:生成自签名证书,或者使用由受信任的证书颁发机构(CA)颁发的证书。 2.在Spring Boot中启用HTTPS:这可以通过Spring Boot 项目中的一些简单配置来完成。 3. 将HTTP重定向到HTTPS :在某些情况下,最好也能从HTTP访问你的应用,将所有HTTP流量重定向到HTTPS端
lyb-geek
2018/08/16
2.9K0
SpringBoot两种方式配置 HTTPS 安全证书
1:确保安装了JDK并正确配置了环境变量; 2:进入你的JAVA_HOME目录中的bin目录; 3:在这个目录下执行
高大北
2022/06/14
1.4K0
Spring Boot 支持 HTTPS 如此简单,So easy!
这里讲的是 Spring Boot 内嵌式 Server 打 jar 包运行的方式,打 WAR 包部署的就不存在要 Spring Boot 支持 HTTPS 了,需要去外部对应的 Server 配置。
Java技术栈
2019/07/15
6610
Spring Boot 支持 HTTPS 如此简单,So easy!
SpringBoot 配置 HTTPS 安全证书的两种方案
来源:https://blog.csdn.net/lhc_makefunny 文章目录 使用JDK自带的工具生成证书 使用FreeSSL提供的证书 使用JDK自带的工具生成证书 1.确保安装了JDK并正确配置了环境变量; 2.进入你的JAVA_HOME目录中的bin目录; 3.在这个目录下执行 //  keytool -genkey -alias (别名) -dname "CN=(姓名),OU=(组织单位名称),O=(组织名称),L=(城市名称),ST=(省),C=(国家)" -storetype (密钥仓
程序猿DD
2022/09/22
1.2K0
SpringBoot 配置 HTTPS 安全证书的两种方案
Springboot配置https,使用腾讯云免费证书
2.2 提交资料,必填证书绑定域名以及申请邮箱,绑定域名填写springboot项目部署的服务器域名
wayn
2021/12/05
14.2K1
Springboot配置https,使用腾讯云免费证书
秒懂HTTPS接口(实现篇)
创建一个接口PersonRepository,后续的控制器直接调用该接口继承自JpaRepository的方法,来实现和数据库交互
高楼Zee
2019/07/17
2.1K0
秒懂HTTPS接口(实现篇)
SpringBoot之Https
前言:Springboot因为是内置一个tomcat,在需要安全性的情况下需要配置ssl访问。
王念博客
2019/07/25
9970
springboot监控&springboot配置https
springboot自带actuator监控,开启配置后,访问相关链接就可以返回服务运行相关信息,使用方法如下: 1、pom.xml:
贪挽懒月
2020/08/13
1.2K0
springboot监控&springboot配置https
Spring Boot启用HTTPS
默认情况下,Spring Boot应用程序在应用程序启动时使用HTTP的8080端口。可按照以下步骤,在Spring Boot应用程序中配置HTTPS和端口443 -
黑洞代码
2021/09/03
9380
为了调个https接口,先后跟几万亿市值的大厂合作了一把
已经开始工作了,确实今年的压力比去年大了一些。可能是心态问题吧,虽然在家办公但是依然感觉很压抑。 状态就是: "感觉很忙,但是又没有目标"。不知道有没有人有过这种感觉。所以呢就翻看了一下之前写的 一只程序员的2019 。看完后终于知道做点什么了?
CainGao
2020/04/14
4120
SpringBoot配置Https
可以直接通过域名申请; 也可以使用自签证书(自签证书创建可以看我的另一篇文章:[使用KeyStore生成证书]) ​
十玖八柒
2022/08/01
1.2K0
SpringBoot配置Https
spring cloud/spring boot同时支持http和https访问
       关于spring boot同时支持http和https访问,在spring boot官网73.9已经有说明文档了,同样在github上也有官网的例子。官网链接如下
lyb-geek
2018/12/20
1.2K0
spring cloud/spring boot同时支持http和https访问
springboot(22)同时支持http和https访问
关于spring boot同时支持http和https访问,在spring boot官网73.9已经有说明文档了,同样在github上也有官网的例子。 在这里,我向大家讲述一下,我是怎么实现的。 keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 1.-storetype 指定密钥仓库类型 2.-keyalg 生证书的算法名称,RS
IT架构圈
2018/06/01
4K0
重学SpringBoot系列之嵌入式容器的配置与应用
在Spring Boot项目中,可以支持Tomcat、Jetty、Undertow的Web应用服务容器。当我们添加了spring-boot-starter-web依赖后,默认会使用Tomcat作为嵌入式Web容器,不需要我们单独部署,将web应用打成jar包即可运行。
大忽悠爱学习
2021/12/07
1.8K0
重学SpringBoot系列之嵌入式容器的配置与应用
给tomcat7配置SSL证书
今天工作中需要给tomcat7配置SSL证书,以使用https访问tomcat服务。以前都是自签名,照着网上的文档完成的,这回有一点不同的是https证书已经从GoDaddy买回来了,配置过程中遇到了一点坑,这里记录一下。 tomcat7配置SSL证书 从GoDaddy买来的证书包括3个文件,test.com.key, test.com.crt, godaddy_intermediate.crt。这里稍微解释一下,这3个文件。 test.com.key是私钥文件,文件内容如下: -----BEGIN RSA
jeremyxu
2018/05/10
3.8K0
Springboot模拟https安全访问(使用Java提供的keytool命令生成证书)
1、SpringBoot启动时默认采用http进行通信协议定义,但是为了访问安全性,我们有时候会选择使用https进行访问。正常来讲,https的访问是需要证书的,并且为了保证这个证书的安全,一定要在项目中使用CA进行认证,需要收费的哦,证书真是一个挣钱的生意。这里只是利用Java提供的keytool命令实现证书的生成。
别先生
2020/11/24
8610
Springboot模拟https安全访问(使用Java提供的keytool命令生成证书)
Spring Boot配置ssl证书启用HTTPS协议
SSL协议分为两层:SSL记录协议,它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议,它建立在SSL记录协议之上。用于在实际数据传输开始前,通信双方进行身份认证、协商加密算法、交换加密密钥等。
故久
2019/09/29
5.4K0
Spring Boot配置ssl证书启用HTTPS协议
SSL证书配置(https访问接口, 单向认证和双向认证)
参考文档 1. springboot项目配置阿里云ssl证书,http转https 2. Springboot配置使用ssl,使用https 3. Spring boot使用阿里云SSL证书报错:org/springframework/boot/context/properties/bind/Binder 4. IOException: Alias name tomcat does not identify a key entry 沃通证书部署问题解决办法
时间静止不是简史
2021/04/28
8.1K0
SSL证书配置(https访问接口, 单向认证和双向认证)
最通俗易懂的springboot框架学习教程—SpringBoot配置SSL(https)
SpringBoot可以通过在application.properties或application.yml配置文件中配置各种server.ssl.*属性来声明性使用SSL(https),比如下面的例子在application.properties中设置SSL属性:
晴天娃娃只会笑不会哭
2022/02/16
1.1K0
推荐阅读
相关推荐
重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档