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
中控开门功能完善说明
概述
基于您提供的JavaScript代码和API信息,我已经完善了GateAB门禁控制模块中的网络开门功能,实现了与中控设备的API通信。
新增内容
1. PadApiService 接口扩展
在 PadApiService.java
中新增了中控开门相关接口和数据模型:
API接口
/**
* 中控开门接口
* 从AC获取数据 - 中控通用内网地址
* @param request 中控开门请求体
* @return 中控开门响应
*/
@POST("Api/Acmd/StartUp/TApi.json")
Call<ApiResponse<GateControlResult>> controlGateFromAC(@Body GateControlRequest request);
数据模型
- GateControlRequest: 中控开门请求模型
- GateControlValue: 请求值模型(当前为空对象,可扩展)
- GateControlResult: 中控开门响应模型
- GateData: 门状态数据模型
2. NetworkConfig 配置扩展
在 NetworkConfig.java
中添加了中控设备配置:
// 中控设备配置
// 中控通用内网地址,工程部确认所有设备都一致
public static final String AC_CONTROL_BASE_URL = "http://192.168.1.100:80/";
// 中控API路径
public static final String AC_API_PATH = "Api/Acmd/StartUp/TApi.json";
// 完整的中控API地址
public static final String AC_CONTROL_URL = AC_CONTROL_BASE_URL + AC_API_PATH;
3. GateABController 网络开门实现
完善了 executeNetworkOpenGate()
方法的具体实现:
功能特性
- 网络服务初始化: 自动初始化Retrofit网络服务
- 请求构建: 按照JavaScript代码格式构建请求参数
- 异步回调: 使用Retrofit异步请求,避免阻塞UI线程
- 错误处理: 完整的网络错误和业务错误处理
- 状态解析: 解析门状态数据(gate_a, gate_b)
- 日志记录: 详细的调试日志,便于问题排查
请求格式
{
"name": "gate",
"value": {}
}
响应格式
{
"code": 0,
"data": {
"gate_a": "close",
"gate_b": "open",
"timestamp": 1694443200
},
"message": ""
}
开门逻辑流程
更新后的完整开门流程:
1. 检查AB门状态 -> 获取配置参数
2. 验证开门条件 -> 检查门是否关闭
3. 选择开门方式(按优先级):
├─ GPIO继电器开门(第一优先级)
├─ UDP控制开门(第二优先级)
└─ 网络接口开门(第三优先级)👈 新增实现
4. 执行开门操作 -> 回调结果
网络开门实现细节
1. 自动重试机制
// 使用Retrofit的默认重试机制
// 网络超时时自动重试
2. 错误分类处理
- 网络连接错误: DNS解析失败、连接超时等
- HTTP错误: 404、500、502等HTTP状态码
- 业务错误: 中控返回的错误码和错误信息
- 解析错误: JSON解析失败等
3. 状态码处理
- code = 0: 开门成功
- code ≠ 0: 开门失败,显示具体错误信息
4. 门状态监控
- 解析返回的门状态数据
- 记录A门和B门的当前状态
- 支持后续状态查询和验证
调试和日志
关键日志点
LogManager.logInfo(TAG, "发送中控开门请求: name=" + request.getName());
LogManager.logInfo(TAG, "中控开门成功: code=" + result.getCode());
LogManager.logInfo(TAG, "门状态 - A门: " + gateData.getGateA() + ", B门: " + gateData.getGateB());
LogManager.logError(TAG, "中控开门失败: " + errorMsg);
调试建议
- 检查网络连接:确保设备能访问
192.168.1.100:80
- 查看LogCat:搜索
GateABController
标签 - 验证响应格式:确认中控返回的JSON格式
- 测试网络延迟:检查网络请求响应时间
集成测试
测试步骤
-
基础连通性测试:
GateABController controller = GateABController.getInstance(); controller.initialize(context); // 设置配置为仅使用网络开门 // gateAbGpio = false, gateAbUdp = false controller.openGateAB(callback);
-
错误情况测试:
- 网络断开情况
- 中控设备离线情况
- 错误的响应格式
-
性能测试:
- 网络请求响应时间
- 并发请求处理
- 内存使用情况
与JavaScript代码的对应关系
JavaScript | Android | 说明 |
---|---|---|
servers.get() |
retrofit.create().controlGateFromAC() |
网络请求方法 |
API.getDateFromAC |
NetworkConfig.AC_CONTROL_URL |
API地址配置 |
{"name": "gate", "value": {}} |
GateControlRequest |
请求参数结构 |
res.data.code == 0 |
result.isSuccess() |
成功状态判断 |
res.data.data.gate_a |
gateData.getGateA() |
门状态获取 |
安全考虑
- 网络安全: 使用内网地址,降低外部攻击风险
- 输入验证: 对API响应进行格式验证
- 错误隐藏: 不在用户界面显示敏感的技术错误信息
- 超时控制: 设置合理的网络超时时间,避免长时间等待
后续优化建议
- 缓存机制: 缓存最近的门状态,减少网络请求
- 重试策略: 实现指数退避的重试机制
- 监控告警: 添加网络请求失败的监控和告警
- 配置化: 将中控IP地址配置化,支持不同环境
总结
现在GateAB门禁控制模块已经完整支持三种开门方式:
- ✅ GPIO继电器开门
- ✅ UDP控制开门
- ✅ 网络接口开门(新增完善)
网络开门功能完全按照您提供的JavaScript逻辑实现,支持与中控设备的标准API通信,具有完整的错误处理和日志记录功能。