STM32+ESP8266使用MQTTAT固件连接云

本文介绍了如何使用STM32F103C8T6配合ESP8266-01,借助MQTTAT固件实现连接腾讯云的过程。通过发送特定的AT指令,设置ESP8266的网络连接、MQTT参数,并在STM32中实现指令发送,最终实现设备上线。遇到的问题包括指令间需要添加延时,以及阿里云客户端ID需要转义字符。

        最近在做毕设,其中想把STM32连接ESP8266来连接云平台。一开始是想直接编写一个使用MQTT协议上云的代码来完成的,但因为没有物联网的知识,想直接移植别人写好的又很难放进我自己的代码里,导致进度一直被卡。最近发现有使用MQTT上云的AT固件,能直接向ESP8266发送AT命令来连接云服务器,马上就实现了STM32上云。

        其实也有其他作者写了相关文章,不过我自认为自己比较菜,写的代码也比较简单,移植也相对简单,下面是相关介绍。

        硬件:STM32F103C8T6+ESP8266-01

        开发软件:Keil5

        云服务器:腾讯云(其实腾讯云和阿里云连接方式差不多)

        AT固件下载:AT固件汇总 | 安信可科技

        如果和我一样是用ESP8266-01的记得要烧录1471号,因为flash大小是不一样的。烧录教程挺多的,我就不讲了。

       

接线
STM32ESP8266
PA2RX
PA3TX
VCC3.3V
EN3.3V
GNDGND

        在云平台注册,新建产品、设备,得到"client_id","username","password"三个物联网参数,就可以进行代码操作啦!

我是用串口2连接ESP8266的

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);	//使能USART1,GPIOA时钟
USART_DeInit(USART2);                                   //复位串口2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;               //USART2_TX   PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	        //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化PA9  
							
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;              //USART2_RX	  PA.10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);                  //初始化PA10

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		  
NVIC_InitStructure.NVIC_IRQChannelCmd = ITsta;			    //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);	                        //根据指定的参数初始化VIC寄存器						

USART_InitStructure.USART_BaudRate = 115200;            
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;     //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;        //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

USART_Init(USART2, &USART_InitStructure);                     //初始化串口
USART_ITConfig(USART2, USART_IT_RXNE, ITsta);                //开启中断
USART_Cmd(USART2, ENABLE);                    //使能串口 	

        配置好STM32后,使用下面7个AT指令,就可以连接云平台了。

AT+RST
 
AT+RESTORE
 
AT+CWMODE=1
 
AT+CIPSNTPCFG=1,8,"ntp.tencent.com"
 
AT+CWJAP="WiFi名字","WiFi密码"
 
AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,""
 
AT+MQTTCLIENTID=0,"ClienId"    
 
AT+MQTTCONN=0,"连接域名",1883,1    

        这里要注意的是,发送AT指令之间要延时一段时间。我看别人似乎不需要延时,但我在测试的时候确实是要加延时程序的,不知道是不是我的硬件问题。通过以下代码向ESP8266发送AT指令。

ESP8266_send("AT+RST");   
DelayMs(5000);
ESP8266_send("AT+CWMODE=1");   //设置为softAP模式
DelayMs(1000);
ESP8266_send("AT+CIPSNTPCFG=1,8,ntp1.tencent.com");
DelayMs(1000);
ESP8266_send("AT+CWJAP=\"WIFI名\",\"WIFI密码\"" );	//输入WIFI名,WIFI密码
DelayMs(5000);
ESP8266_send("AT+MQTTUSERCFG=0,1,\"NULL\",\"username\",\"passward\",0,0,\"\"" );  //
DelayMs(5000);
ESP8266_send("AT+MQTTCLIENTID=0,\"clienid\"");
DelayMs(3000);
ESP8266_send("AT+MQTTCONN=0,\"产品ID.iotcloud.tencentdevices.com\",1883,1");	//服务器,端口
DelayMs(5000);
ESP8266_send("AT+MQTTSUB=0,\"$thing/down/property/产品ID/设备ID\",1");  //订阅腾讯云下发主题
DelayMs(3000);


这是我的向ESP8266发送数据代码
void ESP8266_send( char *s){
	while (*s) {     
	 Usart2_Send(*s);     
	 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
	 s ++;     
	}
	Usart2_Send(0x0d);     
    while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
	Usart2_Send(0x0a);     
    while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}


void Usart2_Send(uint16_t ch)
{
     USART2->DR = (ch & (uint16_t)0x01FF);			
}

        如果你连接的是腾讯云,那这里直接招模板写就行。但是,如果你要连接阿里云,在clienid填写要小心每一个,都要加转义字符即\,。

        当你上述代码没有问题,在STM32烧录后,稍等片刻,云平台就会显示你的设备已经上线。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值