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;
}

 

posted @ 2025-05-12 13:48  hrdom  阅读(32)  评论(0)    收藏  举报