升级 ,以及修复一些BUG
This commit is contained in:
406
物联网系统项目分析报告.md
Normal file
406
物联网系统项目分析报告.md
Normal file
@@ -0,0 +1,406 @@
|
||||
# 物联网系统项目分析报告
|
||||
|
||||
## 1. 项目概览
|
||||
|
||||
本项目是一个基于UDP通信的物联网系统,主要用于酒店客房RCU(Room Control Unit)主机的管理和控制。系统架构较为古老,经历了从纯SQLServer存储到SQLServer+Redis混合存储的演进过程。
|
||||
|
||||
### 1.1 核心功能
|
||||
|
||||
- RCU主机通信与管理
|
||||
- 客房设备状态监控与控制(灯光、空调、窗帘等)
|
||||
- 房态管理(入住、退房、待租、空房)
|
||||
- 智能语音设备集成(小度、天猫精灵等)
|
||||
- 能源管理与统计
|
||||
- 故障报警与处理
|
||||
|
||||
### 1.2 技术栈
|
||||
|
||||
- **开发语言**:C#
|
||||
- **通信协议**:UDP
|
||||
- **数据存储**:SQLServer + Redis
|
||||
- **ORM框架**:NHibernate
|
||||
- **缓存**:Redis + C# MemoryCache
|
||||
- **消息队列**:Redis Stream
|
||||
|
||||
## 2. 系统架构分析
|
||||
|
||||
### 2.1 架构分层
|
||||
|
||||
系统采用典型的分层架构设计,主要包含以下层次:
|
||||
|
||||
1. **通信层**:基于UDP协议的RCU主机通信
|
||||
2. **业务逻辑层**:服务层和控制器
|
||||
3. **数据访问层**:基于NHibernate的数据库操作
|
||||
4. **存储层**:SQLServer和Redis混合存储
|
||||
5. **表现层**:Web API和管理界面
|
||||
|
||||
### 2.2 核心流程图
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant RCU as RCU主机
|
||||
participant HostServer as UDP通信服务器
|
||||
participant Redis as Redis缓存
|
||||
participant SQLServer as SQLServer数据库
|
||||
participant Service as 业务服务层
|
||||
participant API as Web API
|
||||
|
||||
RCU->>HostServer: 上报设备状态
|
||||
HostServer->>Redis: 缓存实时状态
|
||||
HostServer->>Service: 处理业务逻辑
|
||||
Service->>SQLServer: 持久化数据
|
||||
API->>Redis: 查询设备状态
|
||||
API->>Service: 下发控制命令
|
||||
Service->>HostServer: 转发控制命令
|
||||
HostServer->>RCU: 控制设备
|
||||
```
|
||||
|
||||
### 2.3 模块依赖关系
|
||||
|
||||
- **Common**:公共工具类和辅助方法
|
||||
- **RCUHost**:UDP通信核心模块
|
||||
- **Service**:业务逻辑服务
|
||||
- **Dao**:数据访问层
|
||||
- **Domain**:领域模型
|
||||
- **WebSite**:Web API和管理界面
|
||||
- **CommonEntity**:公共实体类
|
||||
|
||||
## 3. 核心模块分析
|
||||
|
||||
### 3.1 UDP通信模块
|
||||
|
||||
UDP通信是系统的核心,负责与RCU主机的双向通信。
|
||||
|
||||
#### 3.1.1 主要功能
|
||||
|
||||
- 监听UDP端口(3339)接收RCU上报数据
|
||||
- 解析UDP数据包,分发到对应接收器
|
||||
- 封装并发送控制命令到RCU主机
|
||||
- 心跳检测与设备状态管理
|
||||
- Redis Stream处理高并发数据
|
||||
|
||||
#### 3.1.2 关键代码
|
||||
|
||||
```csharp
|
||||
// UDP服务器启动
|
||||
public void Start()
|
||||
{
|
||||
udpClient = new UdpClient(3339);
|
||||
uint IOC_IN = 0x80000000;
|
||||
uint IOC_VENDOR = 0x18000000;
|
||||
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
|
||||
udpClient.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
|
||||
udpClient.BeginReceive(ReceiveCallback, new UdpState(udpClient));
|
||||
}
|
||||
|
||||
// 数据接收回调
|
||||
private void ReceiveCallback(IAsyncResult ar)
|
||||
{
|
||||
UdpState state = ar.AsyncState as UdpState;
|
||||
IPEndPoint remoteEP111 = new IPEndPoint(IPAddress.Any, 0);
|
||||
byte[] receiveBuffer111 = state.UdpClient.EndReceive(ar, ref remoteEP111);
|
||||
if (receiveBuffer111.Length > 0)
|
||||
{
|
||||
ReceiverContext context = new ReceiverContext(receiveBuffer111, remoteEP111, GetNextCustomer());
|
||||
// 处理数据...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 房间状态管理模块
|
||||
|
||||
负责处理RCU主机上报的房间状态数据,包括设备状态、房卡状态、门磁状态等。
|
||||
|
||||
#### 3.2.1 主要功能
|
||||
|
||||
- 解析并处理房间状态数据包
|
||||
- 缓存设备状态到Redis
|
||||
- 持久化状态到SQLServer
|
||||
- 触发相关业务逻辑(如欢迎词、节能控制等)
|
||||
|
||||
#### 3.2.2 关键代码
|
||||
|
||||
```csharp
|
||||
public override void Process(ReceiverContext context)
|
||||
{
|
||||
string HostNumberOnly = context.SystemHeader.Value.HostNumber.ToString();
|
||||
string hotelcode = context.SystemHeader.Value.HostNumber.ToHotelCode().ToString();
|
||||
|
||||
// 获取主机信息
|
||||
Host host = null;
|
||||
string Key = CacheKey.HostInfo_Key_HostNumber + "_" + HostNumberOnly;
|
||||
object obj = MemoryCacheHelper.Get(Key);
|
||||
if (obj != null)
|
||||
{
|
||||
host = obj as Host;
|
||||
}
|
||||
else
|
||||
{
|
||||
Host host_O = HostRepository.GetByHostNumber(HostNumberOnly);
|
||||
MemoryCacheHelper.SlideSet(Key, host_O);
|
||||
host = host_O;
|
||||
}
|
||||
|
||||
// 处理设备状态
|
||||
using (MemoryStream stream = new MemoryStream(context.Data, offset, length))
|
||||
{
|
||||
bool isTriggerWelcomeMsg = true;
|
||||
Status status = DecodeRoomStatus_NEW(stream, HostNumberOnly, out isTriggerWelcomeMsg, host.SysHotel.Code, host.RoomNumber);
|
||||
if (status != null)
|
||||
{
|
||||
// 缓存状态到Redis
|
||||
CSRedisCacheHelper.Forever<ushort>(k1, context.SystemHeader.Value.FrameNo);
|
||||
CSRedisCacheHelper.Forever<bool>(k2, !status.SysLock);
|
||||
CSRedisCacheHelper.Forever<float>(k3, status.ElecQty);
|
||||
CSRedisCacheHelper.Forever<byte>(k4, status.HostTemp);
|
||||
|
||||
// 处理设备状态
|
||||
if (status.Devices != null && status.Devices.Count > 0)
|
||||
{
|
||||
ProcessModal_NEW_NEW(host, status.Devices, isTriggerWelcomeMsg, context.MessageID, context.IsMonitor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 主机管理模块
|
||||
|
||||
负责RCU主机的基本信息管理、升级、配置等操作。
|
||||
|
||||
#### 3.3.1 主要功能
|
||||
|
||||
- 主机信息管理(添加、修改、删除)
|
||||
- 主机固件升级
|
||||
- 主机配置管理
|
||||
- 主机状态监控
|
||||
|
||||
#### 3.3.2 关键代码
|
||||
|
||||
```csharp
|
||||
public override Host Get(object id)
|
||||
{
|
||||
var host = base.Get(id);
|
||||
if (host != null)
|
||||
{
|
||||
host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
|
||||
}
|
||||
return host;
|
||||
}
|
||||
|
||||
public void ChangeRoomStatus(Host host, RoomStatus roomStatus, string wxValidate)
|
||||
{
|
||||
// 更新主机房态
|
||||
host.RoomStatus = roomStatus;
|
||||
CurrentRepository.Update(host);
|
||||
|
||||
// 处理相关业务逻辑
|
||||
if (roomStatus.ID == 2 || roomStatus.ID == 8) // 开房和退房时重置
|
||||
{
|
||||
// 重置智能设备
|
||||
if (!string.IsNullOrEmpty(host.XiaoDuCUID))
|
||||
{
|
||||
// 重置小度
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 数据存储分析
|
||||
|
||||
### 4.1 SQLServer存储
|
||||
|
||||
#### 4.1.1 主要存储内容
|
||||
|
||||
- 主机基本信息(tb_Hosts)
|
||||
- 房间类型(tb_RoomTypes)
|
||||
- 设备模板(tb_Modals)
|
||||
- 主机设备关联(tb_HostModal)
|
||||
- 房态信息(tb_RoomStatus)
|
||||
- 历史记录(如房卡记录、故障记录等)
|
||||
|
||||
#### 4.1.2 数据访问方式
|
||||
|
||||
- NHibernate ORM框架
|
||||
- 原生SQL查询
|
||||
- 存储过程调用
|
||||
|
||||
### 4.2 Redis存储
|
||||
|
||||
#### 4.2.1 主要存储内容
|
||||
|
||||
- 实时设备状态
|
||||
- 会话信息
|
||||
- 监控日志
|
||||
- 缓存热点数据
|
||||
- 消息队列(Redis Stream)
|
||||
|
||||
#### 4.2.2 数据访问方式
|
||||
|
||||
- CSRedisClient客户端
|
||||
- 发布/订阅机制
|
||||
- Stream数据结构
|
||||
|
||||
#### 4.2.3 缓存键设计
|
||||
|
||||
```csharp
|
||||
public class CacheKey
|
||||
{
|
||||
public static string HostModalStatus_Prefix = "HostModalStatusReceiver";
|
||||
public static string RoomStatus_Prefix = "RoomStatusReceiver";
|
||||
public static string HostInfo_Key_HostNumber = "HostInfo_Key_HostNumber";
|
||||
public static string HostFrameNo = "HostFrameNo";
|
||||
public static string PowerSupply = "PowerSupply";
|
||||
public static string LockVoltage = "LockVoltage";
|
||||
public static string HostTemp = "HostTemp";
|
||||
// 更多缓存键...
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 存储优化分析
|
||||
|
||||
当前系统已经开始使用Redis缓存部分设备状态,但仍存在以下问题:
|
||||
|
||||
1. **缓存策略不完善**:部分热点数据未缓存
|
||||
2. **数据同步问题**:SQLServer与Redis数据同步机制不够健壮
|
||||
3. **缓存过期策略**:部分缓存项过期时间设置不合理
|
||||
4. **Redis使用效率**:未充分利用Redis的高级特性
|
||||
|
||||
## 5. 性能优化建议
|
||||
|
||||
### 5.1 UDP通信优化
|
||||
|
||||
1. **数据包处理优化**
|
||||
- 减少数据包解析时间
|
||||
- 优化线程池使用
|
||||
- 增加数据包校验机制
|
||||
|
||||
2. **并发处理优化**
|
||||
- 合理设置并发线程数
|
||||
- 使用异步非阻塞IO
|
||||
- 优化Redis Stream消费速度
|
||||
|
||||
### 5.2 数据存储优化
|
||||
|
||||
1. **Redis缓存优化**
|
||||
- 扩大Redis缓存范围,将更多热点数据纳入缓存
|
||||
- 优化缓存键设计,提高缓存命中率
|
||||
- 合理设置缓存过期时间
|
||||
- 使用Redis Pipeline减少网络往返时间
|
||||
|
||||
2. **SQLServer优化**
|
||||
- 优化数据库索引
|
||||
- 减少大表查询
|
||||
- 优化存储过程性能
|
||||
- 考虑使用读写分离
|
||||
|
||||
3. **数据同步优化**
|
||||
- 建立更可靠的SQLServer与Redis数据同步机制
|
||||
- 使用消息队列确保数据一致性
|
||||
- 实现数据同步监控和故障恢复
|
||||
|
||||
### 5.3 代码质量优化
|
||||
|
||||
1. **内存管理**
|
||||
- 减少大对象分配
|
||||
- 使用对象池减少GC压力
|
||||
- 优化Stream处理
|
||||
|
||||
2. **线程管理**
|
||||
- 减少线程创建开销
|
||||
- 合理使用线程池
|
||||
- 避免线程死锁和竞态条件
|
||||
|
||||
3. **异常处理**
|
||||
- 优化异常处理逻辑
|
||||
- 减少异常抛出频率
|
||||
- 增加异常监控和告警
|
||||
|
||||
### 5.4 架构优化
|
||||
|
||||
1. **微服务拆分**
|
||||
- 将核心功能拆分为独立微服务
|
||||
- 减少服务间耦合
|
||||
- 提高系统可扩展性
|
||||
|
||||
2. **消息队列引入**
|
||||
- 使用专业消息队列替代Redis Stream
|
||||
- 提高消息处理可靠性
|
||||
- 实现消息持久化
|
||||
|
||||
3. **API优化**
|
||||
- 实现RESTful API设计
|
||||
- 增加API版本控制
|
||||
- 优化API响应时间
|
||||
|
||||
## 6. 代码质量分析
|
||||
|
||||
### 6.1 代码结构
|
||||
|
||||
- **优点**:模块划分清晰,职责明确
|
||||
- **缺点**:部分模块代码过于庞大,可维护性差
|
||||
|
||||
### 6.2 命名规范
|
||||
|
||||
- **优点**:大部分代码遵循C#命名规范
|
||||
- **缺点**:部分变量和方法命名不够清晰
|
||||
|
||||
### 6.3 注释文档
|
||||
|
||||
- **优点**:关键方法有注释说明
|
||||
- **缺点**:部分复杂逻辑缺少注释,文档不完善
|
||||
|
||||
### 6.4 异常处理
|
||||
|
||||
- **优点**:大部分异常有捕获和处理
|
||||
- **缺点**:部分异常处理过于简单,缺少详细日志
|
||||
|
||||
### 6.5 代码重复
|
||||
|
||||
- **问题**:存在较多代码重复现象
|
||||
- **建议**:提取公共方法,减少代码冗余
|
||||
|
||||
## 7. 总结与建议
|
||||
|
||||
### 7.1 系统优势
|
||||
|
||||
1. **成熟稳定**:系统经过长期运行验证,核心功能稳定可靠
|
||||
2. **功能完善**:涵盖了酒店RCU管理的核心功能
|
||||
3. **扩展性好**:支持多种智能设备集成
|
||||
4. **实时性强**:基于UDP的通信机制保证了实时性
|
||||
|
||||
### 7.2 系统劣势
|
||||
|
||||
1. **技术栈陈旧**:使用的技术较为古老,缺乏现代化特性
|
||||
2. **性能瓶颈**:在高并发场景下存在性能瓶颈
|
||||
3. **代码质量**:部分代码质量较差,维护成本高
|
||||
4. **存储优化不足**:Redis使用不够充分,未完全发挥其优势
|
||||
|
||||
### 7.3 改进建议
|
||||
|
||||
1. **技术栈升级**:
|
||||
- 考虑使用.NET Core/5+替代传统.NET Framework
|
||||
- 引入现代化的缓存和消息队列解决方案
|
||||
|
||||
2. **架构重构**:
|
||||
- 采用微服务架构,提高系统可扩展性
|
||||
- 引入容器化部署,简化运维
|
||||
|
||||
3. **存储优化**:
|
||||
- 进一步扩大Redis的使用范围
|
||||
- 优化缓存策略,提高缓存命中率
|
||||
- 建立更可靠的数据同步机制
|
||||
|
||||
4. **代码质量提升**:
|
||||
- 进行代码重构,提高可维护性
|
||||
- 引入代码规范检查工具
|
||||
- 完善单元测试和集成测试
|
||||
|
||||
5. **监控与告警**:
|
||||
- 建立完善的系统监控体系
|
||||
- 实现智能告警机制
|
||||
- 提供可视化的系统运行状态 dashboard
|
||||
|
||||
### 7.4 结论
|
||||
|
||||
本系统作为一个运行多年的物联网系统,虽然架构较为古老,但核心功能稳定可靠。通过合理的优化和重构,可以显著提升系统性能和可维护性,延长系统生命周期。建议在保持系统稳定性的前提下,逐步推进技术升级和架构优化,以适应不断增长的业务需求和技术发展趋势。
|
||||
Reference in New Issue
Block a user