ESP32通过MQTT协议连接ONENET(新版)上报信息

一、ONENET平台操作

1、创建产品

        产品开发->创建产品

        产品品类随便选一个,智能化方式选择设备接入

2、创建设备

点击设备管理->创建设备

所属产品需要选择创建的产品,设备名称可以和产品名一致也可以另外起名

3、设置物模型

设置物模型就相当于设置需要上报的一些信息

产品开发页面->功能定义->设置物模型->点击之后选择新建自定义功能点->填写上报的数据格式及信息(我用字符串举例)->新增完成后记得点右上角的保存

4、制作Token

Token相当于password,需要使用ONENET官方提供的Token计算工具,需要的数据为(产品ID、设备ID、未来时间戳、access_key)

res :  products/{产品id}/devices/{设备名字}

et   : 未来时间戳(unix格式)

key: access_key

二、ESP32代码

1、头文件

#ifndef __MQTT_H
#define __MQTT_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mqtt.h"
#include "mqtt_client.h"
#include "esp_log.h"

//具体去看ONENET文档
#define ESP_MQTT_URI "mqtt://mqtts.heclouds.com"
#define ESP_MQTT_PORT 1883

#define ESP_CLIENT_ID  "test"//设备id
#define ESP_PRODUCT_ID "产品ID"//产品id
#define ESP_MQTT_TOKEN "复制自己生成的Token"//TOKEN

#define ONENET_TOPIC_SUB "$sys/产品ID/设备ID/thing/property/post/reply"  //订阅
#define ONENET_TOPIC_PUBLISH "$sys/产品ID/设备ID/thing/property/post" //上报

//MQTT状态
typedef enum {
    MQTT_STATE_ERROR = -1,
    MQTT_STATE_UNKNOWN = 0,
    MQTT_STATE_INIT,
    MQTT_STATE_CONNECTED,
    MQTT_STATE_WAIT_TIMEOUT,
} mqtt_client_state_t;

static const char *TAG = "MQTT";//LOG头
esp_mqtt_client_handle_t client;//MQTT句柄
bool mqtt_connect_flag=false;//连接标志位 是否连接成功
static mqtt_client_state_t mqtt_sta = MQTT_STATE_UNKNOWN;//MQTT状态



//MQTT初始化
void mqtt_app_init(void);
//MQTT发布消息
int mqtt_data_publish(const char* theme, const char* value);
//MQTT状态获取
mqtt_client_state_t mqtt_get_sta();

#endif

2、函数实现

2.1初始化函数

void mqtt_app_init(void)
{
    //结构体赋值
    esp_mqtt_client_config_t mqtt_cfg = {
        .uri = ESP_MQTT_URI,//域名
        .port = ESP_MQTT_PORT,//端口
        .client_id = ESP_CLIENT_ID,//设备id
        .username = ESP_PRODUCT_ID,//产品id
        .password = ESP_MQTT_TOKEN,//TOKEN
    };
    //初始化
     client = esp_mqtt_client_init(&mqtt_cfg);
     //注册回调
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, client);
    //启动
    esp_mqtt_client_start(client);
}

2.2回调函数


static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event)
{
    esp_mqtt_client_handle_t client = event->client;
    int msg_id;
    // your_context_t *context = event->context;
    switch (event->event_id) {
        case MQTT_EVENT_CONNECTED:
            ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
            msg_id = esp_mqtt_client_subscribe(client, ONENET_TOPIC_CMD_SUB, 0);
            ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
             if(msg_id != -1)
            {
                mqtt_connect_flag=true;
                mqtt_sta =MQTT_STATE_CONNECTED;
            }else
            {
                mqtt_connect_flag=false;
                mqtt_sta =MQTT_STATE_UNKNOWN;
            }
            break;
        case MQTT_EVENT_DISCONNECTED:
            ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
            break;
        case MQTT_EVENT_SUBSCRIBED:
            ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
            msg_id = mqtt_data_publish("mylog","suss");
            ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
            mqtt_connect_flag=true;
            mqtt_sta =MQTT_STATE_CONNECTED;
            break;
        case MQTT_EVENT_UNSUBSCRIBED:
            mqtt_connect_flag=false;
            mqtt_sta =MQTT_STATE_UNKNOWN;
            ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
            break;
        case MQTT_EVENT_PUBLISHED:
            ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
            break;
        case MQTT_EVENT_DATA:
            ESP_LOGI(TAG, "MQTT_EVENT_DATA");
            printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
            printf("DATA=%.*s\r\n", event->data_len, event->data);
            break;
        case MQTT_EVENT_ERROR:
            mqtt_sta = MQTT_STATE_ERROR;
            ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
            break;
        default:
            ESP_LOGI(TAG, "Other event id:%d", event->event_id);
            break;
    }
    return ESP_OK;
}

static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
    ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%d", base, event_id);
    mqtt_event_handler_cb(event_data);
}

2.3上报函数

/*
    param: theme   物模型名  
    value: 上传数据
*/
int mqtt_data_publish(const char* theme, const char* value)
{
    char data_str[256];
    int msg_id=-1;

    // 使用sprintf格式化字符串 组装ONENET数据包   
    snprintf(data_str, sizeof(data_str), "{\"id\": \"123\",\"version\": \"1.0\",\"params\":{\"%s\":{\"value\":\"%s\"}}}", theme, value);
    if(mqtt_connect_flag==true)
    {
        msg_id = esp_mqtt_client_publish(client, ONENET_TOPIC_DP_PUBLISH,data_str, 0, 0, 0);
        ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
        // 检查发布结果
        if (msg_id != -1)
        {
            ESP_LOGI(TAG, "Sent publish successful, msg_id=%d", msg_id);
        }
        else
        {
            ESP_LOGE(TAG, "Failed to publish message");
        }
    }
    else
    {
        ESP_LOGW(TAG, "MQTT client is not connected");
    }
    return msg_id;
}

2.4ONENET物模型上报数据格式

参数类型说明
idstring消息id号,用户自定义,String类型的数字,长度限制13位。
versionstring物模型版本号,可选字段,不填默认为1.0
paramsjsonObject请求参数,用户自定义,标准json格式。如以上示例中,设备上报了的两个属性Power和WF。具体属性信息,包含属性上报时间(time)和上报的属性值(value)。
timelong属性值生成时间。该参数为可选字段,到毫秒级。根据您的业务场景决定消息中是否带时间戳。如果消息频繁,需根据时间戳判断消息顺序,建议消息中带有时间戳。
valueobject上报的属性值
{
	"id": "123",
	"version": "1.0",
	"params": {
		"Power": {
			"value": "12345",
			"time": 1706673129818
		},
		"temp": {
			"value": 23.6,
			"time": 1706673129818
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值