ESP32通过MQTT连接OneNet (ESP-IDF)

  1. onenet配置
  2. 代码
  3. 效果


onenet配置

1.创建产品

2.设备管理-添加设备-填设备名称

3.记录下3个信息 (产品ID、设备名称、设备密钥)

4.设置物模型-添加自定义功能点


代码:

1.域名配置

//MQTT域名(不加密)

#define ALIOT_MQTT_URL     "mqtt://mqtts.heclouds.com"

2.设备安全认证

token生成方法

1.可以通过算法动态的计算token

2.可以使用onenet的token生成工具

这里我使用的是token生成工具

然后把生成的token定义

#define token  "version=2018-10-31&res=products%2F8v3E431C2x%2Fdevices%2Fesp32s3&et=1911612384&method=md5&sign=..........................."

完整代码:

mqtt_aliot.c

#include "mqtt_aliot.h"
#include "esp_log.h"
#include "mqtt_client.h"
#include "esp_wifi.h"
#include <stdio.h>
#include "mbedtls/md5.h"
#include "mbedtls/md.h"

#define TAG "aliot"
#define token  "version=2018-10-31&res=products%2F8v3E431C2x%2Fdevices%2Fesp32s3&et=1911612384&method=md5&sign=j3HOjiaUNKjCrOnWupfxeg%3D%3D*********
static char client_id[128];
static char username[128];
static char password[256];

static esp_mqtt_client_handle_t mqtt_handle = NULL;
extern const char* g_aliot_ca;


void mqtt_event_callback(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data)
{
    esp_mqtt_event_handle_t data = (esp_mqtt_event_handle_t)event_data;
    switch (event_id)
    {
    case MQTT_EVENT_CONNECTED:    //mqtt已连接
        ESP_LOGI(TAG,"aliot mqtt connected");
        //esp_mqtt_client_subscribe_single(mqtt_handle,MQTT_TOPIC2,1);
        break;
    case MQTT_EVENT_DISCONNECTED: //mqtt没有连接
        ESP_LOGI(TAG,"mqtt disconnected");
        break;
    case MQTT_EVENT_PUBLISHED:   //发布ACK
        ESP_LOGI(TAG,"mqtt published ack");
        break;
    case MQTT_EVENT_SUBSCRIBED:  //订阅ACK
        ESP_LOGI(TAG,"mqtt subcribed ack");
        break;
    case MQTT_EVENT_DATA:         //接收数据
        ESP_LOGI(TAG,"topic->%s",data->topic);
        ESP_LOGI(TAG,"apyload->%s",data->data);
        break;

    default:
        break;
    }
}

void mqtt_start(void)
{
    //mqtt的配置
    esp_mqtt_client_config_t mqtt_cfg = {0}; 
    mqtt_cfg.broker.address.uri = ALIOT_MQTT_URL;   //域名
    mqtt_cfg.broker.address.port = 1883;            //端口

    //client_id
    snprintf(client_id, sizeof(client_id),"%s",ALIOT_DEVICENAME);
    mqtt_cfg.credentials.client_id = client_id;

    //username
    snprintf(username, sizeof(username),"%s",ALIOT_PRODUCTKEY);
    mqtt_cfg.credentials.username = username;
    
    //password
    mqtt_cfg.credentials.authentication.password = token;

    //TLS证书
    //mqtt_cfg.broker.verification.certificate = g_aliot_ca;
    //发起MQTT连接
    mqtt_handle = esp_mqtt_client_init(&mqtt_cfg);
    esp_mqtt_client_register_event(mqtt_handle,ESP_EVENT_ANY_ID,mqtt_event_callback,NULL);
    esp_mqtt_client_start(mqtt_handle);
}

 //ac证书 加密时需使用
