STM32+ESP8266(ESP-01S)连接MQTT代码改进为连接阿里云

https://blog.csdn.net/it_boy__/article/details/71975797icon-default.png?t=N7T8https://blog.csdn.net/it_boy__/article/details/71975797我的使用MQTT的代码是参考的这位大神和安可信官方的

https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BBicon-default.png?t=N7T8https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB

STM32+ESP8266(ESP-01S)连接MQTT代码改进为连接阿里云_第1张图片

这里他们写过的代码,我就不赘述了,重点说我改进的部分,(虽然改变很小)

STM32+ESP8266(ESP-01S)连接MQTT代码改进为连接阿里云_第2张图片

作者这个是连接本地MQTT服务器的例程,我主要是改进一下,让这段代码可以连上阿里云

阿里云的注册还有设备的创建还有需要的AT指令网上有博主写好了,推荐大家看一下他的

https://blog.csdn.net/yijujishouweihe/article/details/128694641?ops_request_misc=&request_id=&biz_id=102&utm_term=esp01s%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91%E8%BF%87%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-128694641.142^v94^insert_down1&spm=1018.2226.3001.4187icon-default.png?t=N7T8https://blog.csdn.net/yijujishouweihe/article/details/128694641?ops_request_misc=&request_id=&biz_id=102&utm_term=esp01s%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91%E8%BF%87%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-128694641.142^v94^insert_down1&spm=1018.2226.3001.4187那现在我们有了通过STM32连接本地MQTT服务器的代码和ESP-01S通过MQTT协议连接阿里云需要的AT指令,这个时候我们就可以将两者结合一下。来完成STM32+ESP01S连接阿里云。

//下面为ESP8266MQTT功能指令

/*
*MQTT配置用户属性
*LinkID 连接ID,目前只支持0
*scheme 连接方式,这里选择MQTT over TCP,这里设置为1
*client_id MQTTclientID 用于标志client身份
*username 用于登录 MQTT 服务器 的 username
*password 用于登录 MQTT 服务器 的 password
*cert_key_ID 证书 ID, 目前支持一套 cert 证书, 参数为 0
*CA_ID 目前支持一套 CA 证书, 参数为 0
*path 资源路径,这里设置为""
*设置成功返回true 反之false
*/
bool ESP8266_CIPSNTPCFG( char * SNTP_Server)
{
    char cCmd [120];
    sprintf ( cCmd, "AT+CIPSNTPCFG=1,8,\"%s\"",SNTP_Server);
    return ESP8266_Send_AT_Cmd( cCmd, "OK", NULL, 500 );
}
//ESP8266连接外部的WIFI
//pSSID WiFi帐号
//pPassWord WiFi密码
//设置成功返回true 反之false
bool ESP8266_JoinAP( char * pSSID, char * pPassWord)
{
    char cCmd [120];
	
    sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
    return ESP8266_Send_AT_Cmd( cCmd, "OK", NULL, 5000 );
}
//
bool ESP8266_MQTTUSERCFG( char * pUserName,char * PassWord)
{
    char cCmd [120];
    sprintf ( cCmd, "AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\",\"%s\",0,0,\"\"",pUserName,PassWord );
    return ESP8266_Send_AT_Cmd( cCmd, "OK", NULL, 500 );
}
//
bool ESP8266_MQTTCLIENTID( char * pClient_Id)
{
    char cCmd [150];
    sprintf ( cCmd, "AT+MQTTCLIENTID=0,\"%s\"", pClient_Id );
    return ESP8266_Send_AT_Cmd( cCmd, "OK", NULL, 500 );
}
/*
*连接指定的MQTT服务器
*LinkID 连接ID,目前只支持0
*IP:MQTT服务器上对应的IP地址
*ComNum MQTT服务器上对应的端口号,一般为1883
*设置成功返回true 反之false
*/
bool ESP8266_MQTTCONN( char * Ip, int  Num)
{
    char cCmd [120];
    sprintf ( cCmd,"AT+MQTTCONN=0,\"%s\",%d,1", Ip,Num);
    return ESP8266_Send_AT_Cmd_dddddd( cCmd, "OK", NULL, 6 );
}

/*
*订阅指定连接的 MQTT 主题, 可重复多次订阅不同 topic

*设置成功返回true 反之false
*/
bool ESP8266_MQTTSUB(char * Topic)
{
    char cCmd [120];
    sprintf ( cCmd, "AT+MQTTSUB=0,\"%s\",1",Topic );
    return ESP8266_Send_AT_Cmd( cCmd, "OK", NULL, 500 );
}


