红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程


HTTP版RTU(支持GNSS)项目概述
RTU(Remote Terminal Unit),中文即远程终端控制系统,负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置,通常由信号输入/出模块、微处理器、有线/无线通讯设备、电源及外壳等组成,由微处理器控制,并支持网络系统。它实现企业中央监控与调度系统对生产现场一次仪表的遥测、遥控、遥信和遥调等功能。RTU可以实现远程测控设备,通过控制现场IO控制现场设备运行。
产品定义描述
产品功能定义:
传统设备需接入云平台,在不改变其自身的条件下,通过串口连接一个可连接服务器的设备,以便在不修改传统设备的情况下,为其赋予上云功能。
HTTP RTU+GNSS 版本的 RTU 具备 5*6 贴片卡/外置 SIM 卡/全网通卡功能,支持北斗/GPS 定位,支持卡基站定位,内置看门狗,掉线自动恢复。其配备标准工业 RS232/485 接口,支持 6-20V 宽电压输入,支持 5 路 DO,5 路 DI,1 路 AI。
HTTP RTU+GNSS 版本的 RTU 为用户提供标准固件及对应源码,以及 HTTP 透传、GNSS、DI、DO、AI 等功能的操作例程。用户可借此快速了解如何从 0 开始开发项目,快速完成产品功能定义,加快开发进程。
产品硬件分析框图:
系统框图

功能简介
-
电源:为 SOM 核心板+底板和扩展外设提供电源。
-
SOM 核心板+底板:作为产品的核心部分。
-
上位机:用于配置设备参数。
-
4G 天线:用于信号的接收和发送。
-
DI/DO:开关量输入和输出。
-
AI:模拟输入。
-
SOM 板和底板之间的接口使用板对板连接器。
硬件资料包括,SOM板原理图和PCB,主板原理图和PCB,部分组件资料。

硬件设计原理图、Layout图、BOM信息等资料详情点击下面链接🔗:硬件开发部分
产品核心板资料和产品datesheet点击如下链接🔗:1)AM430EV5 SOM板1(5*6卡)2)Datasheet

也可以购买标准硬件进行软件开发,购买链接:
https://item.taobao.com/item.htm?id=768412868192&spm=a1z10.1-c-s.w4004-25306266394.3.7c4517edPbkQLY

软件开发分析:
开发一个项目时会产生大量代码。通常,项目开发人员会将项目功能拆分成一个个功能点,然后逐一实现,最后合并成最终的产品代码。
产品软件流程分析
我们的目标是研发一款 RTU(远程终端单元)。RTU 是一种针对通信距离较长和工业现场环境恶劣而设计的具有模块化结构的特殊计算机测控单元,用于将末端检测仪表和执行机构与远程调控中心的主计算机连接起来。
该项目实现的功能有:
-
通过 AT 指令配置设备运行参数,包括服务器连接 IP、端口号、心跳包开启/关闭、心跳包内容、注册包模式、注册包内容以及复位和查询相关配置参数指令。
-
可随时选择进入或退出透传模式。
-
具备心跳保持功能,心跳间隔可配置。
-
具备网络重连功能。
-
理论上可发送无限长度数据包。
-
波特率固定为 115200,也可根据客户需求定制。
-
支持网络 AT 指令和 JSON 协议配置功能,可通过服务器下发远程 AT 指令进行配置。
-
支持远程升级。
-
支持 5 路数字输入(DI),DI 可配置为上拉/下拉、初始电平、主动上报、定时上报,还可单独读取某一路或同时读取 5 路。
-
支持 5 路数字输出(DO),包含上拉/下拉、初始电平、重启状态,可单独设置某一路的输出电平,也可同时设置 5 路的输出电平。
-
支持 1 路模拟输入(AI),可采集 4-20mA 的电流,可配置阈值,根据配置触发报警,周期上报。
-
闹钟功能,DO 可定时执行设置动作。
-
支持 IO 联动,DI/AI 作为输入源,DO 跟随动作,包括正向跟随、反向跟随 DI,以及在阈值内、阈值外执行相应动作。
根据 RTU 应具备的功能,代码可分为数据存储模块、AT 指令模块、切卡模块、透传模式切换模块、TCP 模块、心跳模块、掉线重连模块、GNSS 模块、DI 模块、DO 模块、AI 模块、JSON 模块、闹钟模块。

