«

esp32 vc连接mixio 测试成功

熊猫老师 发布于 阅读:10


include

#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"

#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"

#include "esp_netif.h"
#include "esp_wifi.h"
#include "esp_wifi_types.h"  // 确保有这个
#include "mqtt_client.h"

static const char *TAG = "mixio_test";

// ===== 改这里:Wi-Fi =====
#define WIFI_SSID "JXL2F"
#define WIFI_PASS "88888888"

// ===== 改这里:MixIO MQTT =====
// TCP 明文 MQTT
#define MQTT_HOST      "mixio.722400.xyz"
#define MQTT_PORT      1883

#define MQTT_USERNAME  "865000353@qq.com"
#define MQTT_PASSWORD  "4bd9ffb15f5434e991407f4ae1edb254"

#define TOPIC_SUB "865000353@qq.com/led/on"
#define TOPIC_PUB "865000353@qq.com/led/status"

static EventGroupHandle_t s_wifi_event_group;
static const int WIFI_CONNECTED_BIT = BIT0;

static esp_mqtt_client_handle_t s_mqtt = NULL;

static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                               int32_t event_id, void* event_data) {
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        esp_wifi_connect();
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
    wifi_event_sta_disconnected_t* d = (wifi_event_sta_disconnected_t*)event_data;
    ESP_LOGW(TAG, "WiFi disconnected, reason=%d", d->reason);
    esp_wifi_connect();
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
        ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
    }
}

static void wifi_init_sta(void) {
    s_wifi_event_group = xEventGroupCreate();

    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_create_default_wifi_sta();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));

    wifi_config_t wifi_config = { 0 };
    strncpy((char*)wifi_config.sta.ssid, WIFI_SSID, sizeof(wifi_config.sta.ssid));
    strncpy((char*)wifi_config.sta.password, WIFI_PASS, sizeof(wifi_config.sta.password));

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "wifi_init_sta finished.");
}

static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
    (void)handler_args;
    (void)base;

    esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data;
    esp_mqtt_client_handle_t client = event->client;

    switch ((esp_mqtt_event_id_t)event_id) {
    case MQTT_EVENT_CONNECTED:
        ESP_LOGI(TAG, "MQTT connected");
        esp_mqtt_client_subscribe(client, TOPIC_SUB, 0);
        esp_mqtt_client_publish(client, TOPIC_PUB, "{\"boot\":true}", 0, 0, 0);
        break;

    case MQTT_EVENT_DISCONNECTED:
        ESP_LOGW(TAG, "MQTT disconnected");
        break;

    case MQTT_EVENT_SUBSCRIBED:
        ESP_LOGI(TAG, "Subscribed, msg_id=%d", event->msg_id);
        break;

    case MQTT_EVENT_DATA:
        ESP_LOGI(TAG, "RX topic=%.*s data=%.*s",
                 event->topic_len, event->topic,
                 event->data_len, event->data);
        // 回发收到的 payload 到 status
        esp_mqtt_client_publish(client, TOPIC_PUB, event->data, event->data_len, 0, 0);
        break;

    case MQTT_EVENT_ERROR:
        ESP_LOGE(TAG, "MQTT error");
        break;

    default:
        break;
    }
}

static void mqtt_app_start(void) {
    esp_mqtt_client_config_t cfg = { 0 };

    // IDF 5.x 推荐用 broker/address 结构
    cfg.broker.address.hostname = MQTT_HOST;
    cfg.broker.address.port = MQTT_PORT;
    cfg.broker.address.transport = MQTT_TRANSPORT_OVER_TCP;

    cfg.credentials.username = MQTT_USERNAME;
    cfg.credentials.authentication.password = MQTT_PASSWORD;

    s_mqtt = esp_mqtt_client_init(&cfg);
    esp_mqtt_client_register_event(s_mqtt, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
    esp_mqtt_client_start(s_mqtt);
}

void app_main(void) {
    ESP_ERROR_CHECK(nvs_flash_init());

    wifi_init_sta();

    ESP_LOGI(TAG, "Waiting for WiFi...");
    xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdTRUE, portMAX_DELAY);

    mqtt_app_start();

    // 心跳:每 5 秒发一次(可选)
    while (1) {
        vTaskDelay(pdMS_TO_TICKS(5000));
        if (s_mqtt) {
            esp_mqtt_client_publish(s_mqtt, TOPIC_PUB, "{\"alive\":true}", 0, 0, 0);
        }
        ESP_LOGI(TAG, "alive");
    }
}