Blinker.run(); 代码逻辑
让我通过代码搜索来追踪这个调用链:
Search files...
让我继续搜索更多相关代码:
Search files...
根据代码分析,`Blinker.run()`到`connect()`的调用链如下:
1. `Blinker.run()`在`BlinkerApi.h`中实现,主要功能是:
- 检查连接状态
- 处理定时器
- 调用`BProto::connect()`尝试连接
2. `BProto::connect()`会调用`BlinkerMQTT::connect()`,主要逻辑:
- 检查MQTT是否初始化
- 如果已连接则直接返回true
- 断开现有连接
- 检查重连时间间隔
- 尝试连接MQTT服务器
- 处理连接错误和重连
3. `BlinkerMQTT::connect()`中的重连机制:
- 有重连时间间隔限制(BLINKER_MQTT_CONNECT_TIMESLOT)
- 记录重连次数(reconnect_time)
- 错误码4(认证失败)时尝试重新注册
- 重连12次后会尝试重新注册
- 重新注册有次数限制(BLINKER_SERVER_CONNECT_LIMIT)
- 重新注册有5分钟的时间间隔限制
4. 连接成功后会:
- 重置重连计数
- 更新连接状态
- 首次连接时订阅主题
- 更新最新时间戳
5. 连接失败会:
- 记录重连时间
- 增加重连计数
- 根据情况尝试重新注册
- 返回false表示重连失败
所以整个调用链是:
```
Blinker.run()
-> BProto::connect()
-> BlinkerMQTT::connect()
-> Adafruit_MQTT_Client::connect()
-> Adafruit_MQTT::connect()
-> connectServer()
```
重连机制主要在`BlinkerMQTT::connect()`中实现,包含了:
- 重连间隔控制
- 重连次数限制
- 认证失败处理
- 重新注册机制
- 状态维护
这样可以保证在连接断开时能够自动重连,同时避免过于频繁的重连请求。
让我搜索相关代码:
Search files...
让我继续搜索:
Search files...
根据代码分析,`BlinkerApi::run()`函数在`BLINKER_WIFI`和`BLINKER_WITHOUT_SSL`定义下的主要逻辑如下:
1. WiFi连接状态检查:
```cpp
if (WiFi.status() != WL_CONNECTED) {
if ((millis() - _reconTime) >= 10000 || _reconTime == 0) {
_reconTime = millis();
BLINKER_LOG(BLINKER_F("WiFi disconnected! reconnecting!"));
WiFi.reconnect();
}
return;
}
```
- 检查WiFi连接状态
- 如果断开连接,每10秒尝试重连一次
- 重连时记录时间戳并打印日志
2. 连接状态管理:
```cpp
if (state == CONNECTING && _mqttAutoStatue != AUTO_DEV_CONNECTING) {
_mqttAutoStatue = AUTO_DEV_CONNECTING;
}
else if (state == CONNECTED && _mqttAutoStatue != AUTO_DEV_CONNECTED) {
if (BProto::mConnected()) _mqttAutoStatue = AUTO_DEV_CONNECTED;
}
else if (state == DISCONNECTED && _mqttAutoStatue != AUTO_DEV_DISCONNECTED) {
_mqttAutoStatue = AUTO_DEV_DISCONNECTED;
}
```
- 管理设备连接状态(CONNECTING/CONNECTED/DISCONNECTED)
- 更新MQTT自动连接状态
3. 定时任务处理:
```cpp
#if defined(BLINKER_PRO) || defined(BLINKER_MQTT_AUTO) || \
defined(BLINKER_PRO_ESP) || defined(BLINKER_WIFI_GATEWAY)
ntpInit();
checkTimer();
#endif
```
- 初始化NTP时间同步
- 检查定时任务
4. 多WiFi网络支持:
```cpp
#if defined(BLINKER_WIFI_MULTI)
if (wifiMulti.run() != WL_CONNECTED) {
if ((millis() - _reconTime) >= 10000 || _reconTime == 0) {
_reconTime = millis();
BLINKER_LOG(BLINKER_F("WiFi disconnected! reconnecting!"));
}
return;
}
#endif
```
- 如果启用了多WiFi网络,使用wifiMulti管理连接
- 同样有10秒重连机制
5. 非SSL连接处理:
```cpp
#ifndef BLINKER_WITHOUT_SSL
// SSL连接相关代码
#else
WiFiClient client_s;
#endif
```
- 根据是否启用SSL选择不同的客户端类型
- 不使用SSL时使用普通WiFiClient
6. 连接超时处理:
```cpp
if (millis() - _connectTime > BLINKER_CONNECT_TIMEOUT_MS && WiFi.status() != WL_CONNECTED) {
BLINKER_LOG(BLINKER_F("WiFi connect timeout, please check ssid and pswd!"));
BLINKER_LOG(BLINKER_F("Retring WiFi connect again!"));
return false;
}
```
- 设置连接超时时间
- 超时后打印错误日志并返回false
总的来说,这个函数主要负责:
1. 维护WiFi连接状态
2. 处理连接断开时的重连
3. 管理MQTT连接状态
4. 处理定时任务
5. 支持多WiFi网络
6. 根据SSL配置选择不同的连接方式
7. 处理连接超时情况
所有这些功能都是为了确保设备能够稳定地连接到WiFi网络,并在连接断开时能够自动重连。
// 创建HTTP客户端对象
HTTPClient http;
// 存储API请求URL
String url_iot;
// 存储HTTP响应码
int httpCode;
// 设置HTTP请求头
String conType = BLINKER_F("Content-Type");
String application = BLINKER_F("application/json;charset=utf-8");
// 记录服务器连接开始
BLINKER_LOG_ALL(BLINKER_F("blinker server begin"));
BLINKER_LOG_FreeHeap_ALL();
// 根据不同的命令类型(_type)处理不同的API请求
switch (_type) {
// 发送短信
case BLINKER_CMD_SMS_NUMBER :
url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/sms");
// ... HTTP请求设置 ...
// 发送推送消息
case BLINKER_CMD_PUSH_NUMBER :
url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/push");
// ... HTTP请求设置 ...
// 发送微信消息
case BLINKER_CMD_WECHAT_NUMBER :
url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/wxMsg/");
// ... HTTP请求设置 ...
// 获取天气信息
case BLINKER_CMD_WEATHER_NUMBER :
url_iot = host;
url_iot += BLINKER_F("/api/v2");
url_iot += msg;
// ... HTTP请求设置 ...
// 获取天气预报
case BLINKER_CMD_WEATHER_FORECAST_NUMBER :
// 类似天气信息获取
// ... HTTP请求设置 ...
// 获取空气质量指数
case BLINKER_CMD_AQI_NUMBER :
// ... HTTP请求设置 ...
// 记录日志到云端
case BLINKER_CMD_LOG_NUMBER :
url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/cloud_storage/logs");
// ... HTTP请求设置 ...
// 存储坐标数据
case BLINKER_CMD_COD_NUMBER :
url_iot = host;
url_iot += BLINKER_F("/api/v1/user/device/cloud_storage/coordinate");
// ... HTTP请求设置 ...
// 桥接设备通信
case BLINKER_CMD_BRIDGE_NUMBER :
// ... HTTP请求设置 ...
// MQTT相关功能(仅在定义了MQTT相关宏时启用)
#if defined(BLINKER_MQTT) || defined(BLINKER_PRO) || \
defined(BLINKER_AT_MQTT) || defined(BLINKER_WIFI_GATEWAY) || \
defined(BLINKER_MQTT_AUTO) || defined(BLINKER_PRO_ESP) || \
defined(BLINKE_HTTP)
// 更新设备配置
case BLINKER_CMD_CONFIG_UPDATE_NUMBER :
// ... HTTP请求设置 ...
// 获取设备配置
case BLINKER_CMD_CONFIG_GET_NUMBER :
// ... HTTP请求设置 ...
// 删除设备配置
case BLINKER_CMD_CONFIG_DELETE_NUMBER :
// ... HTTP请求设置 ...
// 数据存储相关功能
case BLINKER_CMD_DATA_STORAGE_NUMBER :
// 存储数据到云端
// ... HTTP请求设置 ...
case BLINKER_CMD_TIME_SLOT_DATA_NUMBER :
// 存储时间槽数据
// ... HTTP请求设置 ...
case BLINKER_CMD_TEXT_DATA_NUMBER :
// 存储文本数据
// ... HTTP请求设置 ...
case BLINKER_CMD_JSON_DATA_NUMBER :
// 存储JSON数据
// ... HTTP请求设置 ...
// 数据管理功能
case BLINKER_CMD_DATA_GET_NUMBER :
// 获取存储的数据
// ... HTTP请求设置 ...
case BLINKER_CMD_DATA_DELETE_NUMBER :
// 删除存储的数据
// ... HTTP请求设置 ...
// 自动拉取数据
case BLINKER_CMD_AUTO_PULL_NUMBER :
// ... HTTP请求设置 ...
// OTA升级相关
case BLINKER_CMD_OTA_NUMBER :
// 检查OTA更新
// ... HTTP请求设置 ...
case BLINKER_CMD_OTA_STATUS_NUMBER :
// 获取OTA升级状态
// ... HTTP请求设置 ...
// 设备管理功能
case BLINKER_CMD_FRESH_SHARERS_NUMBER :
// 刷新设备共享信息
// ... HTTP请求设置 ...
// 低功耗相关功能
case BLINKER_CMD_LOWPOWER_FREQ_GET_NUM :
// 获取低功耗频率
// ... HTTP请求设置 ...
case BLINKER_CMD_LOWPOWER_FREQ_UP_NUMBER :
// 更新低功耗频率
// ... HTTP请求设置 ...
case BLINKER_CMD_LOWPOWER_DATA_GET_NUM :
// 获取低功耗数据
// ... HTTP请求设置 ...
case BLINKER_CMD_LOWPOWER_DATA_UP_NUMBER :
// 上传低功耗数据
// ... HTTP请求设置 ...
// 事件处理
case BLINKER_CMD_EVENT_DATA_NUMBER :
// 处理设备事件
// ... HTTP请求设置 ...
// GPS数据上传
case BLINKER_CMD_GPS_DATA_NUMBER :
// ... HTTP请求设置 ...
// 设备心跳
case BLINKER_CMD_DEVICE_HEARTBEAT_NUMBER :
// 发送设备心跳包
// ... HTTP请求设置 ...
// PRO版本特有功能
#if defined(BLINKER_PRO_ESP)
// 警告事件
case BLINKER_CMD_EVENT_WARNING_NUMBER :
// ... HTTP请求设置 ...
// 错误事件
case BLINKER_CMD_EVENT_ERROR_NUMBER :
// ... HTTP请求设置 ...
// 消息事件
case BLINKER_CMD_EVENT_MSG_NUMBER :
// ... HTTP请求设置 ...
#endif
#endif
// 未知命令类型
default :
return BLINKER_CMD_FALSE;
}