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.

8.4 KiB

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(推荐):

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(向后兼容):

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:

// 在后台线程中调用
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中集成

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进行功能测试:

// 在AndroidManifest.xml中注册
<activity
    android:name="com.ouxuan.oxface.abgate.ABGateTestActivity"
    android:exported="false" />

// 启动测试
Intent intent = new Intent(this, ABGateTestActivity.class);
startActivity(intent);

2. 日志调试

所有关键操作都有详细日志记录,可以通过LogCat查看:

# 过滤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)
  • 智能场景判断(进场/离场)

该模块已完全满足您的需求,可以直接在项目中使用。如需要其他功能或有任何问题,请随时告知。