ESP8266 连接OneNET物联网平台

Pursue

esp8266.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "esp8266.h"

#include <stdio.h>
#include <string.h>

#define WIFI_SSID "Xiaomi"
#define WIFI_Password "913752468"

/**
* ONENET: 产品名->产品ID->TOKEN
*/
#define CLIENT_ID "01"
#define USERNAME "dVb8DLDvZW"
#define PASSWORD "version=2018-10-31&res=products%2FdVb8DLDvZW%2Fdevices%2F01&et=1937255523&method=md5&sign=2fQX%2B229WO0dERtjRnWuiQ%3D%3D"
#define IP "mqtts.heclouds.com"

#define SUB_Topic "$sys/dVb8DLDvZW/01/thing/property/post/reply"
#define PUB_Topic "$sys/dVb8DLDvZW/01/thing/property/post"

//接收返回消息缓冲
uint8_t esp_buf[MAX_SIZE];


void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart == &huart4)
{
//printf("%s\n", esp_buf);
HAL_UARTEx_ReceiveToIdle_DMA(&hespuart, esp_buf, MAX_SIZE);
__HAL_DMA_DISABLE_IT(&hdma_esp_rx, DMA_IT_HT);
}
}

/**
* @brief 初始化模块并联网
*/
void ESP8266_Init(void)
{
HAL_UARTEx_ReceiveToIdle_DMA(&hespuart, esp_buf, MAX_SIZE);
__HAL_DMA_DISABLE_IT(&hdma_esp_rx, DMA_IT_HT);
Msg_Clear();
while(SendCmd((uint8_t *)"ATE0\r\n",(uint8_t *)"OK")){}
while(SendCmd((uint8_t *)"AT+CWJAP=\""WIFI_SSID"\",\""WIFI_Password"\"\r\n",(uint8_t *)"WIFI GOT IP")){}
printf("WIFI连接成功\n");
while(SendCmd((uint8_t *)"AT+MQTTUSERCFG=0,1,\""CLIENT_ID"\",\""USERNAME"\",\""PASSWORD"\",0,0,\"\"\r\n",(uint8_t *)"OK")){}
while(SendCmd((uint8_t *)"AT+MQTTCONN=0,\""IP"\",1883,1\r\n",(uint8_t *)"MQTTCONNECTED")){}
printf("MQTT连接成功\n");
while(SendCmd((uint8_t *)"AT+MQTTSUB=0,\""SUB_Topic"\",0\r\n",(uint8_t *)"OK")){}
}

/**
* @brief 向话题发布消息
* @param attribute 属性
* @param data 值
*/
void sendData(char *attribute, float data)
{
uint8_t msg_buf[512];
memset(msg_buf,0,sizeof(msg_buf));
sprintf((char *)msg_buf,"AT+MQTTPUB=0,\""PUB_Topic"\",\"{\\\"id\\\":\\\"123\\\"\\,\\\"params\\\":{\\\"%s\\\":{\\\"value\\\":%.f\\}}}\",0,0\r\n", attribute ,data);
while(SendCmd(msg_buf,(uint8_t*)"OK"));
}

/**
* @brief 清空消息
*/
void Msg_Clear()
{
memset(esp_buf,0,sizeof(esp_buf));
}

/**
* @brief 串口发送字符串
* @param str 待发送字符串
* @param len 字符串长度
*/
void SendString(uint8_t *str,uint8_t len)
{
for (int i = 0; i < len; i++) {
while ((ESP_UART->SR & 0X40) == 0); // 等待上一次串口数据发送完成
ESP_UART->DR = (uint8_t)str[i]; // 写DR,串口将发送数据
}
}

/**
* @brief 发送指令并比较收到的字符串,判断指令是否发送成功
* @param cmd 待发送指令
* @param res 模块理论返回的字符串
* @retval 0:发送成功 1:发送失败
*/
uint8_t SendCmd(uint8_t *cmd,uint8_t *res)
{
uint8_t num = 255;
Msg_Clear();
SendString(cmd,strlen((const char *)cmd));
while(num--)
{
if(strstr((char*)esp_buf,(char *)res))
{
Msg_Clear();
return 0;
}
HAL_Delay(10);
}
return 1;
}


esp8266.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef __ESP8266_H
#define __ESP8266_H

#include "main.h"

#define MAX_SIZE 256

extern UART_HandleTypeDef huart4;
extern DMA_HandleTypeDef hdma_uart4_rx;
#define hespuart huart4
#define ESP_UART UART4
#define hdma_esp_rx hdma_uart4_rx

void ESP8266_Init(void);
void Msg_Clear();
void sendData(char *attribute, float data);
void SendString(uint8_t *str,uint8_t len);
uint8_t SendCmd(uint8_t *cmd,uint8_t *res);

#endif

评论
目录
ESP8266 连接OneNET物联网平台