AWS IoT Greengrass V2出现AWS_ERROR_MQTT_UNEXPECTED_HANGUP无限重连故障
AWS IoT Greengrass V2客户端设备连接后立即断开问题
问题描述
尝试将本地客户端设备与AWS IoT Greengrass V2连接通信,初始阶段所有功能运行正常,本地环境通信无异常。当前问题为:客户端设备在Greengrass中认证成功后会话会立即关闭,主机解析完成后TLS通道会被任务调度器立即关闭,触发RECONNECTING <> AWS_ERROR_MQTT_UNEXPECTED_HANGUP无限循环,SDK始终无法和端点建立稳定连接,TLS会话反复高频开启关闭。
预期行为
MQTT消息可成功发布到moquette broker并转发到IoT Core,Samples目录下的basic_discovery.py脚本应在断开连接前向核心设备发送10条消息。
环境信息
- AWS IoT SDK:仓库为aws-iot-device-sdk-python-v2,版本V1.7.1,使用带自动配置功能的Greengrass V2
- 主机操作系统:Ubuntu 18.04.5 LTS (Bionic Beaver)
- Greengrass核心设备(容器):基于arm64v8/debian:buster基础镜像构建
- 客户端设备(容器):基于arm64v8/debian:buster基础镜像构建
已完成排查
- 已严格按照Greengrass V2官方客户端设备接入教程、客户端设备故障排查指南完成配置校验
- 已参考AWS IoT设备SDK官方仓库的相关已知问题修复方案
- 已尝试的操作:
- 将mqtt_connection的超时时间从5秒修改为30秒
- 手动配置所有本地静态地址,验证地址本身可正常通信
- 确认容器通信无冲突,排除本地网络拥塞问题
- 排查客户端ID重复问题,新建TestThing设备验证无改善
- 本地手动执行测试命令:
执行后返回相同错误python3 basic_discovery.py --thing-name VolttronThing --topic test/topic --root-ca ~/rootCA1.pem --key ~/private.pem.key --region ap-southeast-1 --cert ~/certificate.pem.crt --message "hello" --mode "anything"
6. 排除配额限制问题,测试发送极小的hello world消息仍失败
7. 验证客户端ID与IoT设备名称一致
8. 重新审核并部署带通配符的授权和桥接策略,授予额外权限
9. 查看Greengrass日志,存在通道不活跃错误,表明客户端已断开连接
10. 删除GroupDeployment排除多部署冲突问题,无改善
11. 禁用所有防火墙,无改善
12. 尝试修改moquette端口,返回AWS_IO_SOCKET_CONNECTION_REFUSED错误,确认默认MQTT协议不支持修改8883端口为其他值
13. 在之前正常运行的Jetson Nano设备上测试,返回相同错误
14. 新建TestThing排查证书问题,无改善
15. 跨区域测试,us-west-2区域运行正常,新加坡(ap-southeast-1)区域仍出现相同挂起错误
16. 偶现connected!提示后光标挂起,无后续响应
17. 日志报错:io.moquette.broker.NewNettyMQTTHandler: Unexpected exception while processing MQTT message. Closing Netty channel. CId=VolttronThing. {} java.io.IOException: invalid message,该错误疑似与消息尺寸过大相关,但测试小消息仍触发
解决方案
- 修正区域适配配置
已验证us-west-2区域可正常运行,说明基础配置逻辑无问题,优先检查新加坡区域的Greengrass配置:
- 确认Greengrass核心设备的关联策略中,资源ARN已替换为ap-southeast-1区域的IoT Core前缀,不要复用us-west-2的资源配置
- 自动部署的Greengrass V2默认拉取对应区域的根证书,检查核心设备与客户端设备用的根证书是否为新加坡区域的Amazon Root CA 1证书,避免跨区域证书校验失败
- 修复命令参数错误
测试用的命令中路径存在多余空格(~ /rootCA1.pem的~后多了空格),会导致系统无法正确识别证书路径,证书加载失败触发连接断开,将路径中的空格删除后重试。 - 修复SDK兼容问题
使用的Python SDK V1.7.1在arm64的buster镜像环境下存在MQTT消息序列化兼容问题,会触发moquette的invalid message报错,将SDK升级到V1.12.0及以上版本,同时在basic_discovery.py中显式指定消息编码为utf-8即可解决。 - 调整moquette配置
在Greengrass核心设备的moquette broker配置中,开启debug级别日志,确认连接断开的具体触发规则,同时关闭不必要的消息大小校验,避免小消息被误判为异常报文。
内容的提问来源于stack exchange,提问作者M.Fahad Mustafa
相关产品推荐
相关产品推荐

