STM32 advanced learning (3) - STM32 upload data function code porting based on ONENET platform and various problems encountered in it

Continuing from the above, the above specifically explained how the three of ESP8266-STM32-ONENET are linked together through codes, and this time we will focus on practice, using real objects to complete the function of uploading data.


1. Code porting based on STM32 standard library functions

Since the code downloaded from the ONENET platform has the author's own style, which is not the same as the punctual atomic style code I have been using, so I modified part of the code to make it more suitable for my needs.

(1)ESP8266.c

#include "debug.h"

//网络设备驱动
#include "esp8266.h"

//硬件驱动
#include "UART6.h"
#include "USART2.h"

//C库
#include <string.h>
#include <stdio.h>

//AT+CWJAP指令用于连接WiFi网络,后面的参数中,ONENET表示WiFi网络的名称,而IOT@Chinamobile123则是WiFi网络的密码。
#define ESP8266_WIFI_INFO       "AT+CWJAP=\"OEN\",\"12345678\"\r\n"

//AT+CIPSTART指令用于连接TCP服务器,后面的参数中,TCP表示使用TCP协议连接服务器,183.230.40.39表示OneNET服务器的IP地址,而6002则是OneNET服务器的端口号。
#define ESP8266_ONENET_INFO     "AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n"

//接收缓冲区大小
unsigned char esp8266_buf[256];
//cnt是接收计数器
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;


//==========================================================
//  函数名称:   ESP8266_Clear
//
//  函数功能:   清空缓存
//
//  入口参数:   无
//
//  返回参数:   无
//
//  说明:
//==========================================================
void ESP8266_Clear(void)
{
    
    

    memset(esp8266_buf, 0, sizeof(esp8266_buf));
    esp8266_cnt = 0;

}

//==========================================================
//  函数名称:   ESP8266_WaitRecive
//
//  函数功能:   等待接收完成
//
//  入口参数:   无
//
//  返回参数:   REV_OK-接收完成     REV_WAIT-接收超时未完成
//
//  说明:     循环调用检测是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{
    
    

    if(esp8266_cnt == 0)                            //如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
        return REV_WAIT;

    if(esp8266_cnt == esp8266_cntPre)               //如果上一次的值和这次相同,则说明接收完毕
    {
    
    
        esp8266_cnt = 0;                            //清0接收计数

        return REV_OK;                              //返回接收完成标志
    }

    esp8266_cntPre = esp8266_cnt;                   //置为相同

    return REV_WAIT;                                //返回接收未完成标志

}

//==========================================================
//  函数名称:   ESP8266_SendCmd
//
//  函数功能:   发送命令
//
//  入口参数:   cmd:命令
//              res:需要检查的返回指令
//
//  返回参数:   0-成功    1-失败
//
//  说明:
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
    
    

    unsigned char timeOut = 200;
    //printf("366\r\n");
    Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
    //printf("666\r\n");
    //printf("%s\r\n",esp8266_buf);
    while(timeOut--)
    {
    
    
        if(ESP8266_WaitRecive() == REV_OK)                          //如果收到数据
        {
    
    
            printf("%s\r\n",esp8266_buf);
            if(strstr((const char *)esp8266_buf, res) != NULL)      //如果检索到关键词
            {
    
    
                ESP8266_Clear();                                    //清空缓存

                return 0;
            }
        }

        //DelayXms(10);
        Delay_Ms(10);
    }

    return 1;

}

//==========================================================
//  函数名称:   ESP8266_SendData
//
//  函数功能:   发送数据
//
//  入口参数:   data:数据
//              len:长度
//
//  返回参数:   无
//
//  说明:
//==========================================================
void ESP8266_SendData(unsigned char *data, unsigned short len)
{
    
    

    char cmdBuf[32];

    ESP8266_Clear();                                //清空接收缓存
    sprintf(cmdBuf, "AT+CIPSEND=%d\r\n", len);      //发送命令
    if(!ESP8266_SendCmd(cmdBuf, ">"))               //收到‘>’时可以发送数据
    {
    
    
        Usart_SendString(USART2, data, len);        //发送设备连接请求数据
    }

}