const char* g_aliot_ca = "-----BEGIN CERTIFICATE-----\n"
"MIIDOzCCAiOgAwIBAgIJAPCCNfxANtVEMA0GCSqGSIb3DQEBCwUAMDQxCzAJBgNV"
"BAYTAkNOMQ4wDAYDVQQKDAVDTUlPVDEVMBMGA1UEAwwMT25lTkVUIE1RVFRTMB4X"
"DTE5MDUyOTAxMDkyOFoXDTQ5MDUyMTAxMDkyOFowNDELMAkGA1UEBhMCQ04xDjAM"
"BgNVBAoMBUNNSU9UMRUwEwYDVQQDDAxPbmVORVQgTVFUVFMwggEiMA0GCSqGSIb3"
"DQEBAQUAA4IBDwAwggEKAoIBAQC/VvJ6lGWfy9PKdXKBdzY83OERB35AJhu+9jkx"
"5d4SOtZScTe93Xw9TSVRKrFwu5muGgPusyAlbQnFlZoTJBZY/745MG6aeli6plpR"
"r93G6qVN5VLoXAkvqKslLZlj6wXy70/e0GC0oMFzqSP0AY74icANk8dUFB2Q8usS"
"UseRafNBcYfqACzF/Wa+Fu/upBGwtl7wDLYZdCm3KNjZZZstvVB5DWGnqNX9HkTl"
"U9NBMS/7yph3XYU3mJqUZxryb8pHLVHazarNRppx1aoNroi+5/t3Fx/gEa6a5PoP"
"ouH35DbykmzvVE67GUGpAfZZtEFE1e0E/6IB84PE00llvy3pAgMBAAGjUDBOMB0G"
"A1UdDgQWBBTTi/q1F2iabqlS7yEoX1rbOsz5GDAfBgNVHSMEGDAWgBTTi/q1F2ia"
"bqlS7yEoX1rbOsz5GDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAL"
"aqJ2FgcKLBBHJ8VeNSuGV2cxVYH1JIaHnzL6SlE5q7MYVg+Ofbs2PRlTiWGMazC7"
"q5RKVj9zj0z/8i3ScWrWXFmyp85ZHfuo/DeK6HcbEXJEOfPDvyMPuhVBTzuBIRJb"
"41M27NdIVCdxP6562n6Vp0gbE8kN10q+ksw8YBoLFP0D1da7D5WnSV+nwEIP+F4a"
"3ZX80bNt6tRj9XY0gM68mI60WXrF/qYL+NUz+D3Lw9bgDSXxpSN8JGYBR85BxBvR"
"NNAhsJJ3yoAvbPUQ4m8J/CoVKKgcWymS1pvEHmF47pgzbbjm5bdthlIx+swdiGFa"
"WzdhzTYwVkxBaU+xf/2w\n"
"-----END CERTIFICATE-----";


mqtt_aliot.h

#ifndef _MQTT_ALIOT_H_
#define _MQTT_ALIOT_H_

//设备名称
#define ALIOT_DEVICENAME  "esp*****"

//产品密钥(阿里云) == 产品id(onenet)
#define ALIOT_PRODUCTKEY  "8v3E4*****"

//设备密钥
#define ALIOT_DEVICESECRET "TWlpWmNncHFKNnloRWNCMTNIUGN2********"

//MQTT域名(加密)
//#define ALIOT_MQTT_URL "mqtts://mqttstls.heclouds.com"   

//MQTT域名(不加密)
#define ALIOT_MQTT_URL     "mqtt://mqtts.heclouds.com"

void mqtt_start(void);//启动IOT连接

#endif

主程序

#include <stdio.h>
#include "mqtt_client.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "freertos/semphr.h"
#include "mqtt_aliot.h"

#define TEST_SSID "l***"             //WiFi名称
#define TEST_PASSWORD "123456789"    //WiFi密码
#define TAG "main"


static SemaphoreHandle_t s_wifi_connect_sem = NULL;

void wifi_event_handle(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data)
{
    if(event_base == WIFI_EVENT)
    {
        switch(event_id)
        {
            case WIFI_EVENT_STA_START:
            esp_wifi_connect();
            break;
            case WIFI_EVENT_STA_CONNECTED:
            ESP_LOGI(TAG,"esp connected to ap!");
            break;
            case WIFI_EVENT_STA_DISCONNECTED:
            esp_wifi_connect();
            ESP_LOGI(TAG,"esp connect the ap faild ");
            break;

        default:
            break;
        }
    }
    else if(event_base == IP_EVENT)
    {
        switch (event_id)
        {
        case IP_EVENT_STA_GOT_IP:
            ESP_LOGI(TAG,"esp32 get ip address");
            xSemaphoreGive(s_wifi_connect_sem);   //释放信号量
        break;
        case IP_EVENT_STA_LOST_IP:
        ESP_LOGI(TAG,"esp lost ip adress");
        
        default:
            break;
        }
    }
}


void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());  //nvs初始化
    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));
    s_wifi_connect_sem = xSemaphoreCreateBinary();  //创建信号量

    esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,wifi_event_handle,NULL);
    esp_event_handler_register(IP_EVENT,IP_EVENT_STA_GOT_IP,wifi_event_handle,NULL);

    wifi_config_t  wifi_config = {
        .sta.threshold.authmode = WIFI_AUTH_WPA2_PSK,
        .sta.pmf_cfg.capable = true,
        .sta.pmf_cfg.required = false,
    };

    memset(&wifi_config.sta.ssid, 0 , sizeof(wifi_config.sta.ssid));
    memcpy(wifi_config.sta.ssid, TEST_SSID, strlen(TEST_SSID));

    memset(&wifi_config.sta.password, 0 , sizeof(wifi_config.sta.password));
    memcpy(wifi_config.sta.password, TEST_PASSWORD, strlen(TEST_PASSWORD));

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

    xSemaphoreTake(s_wifi_connect_sem,portMAX_DELAY);   //等待
    mqtt_start();


    return;
}


实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值