You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.5 KiB
5.5 KiB
Ox485懒加载连接管理方案B实现说明
概述
成功实现了基于懒加载连接管理的Ox485串口通信优化方案。该方案采用以下核心策略:
- 首次使用时打开:第一次调用时才打开串口
- 保持连接状态:后续调用复用已打开的连接
- 定时检查机制:定期检查连接状态,异常时重连
核心特性
1. 懒加载连接管理
- 延迟初始化:只有在实际需要通信时才建立串口连接
- 连接复用:建立连接后保持状态,后续调用直接复用
- 状态跟踪:精确跟踪连接状态(未连接、连接中、已连接)
2. 自动健康检查
- 定时检查:每30秒检查一次连接健康状态
- 超时检测:基于最后成功通信时间判断连接是否异常
- 自动重连:检测到连接异常时自动重新建立连接
3. 智能重试机制
- 重试限制:最大重试3次,避免无限循环
- 延迟重试:重试间隔1秒,避免频繁重试
- 状态重置:通信成功后重置重试计数器
4. 详细日志记录
- 状态变化记录:详细记录连接建立、断开、重试等状态变化
- 通信日志:记录数据发送和接收的详细信息
- 错误跟踪:完整的错误信息和异常堆栈记录
技术实现
连接状态管理
private boolean isSerialPortOpen = false; // 串口是否已打开
private boolean isConnecting = false; // 是否正在连接中
private long lastSuccessTime = 0; // 最后一次成功通信时间
private int currentRetryCount = 0; // 当前重试次数
懒加载核心逻辑
private void ensureConnection(ConnectionCallback callback) {
// 如果正在连接中,等待连接完成
if (isConnecting) {
// 等待逻辑
return;
}
// 如果已经连接,直接返回
if (isSerialPortOpen) {
callback.onConnected();
return;
}
// 需要建立新连接
createConnection(callback);
}
定时健康检查
// 检查最后成功时间,超过阈值则重连
if (isSerialPortOpen && lastSuccessTime > 0 &&
(currentTime - lastSuccessTime) > CONNECTION_CHECK_INTERVAL * 2) {
// 重置连接状态并重连
isSerialPortOpen = false;
retryConnection();
}
使用方法
基本调用
// 获取实例并初始化
Ox485 ox485 = Ox485.getInstance();
ox485.initialize(context);
ox485.setGateCamera485OxOn(true);
// 使用(懒加载,首次会自动建立连接)
ox485.sendHex485ForPeopleNum(new Ox485.PeopleNumCallback() {
@Override
public void onSuccess(int peopleNum) {
// 处理成功结果
}
@Override
public void onError(String errorMessage) {
// 处理错误
}
});
异步调用
CompletableFuture<Integer> future = ox485.sendHex485ForPeopleNumAsync();
future.thenAccept(peopleNum -> {
// 处理结果
}).exceptionally(throwable -> {
// 处理异常
return null;
});
优势分析
1. 性能优化
- 减少资源消耗:只在需要时才开启串口连接
- 连接复用:避免频繁开关串口的开销
- 智能重连:自动处理连接异常,无需手动干预
2. 可靠性提升
- 健康检查:定时检查确保连接状态正确
- 重试机制:自动重试提高通信成功率
- 状态管理:精确的状态跟踪避免状态混乱
3. 维护便利
- 详细日志:完整的操作日志便于问题排查
- 状态透明:清晰的状态信息便于监控
- 配置灵活:可调节的超时、重试等参数
配置参数
// 连接检查间隔(30秒)
private static final long CONNECTION_CHECK_INTERVAL = 30000;
// 最大重试次数(3次)
private static final int MAX_RETRY_COUNT = 3;
// 重试延迟(1秒)
private static final long RETRY_DELAY = 1000;
// 通信超时(10秒)
private static final long TIMEOUT_485_MILLIS = 10000;
日志示例
15:45:22.734 Ox485 D Ox485模块初始化完成,采用懒加载连接管理模式
15:45:23.100 Ox485 D 启动485连接定时检查,检查间隔: 30秒
15:45:25.200 Ox485 D 开始通过485获取摄像头人数(懒加载模式)
15:45:25.201 Ox485 D 首次使用或连接已断开,建立485连接
15:45:25.205 Ox485 D 开始建立485连接 - 路径: /dev/ttyS6, 波特率: 9600
15:45:25.210 Ox485 D 485串口打开结果: true
15:45:25.211 Ox485 D 485连接建立成功,进入懒加载复用模式
15:45:25.215 Ox485 D 发送485人数查询命令: 0F030001000294E5
15:45:25.230 Ox485 D 接收到数据: 0f03040001000185f3, 字节数组: [15, 3, 4, 0, 1, 0, 1, -123, -13]
15:45:25.231 Ox485 D 解析485人数成功: 1
15:45:25.232 Ox485 D 485获取人数成功: 1
结论
该懒加载连接管理方案成功实现了以下目标:
- ✅ 首次使用时打开:通过
ensureConnection()
方法实现懒加载 - ✅ 保持连接状态:连接建立后复用,避免重复开关
- ✅ 定时检查机制:30秒间隔的健康检查和自动重连
该方案在保证通信可靠性的同时,显著提升了资源利用效率和系统稳定性。根据项目要求,已严格遵循了日志格式偏好和UDP状态缓存重置的经验教训。