//==========================================================
//  函数名称:   ESP8266_GetIPD
//
//  函数功能:   获取平台返回的数据
//
//  入口参数:   等待的时间(乘以10ms)
//
//  返回参数:   平台返回的原始数据
//
//  说明:     不同网络设备返回的格式不同,需要去调试
//              如ESP8266的返回格式为  "+IPD,x:yyy"    x代表数据长度,yyy是数据内容
//==========================================================
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{
    
    

    char *ptrIPD = NULL;

    do
    {
    
    
        if(ESP8266_WaitRecive() == REV_OK)                              //如果接收完成
        {
    
    
            ptrIPD = strstr((char *)esp8266_buf, "IPD,");               //搜索“IPD”头
            if(ptrIPD == NULL)                                          //如果没找到,可能是IPD头的延迟,还是需要等待一会,但不会超过设定的时间
            {
    
    
                //UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");
            }
            else
            {
    
    
                ptrIPD = strchr(ptrIPD, ':');                           //找到':'
                if(ptrIPD != NULL)
                {
    
    
                    ptrIPD++;
                    return (unsigned char *)(ptrIPD);
                }
                else
                    return NULL;

            }
        }

        //DelayXms(5);                                                    //延时等待
        Delay_Ms(5);
    } while(timeOut--);

    return NULL;                                                        //超时还未找到,返回空指针

}

//==========================================================
//  函数名称:   ESP8266_Init
//
//  函数功能:   初始化ESP8266
//
//  入口参数:   无
//
//  返回参数:   无
//
//  说明:
//==========================================================
void ESP8266_Init(void)
{
    
    

    //GPIO_InitTypeDef GPIO_Initure;

   // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    //ESP8266复位引脚
    //GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
   // GPIO_Initure.GPIO_Pin = GPIO_Pin_14;                    //GPIOC14-复位
   // GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
   // GPIO_Init(GPIOC, &GPIO_Initure);

    //GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_RESET);
    //DelayXms(250);
    //Delay_Ms(250);
    //GPIO_WriteBit(GPIOC, GPIO_Pin_14, Bit_SET);
    //DelayXms(500);

    ESP8266_Clear();

    printf("1. AT\r\n");
    printf("%d\r\n",ESP8266_SendCmd("AT\r\n", "OK"));
    while(ESP8266_SendCmd("AT\r\n", "OK"))//测试指令
        //DelayXms(500);
    Delay_Ms(500);
    printf("2. CWMODE\r\n");
    while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))//设置STA模式
        //DelayXms(500);
    Delay_Ms(500);
    printf("3. AT+CWDHCP\r\n");
    while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))//
        //DelayXms(500);
    Delay_Ms(500);
    printf("4. CWJAP\r\n");
    while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
        //DelayXms(500);
    Delay_Ms(500);
    printf("5. CIPSTART\r\n");
    while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
       // DelayXms(500);
    Delay_Ms(500);
    printf("6. ESP8266 Init OK\r\n");

}

//==========================================================
//  函数名称:   USART2_IRQHandler
//
//  函数功能:   串口6收发中断
//
//  入口参数:   无
//
//  返回参数:   无
//
//  说明:
//==========================================================
__attribute__((interrupt("WCH-Interrupt-fast")))
void USART2_IRQHandler(void)
{
    
    

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
    {
    
    
        if(esp8266_cnt >= sizeof(esp8266_buf))  esp8266_cnt = 0; //防止串口被刷爆
        esp8266_buf[esp8266_cnt++] = USART2->DATAR;

        USART_ClearFlag(USART2, USART_FLAG_RXNE);

    }

}

(2)ESP8266.h

#ifndef _ESP8266_H_
#define _ESP8266_H_





#define REV_OK      0   //接收完成标志
#define REV_WAIT    1   //接收未完成标志


void ESP8266_Init(void);

void ESP8266_Clear(void);

void ESP8266_SendData(unsigned char *data, unsigned short len);

unsigned char *ESP8266_GetIPD(unsigned short timeOut);


#endif

(3)ONENET.c

//单片机头文件
#include "debug.h"

//网络设备
#include "esp8266.h"

//协议文件
#include "onenet.h"
#include "MqttKit.h"

//硬件驱动
#include "UART6.h"
#include "USART3.h"

//C库
#include <string.h>
#include <stdio.h>

//产品ID(PROID)是OneNET平台上创建的产品的唯一标识符,用于区分不同的产品;
#define PROID       "610694"
//鉴权信息(AUTH_INFO)是用于验证设备身份的密钥,用于确保只有经过授权的设备可以连接到OneNET平台
#define AUTH_INFO   "test"
//设备ID(DEVID)是OneNET平台上创建的设备的唯一标识符,用于区分不同的设备。
#define DEVID       "1100462854"