模块内拆解的功能点分析
模块是将具有相似功能的代码组织到同一个源文件中。每个功能都被视为一个功能点,不同功能点的组合构成了模块的主要功能。
-
数据存储功能点:包括文件创建、初始化、读写和关闭等操作。
-
AT 指令功能点:包括串口初始化、串口数据接收、发送、数据分析以及 AT 指令解析。
-
切卡功能点:包括 GPIO 初始化和复位切卡操作。
-
透传模式切换功能点:包括串口初始化、串口数据接收、发送、数据分析以及切换模式操作。
-
掉线重连功能点:包括连接状态检测和掉线重连操作。
-
TCP 功能点:包括参数配置、创建 Socket、连接服务器、发送和接收数据等操作。
-
心跳功能点:包括参数配置和定时发送操作。
-
GNSS 功能点:包括参数配置、串口初始化、串口数据接收、数据分析、模式切换以及定时上报操作。
-
DI 功能点:包括参数配置、GPIO 初始化、中断检测、模式切换、定时上报和中断上报操作。
-
AI 功能点:包括参数配置、ADC 接口初始化、电流计算、定时上报操作。
-
DO 功能点:包括参数配置、GPIO 初始化、模式切换、定时上报、跟随 DI 或 AI 操作。
-
闹钟功能点:包括参数配置、定时和超时动作操作。
-
JSON 功能点:包括数据接收、解析和发送操作。
上述模块功能点的顺序大致是按照依赖关系排列的,下面讲述的模块实现可能需要基于上述功能点来完成。
开发过程(基于红豆平台搭乐高模式开发)
根据上述分析,开发过程即为实现一个个功能点,再由数个功能点组成一个模块,最终由数个模块完成整个项目的开发。开发过程将从核心功能点验证、完整代码详解和调试三个章节展开,详细介绍如何使用服务层 API 或应用层组件中的代码来实现功能点和模块,从而完成整个项目。在软件开发部分,我们对这个开源项目进行了模块划分,并对每个模块拆解出相应的功能点。在本章节中,我们将对所有功能点进行逐一验证,拼接出我们最终的 RTU 产品代码。
本产品基于以上软件分析共涉及以下 13 个功能模块:数据存储模块、AT 指令模块、切卡模块、透传模式切换模块、TCP 模块、心跳模块、掉线重连模块、GNSS 模块、DI 模块、DO 模块、AI 模块、JSON 模块和闹钟模块。

这13个功能模块在红豆开源平台RTOS系统服务层组件&应用层组件都提供相关的服务,可以直接采用搭乐高开发模式。红豆平台的相关资源介绍链接:红豆平台RTOS技术架构。
第一步:基于RTOS的组件快速完成每一个功能模块的验证,针对本次工程每个功能模块验证详情链接:核心功能点验证
第二步:验证完功能点和功能模块后,从0快速搭建出一个RTU工程,进行系统级联调测试。RTU工程完整代码讲解链接:完整代码详解;RTU工程代码调试详解链接:调试:产品固件Gitee链接: 软件源码树文件介绍及Gitee链接 。
本工程的代码对第一次接触红豆平台也非常友好,提供详细的代码讲解备注,例如以下:文件模块的代码,可以迅速了解上手,也可以根据自己的需求做优化改进。

工程成果下载
开发成果属于项目完成后,总结出来的一些说明性文件,包括Datasheet,AT指令手册,通信协议,以及固件等,可以作为本开源项目的工程量产资料。
如需下载相关资料或者需要技术交流请联系我们:

物联网技术发展日新月异,也欢迎反馈您的技术需求,我们会及时更新迭代红豆平台的技术应用能力。

