客户有一堆小设备,需要通过小程序来控制它们,主要是设备门的开关、电源开关、状态查询、压力控制等。下面主要纪录下设计思路。源码地址:https://gitee.com/bxjg1987/abp

最初的设计是这样的

核心流程有3个,分别用绿、蓝、黑这3种颜色来标识。

流程1:小程序端发送指令控制设备(开关、舱压调整等)

以开关电源控制为例

  1. 小程序向wei服务端发起请求,说我想关闭设备id为1的那个设备
  2. wei服务端准备一条消息(说我要关闭id为1的那个设备),发送给RabbitMQ消息队列
  3. RabbitMQ消息队列将消息推送给硬件服务器
  4. 硬件服务器解析消息,根据设备id和按协议约定准备byte[]指令下发给具体设备
  5. 设备回复消息给硬件服务器
  6. 硬件服务器组织一条回复消息(所id为1的设备已经关闭成功)发送给RabbitMQ消息队列
  7. 消息队列将回复消息推送给web服务端
  8. web服务端通过abp提供的通知功能(默认基于a's'p.net core signalr)通知小程序端,

此时小程序端开源认为操作成功,但是不是太准确,另一种办法是小程序再查一次设备状态确认下。所以上面的步骤5可以向设备触发一个请求,让设备立即上报一次数据。默认情况下设备是轮询的比如30秒上报一次数据。

流程2:设备轮询30秒上报一次数据

  1. 设备上报状态数据
  2. 硬件服务器将设备状态数据存储到数据库
  3. 硬件服务器向RabbitMQ消息队列发送一条消息,说设备id为x的设备上报了状态数据
  4. RabbitMQ消息队列将消息推送给web服务端
  5. web服务端通过abp提供的通知机制通知小程序端

步骤3没必要直接将状态数据推送给消息队列,因为此消息的接收方未必关系具体的数据,目前设计只是说有设备状态上报了,这个消息通知到接收方,由接收方决定是否主动来查设备状态

流程3:小程序主动查询设备状态

这个就比较简单了

  1. 小程序端向web服务端发起查询请求
  2. web服务器直接从数据库查询设备状态返回就可以了

有点问题,这样查询不是设备的当前状态,我们可以再定义接口直接去查一次当前设备的状态,但是这样编码比较大,也不利于我们复用现有流程。最简单的办法是定义一个接口,向设备发送一条指令说请你立即上报一次数据,小程序原有的查询设备状态查到就是最新的了。

设备服务端SuperSocket

开源地址:https://github.com/kerryjiang/SuperSocket,这是个设计得比较好的,基于.net core的socket的通信框架。官方有文档学起来比较简单。

它负责与设备通信,可以单独部署在一台服务器上。

基于Abp的Web服务端

这就不多说了,因为它已经为我们提供了很好的web服务端基础设施,免得从头做起。此服务端也可以单独部署一台服务器

消息队列RabbitMQ

其它mq没用过,就用它咯。它主要是解耦设备服务端和web服务端的,主要是它可以主动推送消息给接收方,也可以考虑使用redis的推送来实现。消息队列也可以单独部署一台服务器

简化后的设计

如果设备比较少,请求量不大可以用下面这种简化的设计

既然是简化,流程就不说了。主要是省略了消息队列,并且省略了指令回复的处理,而是使用轮询的方式,比如每过10秒查一次当前设备状态,控制设备时,只是下发指令,而不等结果,因为我们的轮询会查到下一次的设备状态。

这里有些注意:

  • 设备上报状态存入数据库时可以使用一个全局的数据库连接
  • web服务器向设备服务器发送指令时也可以考虑使用全局的tcp连接
  • web服务器向设备服务器发送指令时可以使用supersocket提供的客户端库

结束

简化后的方案最low,但是也最容易实现,目前源码中就是采用的这种方式。前一种方式稍微好点,3台服务器可以分开部署,如果并发再大点可以考虑下分布式了,再不行就放弃这个上思路,直接上个阿里云IOT啥的。