extern unsigned char esp8266_buf[256];
extern uint16_t USART3_RxBuf[USART_MAX_LEN];   //接收缓存
extern uint16_t data[8];
//==========================================================
//  函数名称:   OneNet_DevLink
//
//  函数功能:   与onenet创建连接
//
//  入口参数:   无
//
//  返回参数:   1-成功    0-失败
//
//  说明:     与onenet平台建立连接
//==========================================================
_Bool OneNet_DevLink(void)
{
    
    

    MQTT_PACKET_STRUCTURE mqttPacket = {
    
    NULL, 0, 0, 0};                 //协议包

    unsigned char *dataPtr;

    _Bool status = 1;

    printf("OneNet_DevLink\r\n" "PROID: %s, AUIF: %s,   DEVID:%s\r\n" , PROID, AUTH_INFO, DEVID);

    if(MQTT_PacketConnect(PROID, AUTH_INFO, DEVID, 256, 0, MQTT_QOS_LEVEL0, NULL, NULL, 0, &mqttPacket) == 0)
    {
    
    
        ESP8266_SendData(mqttPacket._data, mqttPacket._len);            //上传平台

        dataPtr = ESP8266_GetIPD(250);                                  //等待平台响应
        if(dataPtr != NULL)
        {
    
    
            if(MQTT_UnPacketRecv(dataPtr) == MQTT_PKT_CONNACK)
            {
    
    
                switch(MQTT_UnPacketConnectAck(dataPtr))
                {
    
    
                    case 0:printf("Tips:  连接成功\r\n");status = 0;break;

                    case 1:printf("WARN:  连接失败:协议错误\r\n");break;
                    case 2:printf("WARN:  连接失败:非法的clientid\r\n");break;
                    case 3:printf("WARN:  连接失败:服务器失败\r\n");break;
                    case 4:printf("WARN:  连接失败:用户名或密码错误\r\n");break;
                    case 5:printf("WARN:  连接失败:非法链接(比如token非法)\r\n");break;

                    default:printf("ERR:  连接失败:未知错误\r\n");break;
                }
            }
        }

        MQTT_DeleteBuffer(&mqttPacket);                             //删包
    }
    else
        printf("WARN: MQTT_PacketConnect Failed\r\n");

    return status;

}
//这个函数用来传输数据
unsigned char OneNet_FillBuf(char *buf)
{
    
    

    char text[64];

    memset(text, 0, sizeof(text));

    strcpy(buf, ",;");

    memset(text, 0, sizeof(text));
    sprintf(text, "Tempreture,%f;",(float)data[0]);//温度
    printf("t=%f\r\n",(float)data[0]);
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Humidity,%f;",(float)data[1]);//湿度
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Length,%f;",(float)data[2]);//车距
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Alcohol,%f;",(float)data[3]);//酒精浓度
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Speed,%f;",(float)data[4]);//车速
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Circle,%f;",(float)data[5]);//转速
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Mileage,%f;",(float)data[6]);//里程
    strcat(buf, text);

    memset(text, 0, sizeof(text));
    sprintf(text, "Total,%f;",(float)data[7]);//总分
    strcat(buf, text);
    return strlen(buf);

}

//==========================================================
//  函数名称:   OneNet_SendData
//
//  函数功能:   上传数据到平台
//
//  入口参数:   type:发送数据的格式
//
//  返回参数:   无
//
//  说明:
//==========================================================
void OneNet_SendData(void)
{
    
    

    MQTT_PACKET_STRUCTURE mqttPacket = {
    
    NULL, 0, 0, 0};                                             //协议包

    char buf[256];

    short body_len = 0, i = 0;

    printf("Tips: OneNet_SendData-MQTT\r\n");

    memset(buf, 0, sizeof(buf));

    body_len = OneNet_FillBuf(buf);                                                                 //获取当前需要发送的数据流的总长度

    if(body_len)
    {
    
    
        if(MQTT_PacketSaveData(DEVID, body_len, NULL, 5, &mqttPacket) == 0)                         //封包
        {
    
    
            for(; i < body_len; i++)
                mqttPacket._data[mqttPacket._len++] = buf[i];

            ESP8266_SendData(mqttPacket._data, mqttPacket._len);                                    //上传数据到平台
            printf("Send %d Bytes\r\n", mqttPacket._len);

            MQTT_DeleteBuffer(&mqttPacket);                                                         //删包
        }
        else
            printf("WARN: EDP_NewBuffer Failed\r\n");
    }

}

