软件综合项目笔记

架构设计

硬件感知,软件算法决策,驱动控制

一、工业物联网架构

|------|------|----|------|
| 工业线程 | 智能网关 | 云端 | 终端设备 |

端 - 边 - 云 - 用"

感知层(设备层)、网络层(网关层)、平台层(云端层)、应用层

1.智能网关

地位:工业现场设备与云端系统之间的关键枢纽

功能

1.本地数据处理与管理

数据汇总,数据显示,数据存储,数据预警,整体参数采集

2.数据上传与云端交互

3.扩展能力:视频监控、边缘计算、机器人规划

4.多协议数据汇聚与转换

2.云端

地位:工业物联网架构中的数据中枢与服务出口

云端类型:公有云,私有云

公有云平台:华为云、阿里云、腾讯云、OneNet

核心功能

1.多网关数据汇聚与存储:

接收并存储来自多个智能网关的工业现场数据,实现数据的集中管理与持久化。

2.数据可视化与推送服务

提供 HTTP 服务器,支持远程用户通过 IP + 浏览器访问。

将原始数据转换为可视化界面,并推送给手机、平板、PC 等终端设备,方便用户实时查看。

3.并发处理能力

可同时响应多终端、多用户的访问请求

访问方式

公有云:MQTT 接入

智能网关通过 MQTT 协议 连接公有云平台的 MQTT Broker;

设备使用平台分配的设备证书 / 密钥完成身份认证,以 发布(Publish) 方式上传数据到指定 Topic,或 订阅(Subscribe) 方式接收云端指令。

私有云:数据库访问

智能网关将采集到的数据写入私有云环境中的数据库(如 MySQL);

上层应用或终端通过内网 / VPN 方式,使用标准数据库驱动直接访问私有数据库,完成数据查询、分析与展示。

二、数据传输

地位:工业物联网架构中的核心纽带与全链路支撑

应用链路

1.工业线程 ↔ 智能网关 2.工业线程内部(设备间)

3.智能网关 ↔ 上层系统 / 云端 4.无线终端 ↔ 网关 / 中继器

传输方式

有线传输:RS485,CAN总线,以太网(ETH)

无线传输:Zigbee,Lora,Wifi

文档内容

一、需求分析总结

目标定义:明确要实现的系统 / 产品核心目标。

整体架构:规划系统包含的平台数量与模块划分。

功能细节:逐一描述各模块的具体功能与实现细节。

界面设计:明确界面展示内容、布局样式与交互逻辑。

数据存储:确定需存储的数据类型、结构,以及数据更新 / 持久化的频率。

预警联动:梳理数据异常时所需的告警方式与联动处理机制。

二、概要设计总结

1.技术方案

整体方案:确定系统整体技术选型与架构方向。

模块方案:细化各模块的技术实现路径与交互逻辑。

流程图:绘制核心业务流程与数据流转的可视化图表。

代码接口:定义软件模块间的调用接口、参数规范与返回格式。

技术支持

日志模块

日志级别

FATAL(0): 致命错误,程序必须退出**ERROR(1):**功能错误,程序继续运行

WARN(2): 警告,潜在问题**INFO(3):**运行信息,用于观察程序状态

DEBUG(4): 调试信息,开发排查用**TRACE(5):**跟踪日志,最详细

复制代码
typedef enum LogLevel {
    LOG_LEVEL_FATAL,
    LOG_LEVEL_ERROR,
    LOG_LEVEL_WARN,
    LOG_LEVEL_INFO,
    LOG_LEVEL_DEBUG,
    LOG_LEVEL_TRACE,
}LogLevel_t;

日志操作:打开日志文件,关闭日志文件,设置日志级别,向日志文件写入信息

1.打开日志文件

复制代码
int LogInit(const char *pLogPath)
{
    fLog = fopen(pLogPath, "a");
    if (NULL == fLog)
    {
        perror("fail to fopen");
        return -1;
    }   
    return 0;
}

2.关闭日志文件

