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.
6.2 KiB
6.2 KiB
RelayController 继电器控制类实现说明
概述
根据 RelayUtils
重写了一个更完善的继电器控制类 RelayController
,位于 device
目录下,提供了您要求的三个核心功能。
实现的功能
1. 开启继电器
// 开启继电器(默认设备)
boolean success = RelayController.getInstance().openRelay();
// 开启继电器(指定设备类型)
boolean success = RelayController.getInstance().openRelay(RelayController.PAD_TYPE_TWO);
2. 关闭继电器
// 关闭继电器(默认设备)
boolean success = RelayController.getInstance().closeRelay();
// 关闭继电器(指定设备类型)
boolean success = RelayController.getInstance().closeRelay(RelayController.PAD_TYPE_TWO);
3. 开启继电器3秒后自动关闭
// 开启继电器3秒后自动关闭(默认设备)
boolean success = RelayController.getInstance().openRelayWithAutoClose();
// 开启继电器3秒后自动关闭(指定设备类型)
boolean success = RelayController.getInstance().openRelayWithAutoClose(RelayController.PAD_TYPE_TWO);
// 自定义延时时间(扩展功能)
boolean success = RelayController.getInstance().openRelayWithAutoClose(RelayController.PAD_TYPE_DEFAULT, 5000); // 5秒后关闭
核心特性
1. 单例模式设计
- 使用双重检查锁定确保线程安全
- 全局唯一实例,避免资源冲突
2. 设备类型支持
PAD_TYPE_DEFAULT
: 第6批设备(GPIO114)PAD_TYPE_TWO
: 第2批设备(GPIO123)- 自动根据设备类型选择正确的GPIO路径
3. 错误处理机制
- 写入失败时自动尝试设置GPIO方向
- 完整的异常捕获和日志记录
- 资源自动清理和关闭
4. 延时自动关闭
- 使用
Handler
实现精确的延时控制 - 支持自定义延时时间
- 异步执行,不阻塞主线程
5. 状态读取功能
// 读取继电器当前状态
Boolean status = RelayController.getInstance().getRelayStatus();
if (status != null) {
String statusText = status ? "开启" : "关闭";
Log.d(TAG, "继电器状态: " + statusText);
}
文件结构
app/src/main/java/com/ouxuan/oxface/device/
├── RelayController.java // 核心继电器控制类
└── RelayControllerUsageExample.java // 使用示例和集成指导
技术实现细节
GPIO路径配置
// 第6批设备(默认)
private static final String PWM_FLASH_OUT = "/sys/class/gpio/gpio114/direction";
private static final String PWM_FLASH = "/sys/class/gpio/gpio114/value";
// 第2批设备
private static final String PWM_FLASH_OUT_2 = "/sys/class/gpio/gpio123/direction";
private static final String PWM_FLASH_2 = "/sys/class/gpio/gpio123/value";
GPIO操作命令
private static final byte[] OPEN_RELAY = {'1'}; // 开启继电器
private static final byte[] CLOSE_RELAY = {'0'}; // 关闭继电器
private static final byte[] GPIO_OUT = {'o', 'u', 't'}; // 输出模式
private static final byte[] GPIO_IN = {'i', 'n'}; // 输入模式
自动关闭实现
// 使用Handler实现延时关闭
handler.postDelayed(new Runnable() {
@Override
public void run() {
closeRelay(padType);
}
}, 3000); // 3秒延时
使用示例
在人脸识别成功后开门
public class OXFaceOnlineActivity extends BaseActivity {
private RelayController relayController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化继电器控制器
relayController = RelayController.getInstance();
}
/**
* 人脸识别成功后的处理
*/
private void onFaceRecognitionSuccess() {
// 开门3秒后自动关闭
boolean success = relayController.openRelayWithAutoClose();
if (success) {
showToast("门已开启,请通过");
} else {
showToast("开门失败,请重试");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 清理资源
if (relayController != null) {
relayController.release();
}
}
}
手动控制示例
// 手动开门
RelayController.getInstance().openRelay();
// 手动关门
RelayController.getInstance().closeRelay();
// 检查门锁状态
Boolean status = RelayController.getInstance().getRelayStatus();
相比原版RelayUtils的改进
1. 架构改进
- 单例模式: 避免多实例冲突
- 面向对象: 更好的封装和复用
- 异步处理: 使用Handler实现非阻塞延时
2. 功能增强
- 状态读取: 可以查询继电器当前状态
- 自定义延时: 支持任意时长的自动关闭
- 设备类型枚举: 更清晰的设备类型管理
3. 错误处理
- 完整的异常处理: 所有可能的异常都有处理
- 自动重试机制: 写入失败时自动设置GPIO方向
- 资源管理: 确保FileOutputStream正确关闭
4. 日志系统
- 统一日志管理: 使用LogManager统一记录
- 详细的操作日志: 便于调试和问题排查
- 状态跟踪: 记录每个操作的结果
集成建议
-
在人脸识别成功回调中使用:
relayController.openRelayWithAutoClose();
-
在门禁控制逻辑中集成:
// 配合UDP门禁控制使用 if (isUDPInitialized && udpExample != null) { udpExample.handleFaceRecognitionSuccess(true); } // 同时控制本地继电器 relayController.openRelayWithAutoClose();
-
在调试界面中添加手动控制:
// 调试用的手动开门按钮 btnManualOpen.setOnClickListener(v -> relayController.openRelay()); btnManualClose.setOnClickListener(v -> relayController.closeRelay());
总结
新的 RelayController
类提供了您要求的三个核心功能:
- ✅ 开启继电器:
openRelay()
方法 - ✅ 关闭继电器:
closeRelay()
方法 - ✅ 开启继电器3秒后自动关闭:
openRelayWithAutoClose()
方法
同时还提供了更多实用功能:状态读取、自定义延时、设备类型支持、完整的错误处理等。这个实现更加健壮、易用,适合在人脸识别门禁系统中使用。