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.9 KiB
8.9 KiB
腾讯云MQTT模块集成完成说明
概述
已成功将腾讯云MQTT模块集成到oxFaceAndroid项目中,实现了MQTT连接管理、自动重连、消息订阅处理和门闸控制功能。
实现的功能
1. MQTT连接管理
- 自动连接: 初始化后自动连接腾讯云IoT平台
- 自动重连: 网络断线后自动重连机制,支持渐进式延迟重连
- 健康检查: 30秒周期性检查连接状态,确保连接稳定性
- 连接状态监控: 实时监控连接状态变化并通知上层应用
2. 消息处理功能
- 门闸控制: 接收MQTT门闸控制命令,自动调用AB门开门操作
- 设备重启: 接收重启命令(框架已实现,具体重启逻辑可按需扩展)
- 日志查询: 响应日志级别查询命令,自动上报设备信息
- 通用消息: 支持接收和处理其他类型的MQTT消息
3. 网络状态集成
- 状态显示: MQTT连接状态已集成到网络详情弹窗中
- 状态同步: 与现有网络状态指示器无缝结合
技术实现
核心类文件
1. MqttManager.java
位置: app/src/main/java/com/ouxuan/oxface/device/MqttManager.java
主要功能:
- 单例模式管理MQTT连接
- 腾讯云IoT平台认证和连接
- 消息订阅和发布
- 自动重连和健康检查
- 门闸控制命令处理
关键配置:
private static final String PRODUCT_ID = "WZX68L5I75";
private static final String DEV_PSK = "7udrYcfTVThbzdMlLT9fHQ==";
private static final String PRODUCT_KEY = "qr3rximCZnT6ZU0NsAAiTC7O";
private static final String BROKER_URL = null; // 使用腾讯云IoT默认地址
2. MqttManagerUsageExample.java
位置: app/src/main/java/com/ouxuan/oxface/device/MqttManagerUsageExample.java
功能: 提供完整的MQTT管理器使用示例,包括初始化、消息处理、状态监控等
集成点
1. OXFaceOnlineActivity.java集成
- onCreate: 初始化MQTT管理器
- onDestroy: 释放MQTT资源
- 消息处理: 集成门闸控制、设备重启、信息上报等功能
2. NetworkStatusIndicator.java集成
- 网络详情: MQTT连接状态显示在网络详情弹窗中
- 状态同步: 与网络状态变化联动
依赖库配置
build.gradle添加
// 腾讯云IoT Hub SDK
implementation 'com.tencent.iot.hub:hub-device-android:3.3.23'
AndroidManifest.xml权限
已包含所需权限(INTERNET、WAKE_LOCK等)
MQTT消息格式
设备注册格式
// 对应uniapp的mqttRegister
{
"devName": "PadV6" + deviceId,
"productID": "WZX68L5I75",
"productKey": "qr3rximCZnT6ZU0NsAAiTC7O"
}
订阅主题
- 格式:
WZX68L5I75/{deviceName}/control
- 示例:
WZX68L5I75/PadV6abc123456789/control
消息类型处理
1. 门闸控制消息
{
"gate": "{\"id\":\"\",\"name\":\"gate\",\"token\":\"\",\"value\":{\"cid\":\"1\",\"tcp\":\"127.0.0.1:10000\"},\"is_delay\":true,\"delay_time\":\"\",\"notice_url\":\"\",\"is_async\":false,\"queue_group\":\"gate\"}"
}
处理: 自动调用gateABController.openGateAB()
执行AB门开门操作
2. 设备重启消息
{
"info": "{\"id\":\"\",\"name\":\"reboot-pad\",\"token\":\"\",\"value\":{},\"is_delay\":true,\"delay_time\":\"\",\"notice_url\":\"\",\"is_async\":true,\"queue_group\":\"\"}"
}
处理: 触发设备重启流程(可扩展实现)
3. 日志级别查询消息
{
"info": "...get_log_level..."
}
处理: 自动上报设备信息到数据主题
发布主题
- 格式:
WZX68L5I75/{deviceName}/data
- 用途: 设备信息上报、状态反馈等
重连机制
自动重连策略
- 最大重连次数: 5次
- 重连延迟: 渐进式延迟(5秒 × 重连次数)
- 触发条件:
- 连接失败
- 连接丢失
- 健康检查发现异常
健康检查
- 检查间隔: 30秒
- 检查内容: 客户端连接状态一致性
- 异常处理: 自动触发重连
网络状态集成
显示内容
在网络详情弹窗中新增MQTT状态行:
MQTT状态:MQTT已连接
MQTT状态:MQTT连接中...
MQTT状态:MQTT重连中(2/5)
MQTT状态:MQTT未连接
状态获取
MqttManager mqttManager = MqttManager.getInstance();
String mqttStatus = mqttManager.getConnectionStatusDetail();
使用示例
基本使用
// 在Activity中初始化
MqttManager mqttManager = MqttManager.getInstance();
mqttManager.initialize(context);
// 设置监听器
mqttManager.setConnectionStatusListener(listener);
mqttManager.setMessageReceivedListener(listener);
// 发送消息
String topic = "WZX68L5I75/" + deviceName + "/data";
String message = "{\"test\": \"data\"}";
mqttManager.publishMessage(topic, message);
// 释放资源(在onDestroy中)
mqttManager.release();
门闸控制集成
门闸控制已自动集成,无需额外代码:
- 接收MQTT门闸控制消息
- 自动解析命令内容
- 调用现有
GateABController.openGateAB()
- 执行完整的AB门开门流程
设备信息上报
当收到日志级别查询命令时,自动上报:
{
"deviceId": "abc123456789",
"deviceModel": "SM-G950F",
"deviceBrand": "samsung",
"androidVersion": "9",
"timestamp": 1694443200000
}
日志监控
关键日志标签
MqttManager
: MQTT连接、消息处理NetworkStatusIndicator
: 网络状态(包含MQTT状态)OXFaceOnlineActivity
: MQTT集成和初始化
日志示例
15:45:22.734 MqttManager D 接收到MQTT消息,主题: WZX68L5I75/PadV6abc123/control, 内容: {"gate":"..."}
15:45:22.735 MqttManager I MQTT接收到门闸控制命令: ...
15:45:22.736 GateABController I 开始执行AB门开门操作
配置参数
MQTT连接参数
参数 | 值 | 说明 |
---|---|---|
BROKER_URL | ssl://iotcloud-mqtt.gz.tencentcloudapi.com:8883 | 腾讯云IoT MQTT地址 |
KEEP_ALIVE_INTERVAL | 60秒 | 心跳间隔 |
CONNECTION_TIMEOUT | 30秒 | 连接超时 |
QOS | 1 | 消息质量等级 |
重连参数
参数 | 值 | 说明 |
---|---|---|
MAX_RECONNECT_ATTEMPTS | 5 | 最大重连次数 |
RECONNECT_DELAY | 5000ms | 基础重连延迟 |
HEALTH_CHECK_INTERVAL | 30000ms | 健康检查间隔 |
故障排除
常见问题
1. MQTT连接失败
可能原因:
- 网络连接问题
- 设备认证参数错误
- 腾讯云IoT平台服务异常
排查方法:
adb logcat | grep "MqttManager"
2. 门闸控制无响应
可能原因:
- MQTT消息格式不正确
- GateABController未正确初始化
- AB门当前状态不允许开门
排查方法:
adb logcat | grep -E "(MqttManager|GateABController)"
3. 重连失败
可能原因:
- 达到最大重连次数限制
- 网络环境持续异常
- 设备PSK密钥过期
解决方法:
- 检查网络连接
- 重启应用重置重连计数
- 验证设备认证信息
调试建议
- 开启详细日志: LogManager.logLevel设置为DEBUG
- 监控网络状态: 观察网络状态指示器的MQTT状态显示
- 测试门闸控制: 通过腾讯云IoT控制台发送测试消息
- 检查设备信息: 验证设备ID和认证参数正确性
性能优化
内存管理
- 使用单例模式避免多实例
- 及时释放资源,防止内存泄漏
- 线程池复用,避免频繁创建销毁
网络优化
- 合理设置心跳间隔
- 实现渐进式重连延迟
- 异步消息处理,避免阻塞主线程
电量优化
- 使用SSL连接减少握手次数
- 合理设置健康检查间隔
- 后台状态下降低检查频率
扩展功能
未来可扩展的功能
- 设备状态上报: 定期上报设备运行状态
- 远程配置: 通过MQTT接收配置更新
- 日志收集: 实现远程日志收集和分析
- OTA升级: 支持远程固件升级通知
- 多设备管理: 支持一个账号管理多个设备
扩展示例
// 定期上报设备状态
public void reportDeviceStatus() {
JSONObject status = new JSONObject();
status.put("cpu", getCpuUsage());
status.put("memory", getMemoryUsage());
status.put("battery", getBatteryLevel());
status.put("timestamp", System.currentTimeMillis());
String topic = "WZX68L5I75/" + deviceName + "/status";
mqttManager.publishMessage(topic, status.toString());
}
总结
腾讯云MQTT模块已完全集成到oxFaceAndroid项目中,提供了:
✅ 完整的MQTT连接管理:自动连接、重连、健康检查 ✅ 门闸控制集成:接收MQTT命令自动执行AB门开门 ✅ 设备管理功能:重启控制、信息上报 ✅ 网络状态集成:MQTT状态显示在网络详情中 ✅ 可靠的错误处理:完善的异常处理和日志记录 ✅ 性能优化:资源管理、线程优化、电量优化
该实现完全满足了您的需求,提供了稳定可靠的MQTT通信能力,并与现有的门禁控制系统无缝集成。