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