部分素材来源于网络,仅用于交流学习,如有侵权请联系删除!
相关文章:
红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程
HTTP版RTU(支持GNSS)项目概述 RTU(Remote Terminal Unit),中文即远程终端控制系统,负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置,通常由信号输入/出模块、微…...
在 Mac 上配置高级内容缓存设置
在 Mac 上配置高级内容缓存设置 您可以使用高级配置参数针对网络配置微调内容缓存。 您可以在“终端”中使用命令行或通过修改“/资源库/Preferences/com.apple.AssetCache.plist”文件中的键值,来设定内容缓存的高级配置参数。若要使某些更改生效,必须…...
算法与数据结构 顺序栈(C++)
随机产生10个100以内的整数建立一个顺序栈,从栈顶到栈底依次显示栈内元素;从键盘输入出栈元素个数 n (1< n <10),将 n 个元素依次出栈并显示出栈元素,再显示此时栈顶元素。 #include <iostream> #include <cstd…...
【WSL】在WIN11安装并使用Linux子系统(Ubuntu)
前言: 最近买了4060Ti 16G,可以尝试在本地实验大模型。一开始尝试使用Vmware搞Linux,发现没有办法加载GPU(或者另外有办法没找到)。所以只剩下了两条路:要么搞双系统,要么使用WSL(W…...
【vim 学习系列文章 20 -- a:mode 的值有哪些?】
请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 a:mode 的值有哪些?举例Vim 底部状态栏设置 a:mode 的值有哪些? 在 Vim 脚本语言中,a:mode 常常用于函数内部,以获取该函数被调用时 Vim 正处于的模式。它主常用于那些可以从不同模式下被调用的函数…...
sed命令多行处理
1. sed 如何工作的 sed 维护两个空间: 模式空间保留空间 sed是以行为周期来处理文本的。 sed从输入流中读取一行,去掉最后的换行符,把它放入模式空间。随后执行命令,每个命令都有关联的地址和条件,只有匹配时才执行…...
Secure Copy Protocol or SCP - 安全拷贝协议
Secure Copy Protocol or SCP - 安全拷贝协议 1. scp 文件传输1.1. 将远程文件拷贝到本地1.2. 将本地文件拷贝到远程1.3. 将远程目录拷贝到本地 References Secure Copy (remote file copy program) The SCP program is a software tool implementing the SCP protocol as a s…...
Java面试题:什么是Java的值传递和引用传递?列举其应用场景,并说明其特点
在Java中,值传递和引用传递是两种不同的参数传递机制。它们在Java程序中扮演着重要的角色,影响着方法如何接收和处理参数。了解这两种传递机制对于编写高效、可靠的Java代码至关重要。 值传递(Pass by Value) 值传递是指在调用方…...
Java 基于微信小程序的智能停车场管理小程序
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
python基础——类型注解【变量,函数,Union】
📝前言: 上一篇文章Python基础——面相对象的三大特征提到,python中的多态,python中,类型是动态的,这意味着我们不需要在声明变量时指定其类型。然而,这可能导致运行时错误,因为我们…...
人工智能研究生前置知识—科学计算库numpy
人工智能研究生前置知识—科学计算库numpy numpy是python中做科学计算的基础库,对数组进行操作 整个numpy的操作和使用比较简单因此可以通过案例的学习掌握基本的用法在之后的学习中不断的进行熟悉和补充 创建数组(矩阵 ) 创建的ndarray数组…...
element UI 设置type=“textarea“ 禁止输入框缩放
背景 在 Element UI 中,当您使用 el-input 组件并设置 type"textarea" 时,默认情况下,用户可以通过拖动输入框的右下角来调整其大小。如果您想禁止这种缩放行为,需要使用 CSS 来覆盖默认的浏览器行为。 注意上图&#x…...
Rust腐蚀服务器常用参数设定详解
Rust腐蚀服务器常用参数设定详解 大家好我是艾西,一个做服务器租用的网络架构师上期我们分享了rust腐蚀服务器的windows系统搭建方式,其中启动服务器bat参数因为涉及的东西比较多所以想通过这篇文章给大家做一下详细的分享。 (注本文中xxxx…...
无人机巡检技术革命性变革光伏电站运维管理
在中国广袤的大地上,光伏电站如雨后春笋般崛起,晶体硅组件板在阳光下熠熠生辉,为人们带来了源源不断的绿色能源。然而,随着光伏产业的迅猛发展,电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入,…...
【学习】软件信创测试中,如何做好兼容性适配
在软件信创测试的领域中,兼容性适配是至关重要的一环。如何确保软件在不同的操作系统、硬件设备和软件环境中稳定运行,是每个测试人员需要面对的挑战。本文将从几个方面探讨如何做好兼容性适配,以提高软件的稳定性和用户体验。 首先…...
阿里云ACK k8s集群迁移
1、创建k8s集群 阿里云ACK创建 2、创建所需的第三方插件 ACK ingress创建 3、导出原有ACK集群配置 包含deployment、service、ingress、PersistentVolumeClaim 执行命令 kubectl get deployment,service,secret,ingress,PersistentVolumeClaim -n <namespace_name> -o y…...
1.3 字符设备驱动
1、字符设备驱动工作原理 2、file_operations结构体 struct file_operations { struct module *owner; //拥有该结构的模块的指针,一般为THIS_MODULES loff_t (*llseek) (struct file *, lof…...
计算机毕业设计springboot小区物业报修管理系统m8x57
该物业报修管理系统实施的目的在于帮助物业管理企业升级员工管理、住户管理、报修问题管理等内部管理平台,整合物业管理企业物力和人力,全面服务于维修人员管理的内部管理需求,并重视需求驱动、管理创新、与业主交流等外部需求,通过物业管理企业各项资源…...
深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用
1. 卷积神经网络 卷积神经网络(CNN)是一种特别适用于处理具有网格结构的数据,如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统,这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…...
js 数字的常用方法梳理
toFixed:保留几位小数。toFixed(保留小数位)。注意:不做任何的四舍五入。 Math集合: random:获取一个0-1之间的随机数。注意,包含0,不包含1。 round:四舍五入取整数,最后返回一个整数值。 ceil:向上取整。 floor:…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
