改进了阿里云 IoT 连接的可靠性,实现了自动重试机制,确保即使初始连接失败,系统也能在后续设备数据到达时自动重新尝试连接。
serverTcp.jsloggerConfig.js[TIMESTAMP] [LEVEL] [IP: x.x.x.x] [设备: SERIALNUM] [module] messageserverTcp.jsaliyunClient.js// 旧逻辑: 只进行一次连接尝试
if (!deviceAliyunClients.has(deviceSerialNumber)) {
// 首次创建并连接
// 如果连接失败,客户端就被缓存在 Map 中
// 后续消息都会找到这个客户端但仍然是断开状态
}
// 新逻辑: 状态感知的重试
let aliyunClient = deviceAliyunClients.get(deviceSerialNumber);
if (!aliyunClient || !aliyunClient.isConnected) {
if (!aliyunClient) {
// 首次创建客户端
aliyunClient = new AliyunIoTClient(deviceSerialNumber);
deviceAliyunClients.set(deviceSerialNumber, aliyunClient);
} else {
// 之前连接失败,重新尝试
appLogger.logInfo(`重新尝试连接阿里云 IoT`, {...});
}
// 无论首次还是重试,都尝试连接
aliyunClient.connect()
.then(() => {
// 连接成功,发布数据
aliyunClient.publishProperties(record.keyData);
})
.catch((err) => {
// 记录错误,等待下一次消息的重试
});
}
aliyunClient.js)this.isConnected = false (第21行)this.isConnected = true (第292行)this.isConnected = false (第322行)this.isConnected = false (第330行)this.isConnected = false (第486行)] [设备: 8VSAFY63] [aliyun]: 正在连接阿里云 IoT
🔄 为设备 8VSAFY63 创建阿里云 IoT 客户端...
✗ 设备 8VSAFY63 的阿里云 IoT 连接失败: Invalid triplet information
] [设备: 8VSAFY63] [aliyun]: 重新尝试连接阿里云 IoT
🔄 重新尝试连接阿里云 IoT [设备: 8VSAFY63]...
✗ 设备 8VSAFY63 的阿里云 IoT 连接失败: Invalid triplet information
isConnected = false → 自动重试观察日志中的以下关键输出: [重新尝试连接阿里云 IoT] 消息表示重试逻辑被触发 [IP: x.x.x.x] [设备: xxxxx] 前缀证明设备识别准确 十六进制/ASCII 数据证明消息完整记录
指数退避算法: 添加延迟重试机制,防止快速重试风暴
javascript const retryDelay = Math.min(1000 * Math.pow(2, retryCount), 30000); setTimeout(() => aliyunClient.connect(), retryDelay);
最大重试限制: 防止无限重试
javascript if (retryCount > 5) { appLogger.logError('连接已达最大重试次数'); return; }
健康检查: 周期性检查已连接设备的健康状态
javascript setInterval(() => { deviceAliyunClients.forEach((client, deviceId) => { if (!client.isConnected) { client.connect(); } }); }, 60000); // 每60秒检查一次
| 文件 | 变更类型 | 主要改动 |
|---|---|---|
serverTcp.js |
修改 | 从简单的存在性检查改为状态感知的重试逻辑 (行85-120) |
aliyunClient.js |
现有 | 已有的 isConnected 状态管理机制得到充分利用 |
loggerConfig.js |
现有 | 日志格式中的 IP 和设备前缀已生效 |
# 1. 清空旧日志
Remove-Item -Path "d:\gitData\feisen_5008sServer\logs\*.log" -Force
# 2. 启动服务器
cd "d:\gitData\feisen_5008sServer"
node serverTcp.js
# 3. 查看日志
Get-Content -Path "d:\gitData\feisen_5008sServer\logs\tcp.log" -Tail 100
# 4. 观察"重新尝试连接阿里云 IoT"日志出现
---
最后更新: 2025-12-01
状态: 验证通过 ✅