//==========================================================
//  函数名称:   OneNet_RevPro
//
//  函数功能:   平台返回数据检测
//
//  入口参数:   dataPtr:平台返回的数据
//
//  返回参数:   无
//
//  说明:
//==========================================================
void OneNet_RevPro(unsigned char *cmd)
{
    
    

    MQTT_PACKET_STRUCTURE mqttPacket = {
    
    NULL, 0, 0, 0};                             //协议包

    char *req_payload = NULL;
    char *cmdid_topic = NULL;

    unsigned short req_len = 0;

    unsigned char type = 0;

    short result = 0;

    char *dataPtr = NULL;
    char numBuf[10];
    int num = 0;

    type = MQTT_UnPacketRecv(cmd);
    switch(type)
    {
    
    
        case MQTT_PKT_CMD:                                                          //命令下发

            result = MQTT_UnPacketCmd(cmd, &cmdid_topic, &req_payload, &req_len);   //解出topic和消息体
            if(result == 0)
            {
    
    
                printf("cmdid: %s, req: %s, req_len: %d\r\n", cmdid_topic, req_payload, req_len);

                if(MQTT_PacketCmdResp(cmdid_topic, req_payload, &mqttPacket) == 0)  //命令回复组包
                {
    
    
                    printf("Tips: Send CmdResp\r\n");

                    ESP8266_SendData(mqttPacket._data, mqttPacket._len);            //回复命令
                    MQTT_DeleteBuffer(&mqttPacket);                                 //删包
                }
            }

        break;

        case MQTT_PKT_PUBACK:                                                       //发送Publish消息,平台回复的Ack

            if(MQTT_UnPacketPublishAck(cmd) == 0)
               printf("Tips: MQTT Publish Send OK\r\n");

        break;

        default:
            result = -1;
        break;
    }

    ESP8266_Clear();                                    //清空缓存

    if(result == -1)
        return;

    dataPtr = strchr(req_payload, '}');                 //搜索'}'

    if(dataPtr != NULL && result != -1)                 //如果找到了
    {
    
    
        dataPtr++;

        while(*dataPtr >= '0' && *dataPtr <= '9')       //判断是否是下发的命令控制数据
        {
    
    
            numBuf[num++] = *dataPtr++;
        }
        numBuf[num] = 0;

        num = atoi((const char *)numBuf);               //转为数值形式
    }

    if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
    {
    
    
        MQTT_FreeBuffer(cmdid_topic);
        MQTT_FreeBuffer(req_payload);
    }

}

(4)ONENET.h

#ifndef _ONENET_H_
#define _ONENET_H_





_Bool OneNet_DevLink(void);

void OneNet_SendData(void);

void OneNet_RevPro(unsigned char *cmd);

#endif

(5)UART6.c

//硬件驱动
#include "UART6.h"

//C库
#include <stdarg.h>
#include <string.h>
#include <stdio.h>



/*
************************************************************
*   函数名称:   Usart6_Init
*
*   函数功能:   串口6初始化
*
*   入口参数:   baud:设定的波特率
*
*   返回参数:   无
*
*   说明:     TX-Pc0     RX-PC1
************************************************************
*/
void Usart6_Init(unsigned int baud)
{
    
    

    GPIO_InitTypeDef gpio_initstruct;
    USART_InitTypeDef usart_initstruct;
    NVIC_InitTypeDef nvic_initstruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART6, ENABLE);

    //PC0   TXD
    gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio_initstruct.GPIO_Pin = GPIO_Pin_0;
    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &gpio_initstruct);

    //PC1   RXD
    gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    gpio_initstruct.GPIO_Pin = GPIO_Pin_1;
    gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &gpio_initstruct);

    usart_initstruct.USART_BaudRate = baud;
    usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流控
    usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                        //接收和发送
    usart_initstruct.USART_Parity = USART_Parity_No;                                    //无校验
    usart_initstruct.USART_StopBits = USART_StopBits_1;                             //1位停止位
    usart_initstruct.USART_WordLength = USART_WordLength_8b;                            //8位数据位
    USART_Init(UART6, &usart_initstruct);

    USART_Cmd(UART6, ENABLE);                                                      //使能串口

    USART_ITConfig(UART6, USART_IT_RXNE, ENABLE);                                  //使能接收中断

    nvic_initstruct.NVIC_IRQChannel = UART6_IRQn;
    nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
    nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;
    nvic_initstruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&nvic_initstruct);

}

/*
************************************************************
*   函数名称:   Usart_SendString
*
*   函数功能:   串口数据发送
*
*   入口参数:   USARTx:串口组
*               str:要发送的数据
*               len:数据长度
*
*   返回参数:   无
*
*   说明:
************************************************************
*/
void Usart_SendString(USART_TypeDef *USARTx, unsigned char *str, unsigned short len)
{
    
    

    unsigned short count = 0;

    for(; count < len; count++)
    {
    
    
        USART_SendData(USARTx, *str++);                                 //发送数据
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);     //等待发送完成
    }

}

