Files
Web_CRICS_Server_VS2010_Prod/物联网系统项目分析报告.md

406 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 物联网系统项目分析报告
## 1. 项目概览
本项目是一个基于UDP通信的物联网系统主要用于酒店客房RCURoom 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 结论
本系统作为一个运行多年的物联网系统,虽然架构较为古老,但核心功能稳定可靠。通过合理的优化和重构,可以显著提升系统性能和可维护性,延长系统生命周期。建议在保持系统稳定性的前提下,逐步推进技术升级和架构优化,以适应不断增长的业务需求和技术发展趋势。