3. 架构设计
IoT Gateway 采用了清晰的分层架构设计,各层职责明确,便于维护和扩展。这种架构设计使得系统具有良好的模块化特性,能够适应不同规模和需求的应用场景。
Iotgateway 网关


3.1 分层架构
IoT Gateway 的分层架构设计如下:
┌─────────────────────────────────────────────────────────────────┐
│ Web 界面层 │
│ (Razor Views、Controllers、JavaScript、CSS) │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────┐
│ 应用服务层 │
│ (DeviceService、DriverService、MyMqttClient、UAService 等) │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────┐
│ 业务逻辑层 │
│ (DeviceThread、IoTBackgroundService 等) │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────┐
│ 数据访问层 │
│ (DataContext、Entity Framework Core) │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────┐
│ 数据模型层 │
│ (Device、Driver、DeviceVariable 等) │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────┐
│ 插件驱动层 │
│ (IDriver 接口、各种设备驱动实现) │
└─────────────────────────────────────────────────────────────────┘
3.2 各层职责
3.2.1 Web 界面层
职责:
-
提供用户交互界面
-
处理 HTTP 请求和响应
-
实现 MVC 模式
-
提供 API 接口
主要组件:
-
Controllers:处理 HTTP 请求,调用业务逻辑层
-
Views:渲染 HTML 页面,展示数据
-
Models:视图模型,用于数据绑定
-
JavaScript/CSS:实现前端交互和样式
技术实现:
-
ASP.NET Core MVC
-
Razor 视图引擎
-
LayUI UI 框架
-
jQuery、Vue.js 等前端库
3.2.2 应用服务层
职责:
-
实现核心业务逻辑
-
管理设备和驱动
-
处理 MQTT 通信
-
实现 OPC UA 功能
主要组件:
-
DeviceService:设备管理服务
-
DriverService:驱动管理服务
-
MyMqttClient:MQTT 客户端服务
-
UAService:OPC UA 服务
-
ModbusSlaveService:Modbus 从站服务
技术实现:
-
ASP.NET Core 服务
-
依赖注入
-
异步编程
3.2.3 业务逻辑层
职责:
-
实现具体的业务逻辑
-
处理设备数据采集
-
执行 RPC 命令
-
管理设备线程
主要组件:
-
IoTBackgroundService:后台服务
-
DeviceThread:设备线程
-
各种业务逻辑类
技术实现:
-
.NET 后台服务
-
多线程编程
-
任务并行库
3.2.4 数据访问层
职责:
-
实现数据库访问
-
处理数据持久化
-
执行数据库查询和更新
主要组件:
-
DataContext:数据库上下文
-
Entity Framework Core 配置
-
数据库迁移
技术实现:
-
Entity Framework Core
-
LINQ 查询
-
数据库迁移
3.2.5 数据模型层
职责:
-
定义数据实体
-
实现实体关系
-
定义数据验证规则
主要组件:
-
Device:设备实体
-
Driver:驱动实体
-
DeviceVariable:设备变量实体
-
DeviceConfig:设备配置实体
-
SystemConfig:系统配置实体
技术实现:
-
.NET 类库
-
数据注解
-
实体关系映射
3.2.6 插件驱动层
职责:
-
定义驱动接口
-
实现设备驱动
-
支持动态加载
主要组件:
-
IDriver 接口:驱动接口定义
-
各种设备驱动实现
-
驱动加载机制
技术实现:
-
插件化架构
-
反射机制
-
接口设计
3.3 设计原则
3.3.1 单一职责原则
每个组件和类只负责一个特定的功能,便于维护和测试。例如:
-
DeviceService 只负责设备管理
-
DriverService 只负责驱动管理
-
MyMqttClient 只负责 MQTT 通信
3.3.2 依赖倒置原则
高层模块不依赖于低层模块,而是依赖于抽象。例如:
-
DeviceService 依赖于 IDriver 接口,而不是具体的驱动实现
-
DeviceThread 依赖于 IDriver 接口,而不是具体的驱动实现
3.3.3 接口隔离原则
客户端不应该依赖于它不需要的接口。例如:
-
IDriver 接口只包含驱动必需的方法和属性
-
其他辅助功能通过扩展方法或其他方式实现
3.3.4 开放封闭原则
软件实体应该对扩展开放,对修改封闭。例如:
-
新增设备驱动只需要实现 IDriver 接口,不需要修改现有代码
-
新增功能可以通过扩展现有组件实现,不需要修改核心代码
3.3.5 里氏替换原则
子类应该能够替换其父类。例如:
-
任何实现了 IDriver 接口的驱动都可以替换其他驱动
-
设备线程可以使用任何驱动实现
3.4 核心设计模式
3.4.1 插件模式
采用插件模式实现驱动的动态加载和扩展:
-
驱动实现 IDriver 接口
-
网关通过反射动态加载驱动程序集
-
驱动可以独立开发和部署
3.4.2 观察者模式
采用观察者模式实现事件通知:
-
MyMqttClient 发布 RPC 事件
-
DeviceThread 订阅 RPC 事件
-
当收到 RPC 命令时,通知相应的设备线程处理
3.4.3 工厂模式
采用工厂模式创建驱动实例:
-
DriverService 作为驱动工厂
-
根据驱动类型创建相应的驱动实例
-
隐藏驱动创建的细节
3.4.4 单例模式
采用单例模式管理全局服务:
-
DeviceService、DriverService 等核心服务采用单例模式
-
确保全局只有一个实例
-
便于服务之间的通信和协作
3.4.5 策略模式
采用策略模式实现不同数据处理逻辑:
-
支持多种数据处理策略
-
根据设备配置选择相应的处理策略
-
便于扩展新的数据处理逻辑
3.5 架构优势
3.5.1 模块化设计
-
各层职责明确,便于维护和扩展
-
组件之间低耦合,高内聚
-
便于团队协作开发
3.5.2 可扩展性
-
支持动态加载驱动
-
便于扩展新的设备协议
-
便于集成新的 IoT 平台
3.5.3 可靠性
-
各层之间有明确的边界,便于错误隔离
-
完善的错误处理和恢复机制
-
支持设备连接状态监控和自动重连
3.5.4 性能优化
-
采用多线程并发处理
-
异步编程模型
-
高效的数据处理算法
3.5.5 安全性
-
分层架构便于实现安全控制
-
支持身份认证和授权
-
数据传输加密
3.6 架构演进
3.6.1 初始架构
-
简单的分层架构
-
支持基本的设备管理和数据采集
-
单一数据库支持
3.6.2 当前架构
-
完善的分层架构
-
支持多种设备协议和驱动
-
支持多种数据库和 IoT 平台
-
实现了 OPC UA 和 Modbus 功能
3.6.3 未来架构
-
微服务架构
-
支持边缘计算
-
增强的数据分析和可视化
-
更完善的安全机制
3.7 架构最佳实践
3.7.1 代码组织
-
按照功能模块组织代码
-
采用清晰的命名规范
-
保持代码简洁和可读性
3.7.2 依赖管理
-
采用依赖注入管理组件依赖
-
避免循环依赖
-
合理使用单例和作用域
3.7.3 错误处理
-
采用集中式错误处理
-
完善的日志记录
-
友好的错误提示
3.7.4 性能优化
-
合理使用缓存
-
异步编程
-
避免不必要的数据库查询
3.7.5 测试策略
-
单元测试
-
集成测试
-
端到端测试
-
性能测试
文档版本 :1.0 更新日期 :2025-11-29 编写人员:辉为科技