# AB门禁模块实现说明 ## 概述 根据您的需求,我已经实现了完整的AB门禁模块,包含门状态检查和人数检测功能。该模块通过UDP获取AB门状态,通过485串口获取门禁内人数,并根据进场/离场场景提供智能判断。 ## 核心组件 ### 1. ABGateManager.java **位置**: `app/src/main/java/com/ouxuan/oxface/abgate/ABGateManager.java` **功能**: AB门禁管理器核心类 **主要方法**: - `checkGateABBeforeToDo()` - 完整检查流程(门状态 + 人数) - `ABGateCheck()` - 门状态检查(A门关闭 AND B门关闭) - `ABPeopleCheck()` - 人数检查(根据进场/离场场景判断) ### 2. ABGateUsageExample.java **位置**: `app/src/main/java/com/ouxuan/oxface/abgate/ABGateUsageExample.java` **功能**: 使用示例和集成指南 ### 3. ABGateTestActivity.java **位置**: `app/src/main/java/com/ouxuan/oxface/abgate/ABGateTestActivity.java` **功能**: 测试界面,方便调试验证 ## 核心功能实现 ### ✅ checkGateABBeforeToDo() - 主要入口方法 **新的同步API(推荐)**: ```java ABGateManager abGateManager = ABGateManager.getInstance(); abGateManager.initialize(context); // 在后台线程中调用(避免阻塞主线程) new Thread(() -> { try { boolean canProceed = abGateManager.checkGateABBeforeToDo(); // 切换到主线程处理结果 runOnUiThread(() -> { if (canProceed) { // AB门检查通过,可以进行人脸识别 startFaceRecognition(); } else { // AB门检查未通过,需要等待 showWaitingMessage(); } }); } catch (Exception e) { // 处理检查异常 LogManager.logError(TAG, "AB门检查异常", e); } }).start(); ``` **异步API(向后兼容)**: ```java abGateManager.checkGateABBeforeToDoAsync(new ABGateManager.ABGateCheckCallback() { @Override public void onSuccess(boolean canProceed) { if (canProceed) { // AB门检查通过,可以进行后续操作 LogManager.logInfo(TAG, "AB门检查通过,可以进行人脸识别"); } else { // AB门检查未通过,需要等待 LogManager.logWarning(TAG, "AB门检查未通过,请等待"); } } @Override public void onError(String errorMessage) { // 检查失败,处理错误 LogManager.logError(TAG, "AB门检查失败: " + errorMessage); } }); ### ✅ ABGateCheck() - 门状态检查 **检查逻辑**: A门关闭 AND B门关闭 时返回true,否则返回false **实现方式**: 1. 通过UDP向 `192.168.1.123:60000` 发送状态查询命令 2. 解析返回数据的第28位(A门状态)和第29位(B门状态) 3. 01表示开启,00表示关闭 4. 只有当A门和B门都关闭时才返回true **新的同步API**: ```java // 在后台线程中调用 new Thread(() -> { try { boolean gateAvailable = abGateManager.ABGateCheck(); // gateAvailable = true: A门关闭 AND B门关闭 // gateAvailable = false: A门或B门有开启状态 runOnUiThread(() -> { if (gateAvailable) { showMessage("门已全部关闭,可用"); } else { showMessage("有门开启,不可用"); } }); } catch (Exception e) { // UDP通信失败或解析错误 LogManager.logError(TAG, "门状态检查异常", e); } }).start(); ``` ### ✅ ABPeopleCheck() - 人数检查 **检查逻辑**: - **进场设备**: 门内人数 > 1 时不可用(返回false) - **离场设备**: 门内人数 != 0 时不可用(返回false) **实现方式**: 1. 使用`VenueSceneUtils.isLeaveScene(context)`判断进场/离场 2. 通过485串口发送HEX命令 `0F030001000294E5` 3. 解析返回的9字节数据,第5字节为人数 4. 根据场景类型应用不同的判断逻辑 **新的同步API**: ```java // 在后台线程中调用 new Thread(() -> { try { boolean peopleCheckPassed = abGateManager.ABPeopleCheck(); // 进场: peopleCheckPassed = (人数 <= 1) // 离场: peopleCheckPassed = (人数 == 0) runOnUiThread(() -> { if (peopleCheckPassed) { showMessage("人数符合要求"); } else { showMessage("人数不符合要求"); } }); } catch (Exception e) { // 485通信失败或485模式未启用 LogManager.logError(TAG, "人数检查异常", e); } }).start(); ``` ## 在人脸识别界面中的集成 ### 在OXFaceOnlineActivity中集成 ```java public class OXFaceOnlineActivity extends BaseActivity { private ABGateManager abGateManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化AB门禁管理器 abGateManager = ABGateManager.getInstance(); abGateManager.initialize(this); } // 在人脸识别成功前执行检查 private void checkBeforeFaceRecognition() { abGateManager.checkGateABBeforeToDo(new ABGateManager.ABGateCheckCallback() { @Override public void onSuccess(boolean canProceed) { if (canProceed) { // 可以进行人脸识别 startFaceRecognition(); } else { // 需要等待,可以设置延迟重试 showWaitingMessage(); scheduleRetryCheck(); } } @Override public void onError(String errorMessage) { // 处理检查错误 handleCheckError(errorMessage); } }); } @Override protected void onDestroy() { super.onDestroy(); if (abGateManager != null) { abGateManager.release(); } } } ``` ## 配置要求 ### 1. UDP门禁配置 - **IP地址**: 192.168.1.123 - **端口**: 60000 - **协议**: UDP状态查询命令 ### 2. 485串口配置 - **串口路径**: /dev/ttyS6 - **波特率**: 9600 - **命令**: 0F030001000294E5 - **需要启用**: `gate_camera_485_OX_on = true` ### 3. 场景配置 通过`VenueSceneUtils.isLeaveScene(context)`自动判断进场/离场场景 ## 错误处理 ### 常见错误和解决方案 1. **"UDP门禁控制器未初始化"** - 确保在调用前初始化了OxUDP模块 - 检查网络连接和UDP配置 2. **"485模式未启用"** - 检查配置中 `gate_camera_485_OX_on` 是否为true - 确保485串口权限正确 3. **"门状态检查超时"** - 检查网络连接 - 确认UDP设备地址和端口正确 4. **"485人数获取失败"** - 检查串口连接 - 确认串口路径和波特率设置 ## 测试验证 ### 1. 使用测试Activity 可以通过`ABGateTestActivity`进行功能测试: ```java // 在AndroidManifest.xml中注册 // 启动测试 Intent intent = new Intent(this, ABGateTestActivity.class); startActivity(intent); ``` ### 2. 日志调试 所有关键操作都有详细日志记录,可以通过LogCat查看: ```bash # 过滤AB门禁相关日志 adb logcat | grep -E "(ABGateManager|OxUDP|Ox485)" ``` ## 性能优化 ### 1. 超时控制 - 门状态检查:5秒超时 - 人数检查:10秒超时 - 总体检查:最多17秒完成 ### 2. 异步处理 - 所有网络和串口操作都在后台线程执行 - 回调在主线程中触发,便于UI更新 ### 3. 资源管理 - 支持单例模式,避免重复初始化 - 提供release()方法清理资源 ## 总结 ✅ **已完成功能**: 1. `checkGateABBeforeToDo()` - 完整检查流程 2. `ABGateCheck()` - AB门状态检查(A门关闭 AND B门关闭) 3. `ABPeopleCheck()` - 人数检查(进场/离场智能判断) 4. 完整的错误处理和超时控制 5. 详细的使用示例和测试界面 ✅ **集成方式**: - 在人脸识别前调用`checkGateABBeforeToDo()` - 支持异步回调和同步阻塞两种方式 - 提供完整的错误处理机制 ✅ **技术实现**: - UDP通信获取门状态(192.168.1.123:60000) - 485串口通信获取人数(/dev/ttyS6, 9600) - 智能场景判断(进场/离场) 该模块已完全满足您的需求,可以直接在项目中使用。如需要其他功能或有任何问题,请随时告知。