基于abp的小小设备控制系统设计的更多相关文章

  1. 随应潮流-基于ABP+Angulsrjs现代化应用软件开发框架(2)-abp说明

    前言 上周未发布完<基于ABP+Angulsrjs现代化应用软件开发框架(1)-总体介绍> 文章后,好多朋友问了我一些ABP的问题,并且希望我开源我的项目源码,向朋友们说一下,我项目的源码 ...

  2. [开源] 基于ABP,Hangfire的开源Sharepoint文件同步程序----SuperRocket.SPSync

    (一)项目背景 Sharepoint是微软的一个产品,很多公司都在使用它,也有很多公司以前使用它,现在可能需要移植到别的平台,也可能只是移植其中的文件存储,比如说移植到微软云,或者亚马逊云存储.Sup ...

  3. 基于Http协议订阅发布系统设计

      基于Http协议订阅发布系统设计 --物联网系统架构设计   1,订阅发布(subscriber-publisher)      订阅发布模式最典型的应用场景就是消息系统的设计.在消息系统的架构中 ...

  4. 手工搭建基于ABP的框架 - 工作单元以及事务管理

    一个业务功能往往不只由一次数据库请求(或者服务调用)实现.为了功能的完整性,我们希望如果该功能执行一半时出错,则撤销前面已执行的改动.在数据库层面上,事务管理实现了这种完整性需求.在ABP中,一个完整 ...

  5. 基于ABP模块组件与依赖注入组件的项目插件开发

    注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...

  6. 文献综述三:基于JSP的商品信息管理系统设计与开发

    一.基本信息 标题:基于JSP的商品信息管理系统设计与开发 时间:2015 出版源:Computer Knowledge and Technology 文件分类:jsp技术的系统开发 二.研究背景 通 ...

  7. 随应潮流-基于ABP+Angularjs现代化应用软件开发框架(1)-总体介绍

    系列文章目录 随应潮流-基于ABP+Angulsrjs现代化应用软件开发框架(1)-总体说明 随应潮流-基于ABP+Angulsrjs现代化应用软件开发框架(2)-abp说明 随应潮流-基于ABP+A ...

  8. 利用代码生成工具生成基于ABP框架的代码

    在前面随笔,我介绍了整个ABP优化过框架的分层模型,包括尽量简化整个ABP框架的各个层的关系,以及纳入一些基类的辅助处理,使得我们对应业务分层类或者接口尽可能减少代码,并具有生产环境所需要的基类接口, ...

  9. 基于abp框架的数据库种子数据初始化

    目录 基于abp框架的数据库种子数据初始化 1.背景 2.参照 3.解决方案 3.1 初始化数据 3.2 依赖注入方法容器里获取数据库上下文 3.3 封装创建初始化数据列表方法 3.4 数据库中没有的 ...

随机推荐

  1. 设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别

    0.背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们 ...

  2. 单元测试报错:Mybatis中数据库语句错误

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste ...

  3. Pycharm中对与Python的快捷方式

    转自博客园 @python~小成录 pycharm常用快捷键与设置   pycharm高频率使用的快捷键 Ctrl+Shift+F10 运行当前的页面 Ctrl + / 注释(取消注释)选择的行 Ct ...

  4. C# 中生成随机数

    生成1-100之间的随机数: new Random().Next(1, 100) 但是输出的结果是一样的,因为Random调用无参的构造函数其实调用的是 有参的构造函数,传递的 默认值: Enviro ...

  5. java基础-01:dos命令

    进入cmd方式 win + r 输入 cmd 随便进入一个文件夹 在导航栏输入cmd,回车即进入命令行 命令 盘符切换:直接输入 E: ,回车即可 查看文件夹下所有目录:dir 切换目录: cd 跨盘 ...

  6. Kubernetes 中 Informer 的使用

    原文链接:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247485580&idx=1&sn=7392dbadf ...

  7. 使用 gopacket 进行数据包捕获,注入和分析

    原文链接:https://www.devdungeon.com/content/packet-capture-injection-and-analysis-gopacket 接口文档:https:// ...

  8. paramiko 模块 ---- python2.7

    模拟远程执行命令: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import paramiko   #设置日志记录 paramiko ...

  9. 第4篇 Scrum 冲刺博客(专✌️团队)

    一.站立式会议 1.1会议图片 1.2成员完成情况 成员 昨天完成的任务 今天计划完成的任务 工作中的困难 陈忠明 按下载热度返回歌曲信息,与前端尝试交互 歌曲信息的上传/下载包 前后端交互问题 吴茂 ...

  10. 兄弟们,我打算抠100个网站JS加密代码召唤,一个也跑不掉,这次轮到小虎牙

    摘要:友情提示:在博客园更新比较慢,有兴趣的关注知识图谱与大数据公众号吧.本次研究虎牙登录密码加密JS代码,难度不大,依然建议各位读者参考文章独自完成,实在抠不出来再参考这里的完整代码:从今天开始种树 ...