STM32(hal库)通过MQTT协议连接onenet

STM32(hal库)通过MQTT协议连接onenet
在中国移动物联⽹平台onenet,选择⽤多协议的mqtt旧版协议新建产品和设备。然后根据⾃⼰的情况更改程序中的参数。数据流上传时要根据⾃⼰的数据将程序中固定的更改为动态赋值就好了。本程序参考
⼀、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--)//等待串⼝接收完毕或超时退出
while(strstr(dest,src)==0&& retry_nms--)//等待串⼝接收完毕或超时退出{
HAL_Delay(10);
}
if(retry_nms)return1;
return0;
}
/**
* 功能:检查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)
{
return1;
}
}
return0;
}
/**
* 功能:初始化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是否存在{
return0;
}
标定板
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));//清空接收缓冲
// ESP8266_ATSendString("ATE0\r\n");      //关闭回显
if(FindStr((char*)usart1_rxbuf,"OK",500)==0)//设置不成功
{
return0;
}
return1;//设置成功
}
/
**
* 功能:恢复出⼚设置
* 参数: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)
return0;
弹簧网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 {
return1;
}
}
return0;
}
//开启透传模式
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)
{
return1;
}
}
return0;
}
/
**
* 功能:使⽤指定协议(TCP/UDP)连接到服务器
* 参数:
*        mode:协议类型 "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)
{
break;
}
}
if(cnt ==0)
return0;
//设置透传模式
if(ESP8266_OpenTransmission()==0)return0;
//开启发送状态
cnt=2;
while(cnt--)
{
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));//清空接收缓冲
ESP8266_ATSendString("AT+CIPSEND\r\n");//开始处于透传发送状态
if(FindStr((char*)usart1_rxbuf,">",200)!=0)
{
return1;
}
}
return0;
}
/**
* 功能:主动和服务器断开连接
* 参数:None
* 返回值:
*        连接结果,⾮0断开成功,0断开失败
*/
uint8_t DisconnectServer(void)
{
uint8_t cnt;
ESP8266_ExitUnvarnishedTrans();//退出透传
HAL_Delay(500);
while(cnt--)
{
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));//清空接收缓冲
ESP8266_ATSendString("AT+CIPCLOSE\r\n");//关闭链接
ESP8266_ATSendString("AT+CIPCLOSE\r\n");//关闭链接
if(FindStr((char*)usart1_rxbuf,"CLOSED",200)!=0)//操作成功,和服务器成功断开{
break;
}
}
if(cnt)return1;
return0;
}
⼆、mqtt连接onenet服务器及设备驱动
#include"esp8266_mqtt.h"
#include"esp8266_at.h"
#define BYTE0(dwTemp)      (*( char *)(&dwTemp))
#define BYTE1(dwTemp)      (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp)      (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp)      (*((char *)(&dwTemp) + 3))
//连接成功服务器回应 20 02 00 00
//客户端主动断开连接 e0 00
const uint8_t parket_connetAck[]={0x20,0x02,0x00,0x00};
const uint8_t parket_disconnet[]={0xe0,0x00};
const uint8_t parket_heart[]={0xc0,0x00};
const uint8_t parket_heart_reply[]={0xc0,0x00};
const uint8_t parket_subAck[]={0x90,0x03};
volatile uint16_t MQTT_TxLen;
//MQTT发送数据
void MQTT_SendBuf(uint8_t *buf,uint16_t len)
{
ESP8266_ATSendBuf(buf,len);
}
//发送⼼跳包
void MQTT_SentHeart(void)
{
MQTT_SendBuf((uint8_t *)parket_heart,sizeof(parket_heart));
}
//MQTT⽆条件断开
void MQTT_Disconnect()
万花茶
{
MQTT_SendBuf((uint8_t *)parket_disconnet,sizeof(parket_disconnet));
旋转衣柜}
//MQTT初始化
void MQTT_Init(uint8_t *prx,uint16_t rxlen,uint8_t *ptx,uint16_t txlen)
{
memset(usart1_txbuf,0,sizeof(usart1_txbuf));//清空发送缓冲
memset(usart1_rxbuf,0,sizeof(usart1_rxbuf));//清空接收缓冲
//⽆条件先主动断开
MQTT_Disconnect();HAL_Delay(100);
MQTT_Disconnect();HAL_Delay(100);
}
//==========================================================
// 函数名称: MQTT_Connect  MQTT连接服务器的打包函数
//
// 函数功能: Connect连接消息组包
//
// ⼊⼝参数: ClientID:设备ID

本文发布于:2024-09-22 21:31:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/109791.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:连接   接收   发送
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议