- onenet配置
- 代码
- 效果
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;
}
实现效果:


4458

被折叠的 条评论
为什么被折叠?



