oxFaceAndroid
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

中控开门功能完善说明

概述

基于您提供的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);

调试建议

  1. 检查网络连接:确保设备能访问 192.168.1.100:80
  2. 查看LogCat:搜索 GateABController 标签
  3. 验证响应格式:确认中控返回的JSON格式
  4. 测试网络延迟:检查网络请求响应时间

集成测试

测试步骤

  1. 基础连通性测试

    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通信,具有完整的错误处理和日志记录功能。