故障排查
Open IoT Platform 常见问题排查指南,涵盖服务端、数据库、MQTT、固件、BLE 和 Docker 等模块。
服务端问题
服务启动失败:端口被占用
错误信息:
listen tcp :48080: bind: address already in use解决方案:
bash
# 查找占用端口的进程
lsof -i :48080
# 终止进程
kill -9 <PID>
# 或修改 .env 中的端口
SERVER_PORT=48081Go 依赖下载失败
解决方案:
bash
# 使用国内代理
go env -w GOPROXY=https://goproxy.cn,direct
go mod download运行时 Panic
排查步骤:
bash
# 查看完整堆栈
docker compose logs iot-core --tail=100
# 常见原因:
# - 数据库连接失败 → 检查 DB_HOST / DB_PORT
# - 配置项缺失 → 检查 .env
# - 空指针 → 检查数据库数据完整性数据库问题
数据库连接失败
错误信息:
Error connecting to database: dial tcp 127.0.0.1:3306: connect: connection refused排查步骤:
检查 MySQL 容器状态:
bashdocker compose ps mysql检查网络连通性:
bashnc -zv localhost 48306检查配置:
bashcat .env | grep DB_ # Docker 部署时 DB_HOST 应为 mysql(服务名) # 本地运行时 DB_HOST 应为 localhost检查用户权限:
sqlSELECT user, host FROM mysql.user WHERE user='root'; GRANT ALL PRIVILEGES ON iot_platform.* TO 'root'@'%'; FLUSH PRIVILEGES;
表不存在
解决方案:
bash
# v0.3.0+ 自动初始化,重启服务即可
docker compose restart iot-core
# 手动初始化
docker exec -i iot-platform_mysql mysql -uroot -proot123456 iot_platform < scripts/init.sql慢查询
sql
-- 启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
-- 查看执行计划
EXPLAIN SELECT * FROM devices WHERE product_key = 'SW-SERVO-001';MQTT 问题
设备无法连接 MQTT
排查步骤:
检查 Broker 服务:
bashdocker compose ps # 确认 MQTT Broker 容器正常运行检查端口连通性:
bashnc -zv localhost 48883检查设备凭证:
bash# 查看数据库中的设备信息 docker exec -it iot-platform_mysql mysql -uroot -proot123456 iot_platform SELECT device_id, status, device_secret FROM devices WHERE device_id = 'your-device-id'; # 确认 status = 'active'检查 MQTT 连接参数:
c// ESP32 固件中确认 username = "productKey&deviceId" // 格式:产品Key & 设备ID password = "deviceSecret" // 设备密钥 port = 48883 // v0.3.0 端口使用 mosquitto 测试:
bashmosquitto_pub -h localhost -p 48883 -t "test/topic" -m "test"
设备状态显示不准确
原因:设备离线但列表仍显示在线
解决方案:
- 确认 Broker Webhook 已配置(上下线事件推送)
- 检查 Redis 缓存是否正常
- 重启后端触发一次全量同步
bash
# 查看同步日志
docker compose logs iot-core | grep "DeviceSync"MQTT 认证失败
错误码:
| 返回码 | 含义 |
|---|---|
| 5 | 认证失败(凭证无效) |
| 4 | 用户名或密码格式错误 |
| -1 | 网络连接失败 |
固件问题
WiFi 连接失败
排查步骤:
- 确认 WiFi 为 2.4GHz(ESP32 不支持 5GHz)
- 确认密码正确(注意大小写和特殊字符)
- 检查路由器是否限制了新设备接入
- 查看串口日志:bash
pio device monitor
BLE 配网失败
排查步骤:
- 确认设备已进入配网模式(LED 五次快闪)
- Android 需开启位置服务 + 蓝牙权限
- 距离设备 1 米以内
- 关闭其他 BLE 连接应用(可能有冲突)
舵机异常旋转
v0.3.0 已修复:早期版本存在启动时大幅度旋转问题,请升级到 v0.3.0+。
ESP32-S3 USB 日志不可用
USB HID 模式下 USB 串口被占用,需使用硬件 UART 查看日志:
ESP32-S3 TX (GPIO43) → USB-TTL RX
ESP32-S3 RX (GPIO44) → USB-TTL TX
ESP32-S3 GND → USB-TTL GNDBLE 问题
扫描不到设备
- 确认设备已上电且未连接其他手机
- Android:开启定位 + 蓝牙权限
- iOS:确认蓝牙权限已授权
- 距离 1-3 米内效果最佳
配网后设备无响应
- 确认 WiFi 连接成功(串口日志可见)
- 确认服务端 API 可达
- 确认 MQTT Broker 端口可达
- 检查设备是否成功注册(查看数据库)
Docker 问题
容器无法启动
bash
# 查看容器日志
docker compose logs <service_name>
# 常见原因:
# 1. 端口冲突 → lsof -i :<port>
# 2. 镜像不存在 → docker compose pull
# 3. 磁盘空间不足 → df -h
# 4. 内存不足 → docker stats容器间网络不通
bash
# 检查网络
docker network inspect iot-platform_default
# 重建网络
docker compose down
docker compose up -d数据丢失
Docker Volume 确保数据持久化:
bash
# 查看 volumes
docker volume ls | grep iot
# 备份 MySQL
docker exec iot-platform_mysql mysqldump -uroot -proot123456 iot_platform > backup.sql日志分析
查看日志
bash
# 所有服务
docker compose logs -f
# 指定服务
docker compose logs -f iot-core
# 最近 100 行
docker compose logs --tail 100 iot-core
# 过滤关键字
docker compose logs iot-core | grep "ERROR"日志标记
| 标记 | 模块 |
|---|---|
[MQTT] | MQTT 连接/消息 |
[Auth] | 认证授权 |
[DeviceSync] | 设备状态同步 |
[Webhook] | Webhook 事件 |
调整日志级别
env
# .env
LOG_LEVEL=DEBUG # DEBUG, INFO, WARN, ERROR获取帮助
报告问题时请提供:
- 错误信息:完整日志
- 环境信息:
docker compose version && docker version - 服务状态:
docker compose ps - 重现步骤:详细操作过程