架构设计
硬件感知,软件算法决策,驱动控制
一、工业物联网架构
|------|------|----|------|
| 工业线程 | 智能网关 | 云端 | 终端设备 |
端 - 边 - 云 - 用"
感知层(设备层)、网络层(网关层)、平台层(云端层)、应用层
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
右移一位