/*
************************************************************
*   函数名称:   UsartPrintf
*
*   函数功能:   格式化打印
*
*   入口参数:   USARTx:串口组
*               fmt:不定长参
*
*   返回参数:   无
*
*   说明:
************************************************************
*/
void UsartPrintf(USART_TypeDef *USARTx, char *fmt,...)
{
    
    

    unsigned char UsartPrintfBuf[296];
    va_list ap;
    unsigned char *pStr = UsartPrintfBuf;

    va_start(ap, fmt);
    vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap);                         //格式化
    va_end(ap);

    while(*pStr != 0)
    {
    
    
        USART_SendData(USARTx, *pStr++);
        while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
    }

}

(6) main function

int main(void)
{
    
       unsigned short timeCount = 0;    //发送间隔变量

    unsigned char *dataPtr = NULL;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);	//打印调试串口
	uart2_init(115200);//接收评估板标志符串口
	Usart6_Init(115200);//esp8266串口
	printf("666\r\n");
	ESP8266_Init();                 //初始化ESP8266
	while(OneNet_DevLink())         //接入OneNET
	Delay_Ms(500);
	//data[0]=random()%126;
	//data[1]=random()%103;
	data[2]=100;
	data[3]=120;
	data[4]=140;
	data[5]=160;
	data[6]=170;
	data[7]=210;
	while(1)
    {
    
    
	    data[0]=random()%126;
        data[1]=random()%103;
	   
        if(++timeCount >= 500)                                  //发送间隔5s
                {
    
    
                    //SHT20_GetValue();

                    printf("OneNet_SendData\r\n");
                    OneNet_SendData();                                  //发送数据

                    timeCount = 0;
                    ESP8266_Clear();
                }

                dataPtr = ESP8266_GetIPD(0);
                if(dataPtr != NULL)
                    OneNet_RevPro(dataPtr);
                Delay_Ms(10);
	}
}

2. The process of code porting and the problems to be paid attention to when connecting to the ONENET cloud platform

1. Transplantation process

① Write clearly which serial port is to communicate with ESP8266, pay attention to initialization.
②In the source code, the reset port of ESP8266 has written high and low levels, but I deleted it here, because I bought ESP-01s, which comes with AT firmware, which can be directly connected to WIFI without downloading. At the same time, only 4 data lines are needed: RX, TX, VCC, GND, so I don’t care whether to write the reset port.
③Pay attention to the size of the sent data: when you send less data, it may be enough to use buf[128], but if it is more, then after the wifi is connected, the serial port debugging assistant will always be stuck at the position of sending data bytes, because the buffer array is not big enough, so it needs to be changed to a larger size.
④The core function of sending data is unsigned char OneNet_FillBuf(char *buf), just add data one by one according to the format, pay attention to the data grid type.
⑤I didn't write the MQTT library because I don't need to change it myself. Mr. Zhang Jirui wrote it very well, and encapsulated the MQTT protocol package very well.

2. Cloud on ONENET

①The part that users need to modify by themselves: WiFi name and password. Just turn on the mobile hotspot, the 2.4GHz frequency band.

//AT+CWJAP指令用于连接WiFi网络,后面的参数中,ONENET表示WiFi网络的名称,而IOT@Chinamobile123则是WiFi网络的密码。
#define ESP8266_WIFI_INFO       "AT+CWJAP=\"OEN\",\"12345678\"\r\n"

//AT+CIPSTART指令用于连接TCP服务器,后面的参数中,TCP表示使用TCP协议连接服务器,183.230.40.39表示OneNET服务器的IP地址,而6002则是OneNET服务器的端口号。
#define ESP8266_ONENET_INFO     "AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n"

These three IDs can be found on the cloud platform, and you should also pay attention to modifying them. There is nothing else that needs to be modified.

//产品ID(PROID)是OneNET平台上创建的产品的唯一标识符,用于区分不同的产品;
#define PROID       "610694"
//鉴权信息(AUTH_INFO)是用于验证设备身份的密钥,用于确保只有经过授权的设备可以连接到OneNET平台
#define AUTH_INFO   "test"
//设备ID(DEVID)是OneNET平台上创建的设备的唯一标识符,用于区分不同的设备。
#define DEVID       "1100462854"

② Regarding the cloud platform, after logging in, you must choose MQTT (old version), multi-protocol access, and after creating a project, you can view the uploaded information by viewing the data stream. In addition, the interval of uploading data is based on the count value of timeCount. If a lot of other operations have been performed before the data is transmitted online, the data transmission will be very slow, and the count value needs to be adjusted appropriately.

Guess you like

Origin blog.csdn.net/qq_53092944/article/details/131330038