admin管理员组文章数量:1630571
在中国移动物联网平台onenet,选择用多协议的mqtt旧版协议新建产品和设备。然后根据自己的情况更改程序中的参数。数据流上传时要根据自己的数据将程序中固定的更改为动态赋值就好了。本程序参考超级大洋葱806的STM32CubeMX ESP8266 AT指令实现MQTT协议并接入阿里云IOT平台源码解析【附Github源码地址】
一、esp8266驱动
我将esp8266设置为station透传模式
#include "esp8266_at.h"
//usart1发送和接收数组
uint8_t usart1_txbuf[256];
uint8_t usart1_rxbuf[512];
uint8_t usart1_rxone[1];
uint8_t usart1_rxcounter;
//串口1发送一个字节
static void USART1_SendOneByte(uint8_t val)
{
((UART_HandleTypeDef *)&huart1)->Instance->DR = ((uint16_t)val & (uint16_t)0x01FF);
while((((UART_HandleTypeDef *)&huart1)->Instance->SR&0X40)==0);//等待发送完成
}
//向ESP8266发送定长数据
void ESP8266_ATSendBuf(uint8_t* buf,uint16_t len)
{
memset(usart1_rxbuf,0, 256);
//每次发送前将接收串口接收总数置0,为了接收
usart1_rxcounter = 0;
//定长发送
HAL_UART_Transmit(&huart1,(uint8_t *)buf,len,0xFFFF);
}
//向ESP8266发送字符串
void ESP8266_ATSendString(char* str)
{
memset(usart1_rxbuf,0, 256);
//每次发送前将接收串口接收总数置0,为了接收
usart1_rxcounter = 0;
//发送方法1
while(*str) USART1_SendOneByte(*str++);
//发送法法2
// HAL_UART_Transmit(&huart1,(uint8_t *)str,strlen(str),0xFFFF);
}
//退出透传
void ESP8266_ExitUnvarnishedTrans(void)
{
ESP8266_ATSendString("+++");HAL_Delay(50);
ESP8266_ATSendString("+++");HAL_Delay(50);
}
//查找字符串中是否包含另一个字符串
uint8_t FindStr(char* dest,char* src,uint16_t retry_nms)
{
retry_nms/=10; //超时时间
while(strstr(dest,src)==0 && retry_nms--)//等待串口接收完毕或超时退出
{
HAL_Delay(10);
}
if(retry_nms) return 1;
return 0;
}
/**
* 功能:检查ESP8266是否正常
* 参数:None
* 返回值:ESP8266返回状态
* 非0 ESP8266正常
* 0 ESP8266有问题
*/
uint8_t ESP8266_Check(void)
{
uint8_t check_cnt=5;
while(check_cnt--)
{
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf)); //清空接收缓冲
ESP8266_ATSendString("AT\r\n"); //发送AT握手指令
if(FindStr((char*)usart1_rxbuf,"OK",200) != 0)
{
return 1;
}
}
return 0;
}
/**
* 功能:初始化ESP8266
* 参数:None
* 返回值:初始化结果,非0为初始化成功,0为失败
*/
uint8_t ESP8266_Init(void)
{
//清空发送和接收数组
memset(usart1_txbuf,0,sizeof(usart1_txbuf));
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));
ESP8266_ExitUnvarnishedTrans(); //退出透传
HAL_Delay(500);
ESP8266_ATSendString("AT+RST\r\n");
HAL_Delay(800);
if(ESP8266_Check()==0) //使用AT指令检查ESP8266是否存在
{
return 0;
}
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf)); //清空接收缓冲
// ESP8266_ATSendString("ATE0\r\n"); //关闭回显
if(FindStr((char*)usart1_rxbuf,"OK",500)==0) //设置不成功
{
return 0;
}
return 1; //设置成功
}
/**
* 功能:恢复出厂设置
* 参数:None
* 返回值:None
* 说明:此时ESP8266中的用户设置将全部丢失回复成出厂状态
*/
void ESP8266_Restore(void)
{
ESP8266_ExitUnvarnishedTrans(); //退出透传
HAL_Delay(500);
ESP8266_ATSendString("AT+RESTORE\r\n"); //恢复出厂
}
/**
* 功能:连接热点
* 参数:
* ssid:热点名
* pwd:热点密码
* 返回值:
* 连接结果,非0连接成功,0连接失败
* 说明:
* 失败的原因有以下几种(UART通信和ESP8266正常情况下)
* 1. WIFI名和密码不正确
* 2. 路由器连接设备太多,未能给ESP8266分配IP
*/
uint8_t ESP8266_ConnectAP(char* ssid,char* pswd)
{
uint8_t cnt=5;
while(cnt--)
{
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));
ESP8266_ATSendString("AT+CWMODE=1\r\n"); //设置为STATION模式
if(FindStr((char*)usart1_rxbuf,"OK",200) != 0)
{
break;
}
}
if(cnt == 0)
return 0;
cnt=2;
while(cnt--)
{
memset(usart1_txbuf,0,sizeof(usart1_txbuf));//清空发送缓冲
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));//清空接收缓冲
sprintf((char*)usart1_txbuf,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pswd);//连接目标AP
ESP8266_ATSendString((char*)usart1_txbuf);
if(FindStr((char*)usart1_rxbuf,"OK",8000)!=0) //连接成功且分配到IP
{
return 1;
}
}
return 0;
}
//开启透传模式
static uint8_t ESP8266_OpenTransmission(void)
{
//设置透传模式
uint8_t cnt=2;
while(cnt--)
{
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));
ESP8266_ATSendString("AT+CIPMODE=1\r\n");
if(FindStr((char*)usart1_rxbuf,"OK",200)!=0)
{
return 1;
}
}
return 0;
}
/**
* 功能:使用指定协议(TCP/UDP)连接到服务器
* 参数:
* mode:协议类型 "TCP","UDP"
* ip:目标服务器IP
* port:目标是服务器端口号
* 返回值:
* 连接结果,非0连接成功,0连接失败
* 说明:
* 失败的原因有以下几种(UART通信和ESP8266正常情况下)
* 1. 远程服务器IP和端口号有误
* 2. 未连接AP
* 3. 服务器端禁止添加(一般不会发生)
*/
uint8_t ESP8266_ConnectServer(char* mode,char* ip,uint16_t port)
{
uint8_t cnt;
ESP8266_ExitUnvarnishedTrans(); //多次连接需退出透传
HAL_Delay(500);
//连接服务器
cnt=2;
while(cnt--)
{
memset(usart1_txbuf,0,sizeof(usart1_txbuf));//清空发送缓冲
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));//清空接收缓冲
sprintf((char*)usart1_txbuf,"AT+CIPSTART=\"%s\",\"%s\",%d\r\n",mode,ip,port);
ESP8266_ATSendString((char*)usart1_txbuf);
if(FindStr((char*)usart1_rxbuf,"CONNECT",8000) !=0 )
{
版权声明:本文标题:STM32(hal库)通过MQTT协议连接onenet 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729027132a1183381.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论