/*
*在LinkID上通过 topic 发布数据 data, 其中 data 为字符串消息
*设置成功返回true 反之false
*/
bool ESP8266_MQTTPUB( char * Topic,char * Sign,uint8_t Data)
{
//AT+MQTTPUB=0,"/sys/k068uGzonWi/ONEDAY/thing/event/property/post","{\"method\":\"thing.service.property.set\"\,\"id\":\"2012934117\"\,\"params\":{\"Temp\":36.6}\,\"version\":\"1.0.0\"}",1,0
    char cCmd [255];
				  //AT+MQTTPUB=0,"%s","{\"method\":\"thing.service.property.set\"\,\"id\":\"2012934117\"\,\"params\":{\"Temp\":36.6}\,\"version\":\"1.0.0\"}",1,0
    sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"{\\\"method\\\":\\\"thing.service.property.set\\\"\\,\\\"id\\\":\\\"2012934117\\\"\\,\\\"params\\\":{\\\"%s\\\":%d}\\,\\\"version\\\":\\\"1.0.0\\\"}\",1,0", Topic ,Sign,Data);
    return ESP8266_Send_AT_Cmd_dddddd( cCmd, "OK", NULL, 20);
}


//ESP8266发送字符串
//设置成功返回true, 反之false
bool MQTT_SendString(char * pTopic,char * Sign,uint8_t temp2)
{
	
    bool bRet = false;
    bRet = ESP8266_MQTTPUB(pTopic,Sign,temp2);
//	  delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);//延时增加数据上传成功率
//    bRet = true;
    return bRet;

}

在这里移植例程的作者将MQTT_SendString函数设为默认发送成功,这样写适合刚开始调试时使用,但是对于一个稳定上传数据的程序显然是不友好的,因为你无法判断,数据发送成功的真实性,所以这里我将ESP8266_Send_AT_Cmd里面的延时改进一下就有了ESP8266_Send_AT_Cmd_dddddd,用于MQTT_SendString函数、ESP8266_MQTTCONN函数

等发送AT指令需要等待延时时间长的函数,并将MQTT_SendString函数发送数据成功与否改为真实数据,此时就可以得到真实的发送数据成功与否的返回值。适合比如说需要用单片机稳定的上传数据时使用。

连接MQTT的函数改进如下:主要增加了超时返回连接错误,不超时连接成功

#include "mqtt.h"
#include "esp8266.h"
#include "OLED.h"
//返回0连接错误/返回1连接成功
uint8_t ESP8266_STA_MQTTClient_Test(void)
{
	uint8_t i=0;

	OLED_ShowString(2,1,"                ");
	OLED_ShowString(2,5,"  GO!");
    ESP8266_Rst();//重启
	OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>              ");
//	OLED_ShowString(2,1,"                ");
//	OLED_ShowString(2,5,"STA");
    ESP8266_Net_Mode_Choose(STA);
    OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>            ");
//	OLED_ShowString(2,5,"                ");
//	OLED_ShowString(2,5,"SNTP");
	ESP8266_CIPSNTPCFG(User_ESP8266_SNTP_Server);
	OLED_ShowString(2,1,"                ");
	OLED_ShowString(2,4,"Link WIFI");
    OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>>>          ");
    while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD))
	{
		i++;
		if(i>15)
		{
			i=0;
			return 0;
		}
	}
	//没有连上网络一样会卡死,应该时没连上网之后无法跳出函数或者循环次数过多导致
    OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>>>>>        ");
//	OLED_ShowString(2,1,"                ");
//	OLED_ShowString(2,5,"Log_In");
	while(!ESP8266_MQTTUSERCFG(User_ESP8266_username,User_ESP8266_password))
	{
		i++;
		if(i>10)
		{
			i=0;
			return 0;
		}
	}
	OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>>>>>>>      ");
	while(!ESP8266_MQTTCLIENTID( User_ESP8266_client_id))
	{
		i++;
		if(i>10)
		{
			i=0;
			return 0;
		}
	}
	OLED_ShowString(2,1,"                ");
	OLED_ShowString(2,4,"Link Cloud");
	OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>>>>>>>>>    ");
	while(!ESP8266_MQTTCONN( User_ESP8266_MQTTServer_IP, User_ESP8266_MQTTServer_PORT))
	{
		i++;
		if(i>25)
		{
			i=0;
			return 0;
		}
	}
    OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>>>>>>>>>>>  ");
//	OLED_ShowString(2,1,"                ");
//	OLED_ShowString(2,5," Topic");
	while(!ESP8266_MQTTSUB( User_ESP8266_MQTTServer_Topic))
	{
		i++;
		if(i>25)
		{
			i=0;
			return 0;
		}
	}
	OLED_ShowString(3,1,"                ");
	OLED_ShowString(3,1,">>>>>>>>>>>>>>>>");
	OLED_ShowString(2,1,"                ");
	OLED_ShowString(2,5,"  OK!");
	return 1;
}

大家也可以显示连接过程的时候加入显示条显示,让等待的时间变得更加有趣!

STM32+ESP8266(ESP-01S)连接MQTT代码改进为连接阿里云_第3张图片

你可能感兴趣的:(阿里云,stm32,单片机,模块测试)