复制代码
int LogDeInit(void)
{
    if (fLog != NULL)
    {
        fclose(fLog);
        fLog = NULL;
    }
    return 0;
}

设置日志级别

复制代码
void LogSetLevel(LogLevel_t level)
{
    gCurLogLevel = level;

    return;
}

向日志文件写入信息

复制代码
//关闭日志文件
int LogDeInit(void)
{
    if (fLog != NULL)
    {
        fclose(fLog);
        fLog = NULL;
    }

    return 0;
}

//设置当前日志级别
void LogSetLevel(LogLevel_t level)
{
    gCurLogLevel = level;

    return;
}

//向日志文件中写入消息
int LogWrite(LogLevel_t level, char *pmsg)
{
    time_t t;
    struct tm *ptm = NULL;

    if (level > gCurLogLevel)
    {
        return 0;
    }

    time(&t);
    ptm = localtime(&t);
    fprintf(fLog, "[%04d-%02d-%02d %02d:%02d:%02d][%s:%d]:%s\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, 
                                                          ptm->tm_hour, ptm->tm_min, ptm->tm_sec, 
                                                          __FILE__, __LINE__, pmsg);

    return 0;
}

嵌入式linux第三方日志库:zlog

多任务模块

多任务间通信

1.全局变量+锁(适用于线程间通信)

问题:多任务速率不匹配(可能数据丢失)

解决方法:缓存队列

2.线程邮箱机制(缓存队列)

实现方式:自定义实现,消息队列实现,第三方多任务通信库实现

自定义实现

线程名称,线程入口函数,线程ID,线程队列头节点地址

线程邮箱中的线程节点

创建,注册申请,回收,发送,接收

显示模块

前端+后端(b/s型)(资源在服务器端)

库实现:Qt库(界面开发)(c/s型)(资源提前下载到本地)优点:跨平台特性(Windows,;Linux,Android,macOS)

Windows开发语言/框架:c#,.NET

FrameBuffer

Qt库本质是调用FrameBuffer实现显示

LVGL库,MiniGUI库(基于Framebuffer)

有的嵌入式可以有多个Framebuffer,不同的Framebuffer有着图层区别

一帧图像的大小

像素点:显示图像的基本单元

ioctl

向设备发送命令(查询设备信息的命令)

横向像素点*纵向像素点*RGB

颜色标准:

RGB565:5位红色,6位绿色,5位蓝色;16位

RGB888:8位红色,8位绿色,8位蓝色

ARGB888:空出来的颜色+RGB888

三个像素点

多个像素点

数据量过大,如何高效率写入

mmap内存映射

将磁盘空间映射到内核层和用户层

零拷贝思想:访问同一片磁盘空间,可读可写

显示模块-framebuff实现

打开文件 open

获取屏幕属性 ioctl

映射显存空间 mmap

显示对应的信息

位运算

与1

右移一位

网络上传模块

相关推荐
今儿敲了吗2 小时前
41| 快速乘
数据结构·c++·笔记·学习·算法
ysa0510302 小时前
树的定向(dfs并查集贪心)
数据结构·c++·笔记·算法·深度优先·图论
花间相见2 小时前
【JAVA基础11】—— 吃透原码、反码、补码:计算机数值表示的底层逻辑
java·开发语言·笔记
巧克力味的桃子3 小时前
最长连续因子问题 - C语言学习笔记
c语言·笔记·学习
朗迹 - 张伟3 小时前
UE5 Road Creator Pro 插件学习笔记
笔记·学习·ue5
暴躁小师兄数据学院3 小时前
【WEB3.0零基础转行笔记】Go编程篇-第11讲:Gin框架
笔记·golang·web3·区块链·智能合约
雷工笔记3 小时前
小笔记|常读常新
笔记
Mr.Cheng.3 小时前
【InternVL2-2B】MLLM内部架构学习笔记
笔记·学习·自然语言处理
悠哉悠哉愿意3 小时前
【物联网学习笔记】串口接收
笔记·单片机·嵌入式硬件·物联网·学习