ESP8266 -- STM32与阿里云物联网平台建立通信(四)

这篇具有很好参考价值的文章主要介绍了ESP8266 -- STM32与阿里云物联网平台建立通信(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

链接快速定位

前沿

1 准备工作

2 硬件环境介绍

3 软件环境介绍

3.1 串口初始化及配置

3.2 编写AT MQTT指令代码

3.2.1 ESP8266_Cmd函数介绍

3.2.2 wifi连接函数介绍

3.2.3 云端连接语句介绍

3.2.4 环回消息测试语句介绍

3.2.5 属性上报语句介绍

3.2.6 设置属性语句介绍

4 实验现象

4.1 代码运行现象

4.2 属性上报现象  

 4.3 设置属性现象


链接快速定位

ESP8266 -- 烧录AT固件(一)

ESP8266 -- 搭建阿里云物联网与MQTT.fx通信的平台(二)

ESP8266 -- 串口助手 AT MQTT 指令与阿里云物联网平台建立通信(三)

演示代码在文章顶部可以下载,也可以通过评论留下邮箱进行发送

前沿

        前面讲解了固件的烧录,搭建阿里云物联网平台和esp8266利用串口助手与阿里云物联网平台建立通信,本小节主要讲解利用STM32与esp8266模块进行通信。

1 准备工作

        在进行本小节内容的时候,需要做如下的准备工作:

  • 烧录AT MQTT固件,见链接:ESP8266 -- 烧录AT固件(一)
  • 阿里物联网平台的搭建,见链接:ESP8266 -- 搭建阿里云物联网与MQTT.fx通信的平台(二)

        如果对AT指令不是很熟悉,建议参考:ESP8266 -- 串口助手 AT MQTT 指令与阿里云物联网平台建立通信(三),简单的掌握一下AT指令。

2 硬件环境介绍

       硬件选择安信可的ESP01S模块与STM32单片机相连接,具体连接方式这里不展开讲解,网上也有很多资料,原理就是串口间的通信。

3 软件环境介绍

        软件环境使用keil5,编译下载stm32f103标准库程序进行演示。演示代码在文章顶部可以下载,也可以通过评论留下邮箱进行发送。下面重点讲解软件代码。

3.1 串口初始化及配置

         主要实现了串口的初始化配置,并且使能了接收完成中断。

static void ESP8266_USART_Config ( void )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	
	/* config USART clock */
	macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );
	macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );
	
	/* USART GPIO config */
	/* Configure USART Tx as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin =  macESP8266_USART_TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);  
  
	/* Configure USART Rx as input floating */
	GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);
	
	/* USART mode config */
	USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	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(macESP8266_USARTx, &USART_InitStructure);

	/* 中断配置 */
	USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断 

	ESP8266_USART_NVIC_Configuration ();
	
	USART_Cmd(macESP8266_USARTx, ENABLE);
}
void macESP8266_USART_INT_FUN ( void )
{
    uint8_t ucCh;

    if ( USART_GetITStatus ( macESP8266_USARTx, USART_IT_RXNE ) != RESET )
    {
        ucCh  = USART_ReceiveData( macESP8266_USARTx );

        if ( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) ) //预留1个字节写结束符
        {
            strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ]  = ucCh;
        }
    }
}

3.2 编写AT MQTT指令代码

        以下就是AT MQTT实现的主要函数,此函数主要实现了以下功能:

  • wifi连接
  • 云端连接
  • 环回消息的测试
  • 属性上报
  • 设置属性
void ESP8266_Test(void)
{
	char cCmd [254];  //最多一次发送256字节,除去两个字节的换行符

    printf ( "正在配置 ESP8266 ......\r\n" );

    macESP8266_CH_ENABLE();
    
    ESP8266_AT_Test ();

    ESP8266_Net_Mode_Choose (STA);

    while ( ! ESP8266_JoinAP (ESP8266_APSSId, ESP8266_APPWD) );  
    printf("wifi已连接\r\n");
    
    /* 单连接模式 */
    ESP8266_Enable_MultipleId ( DISABLE );
    
    /* 配置云端参数 */
    sprintf (cCmd, "AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"", BROKER_CLIENT_ID, BROKER_USERNAME,BROKER_USERNAME_PWD);
    ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );    
    
    /* 连接云端 */
    sprintf (cCmd, "AT+MQTTCONN=0,\"%s\",%s,0", BROKER_HOST_IP, BROKER_HOST_PORT);
    ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );    		

    /* 订阅环回消息 */
    sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", LOOP_PUB_SUB_TOPIC);
    ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );     
    
    /* 发送环回消息 */
    sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", LOOP_PUB_SUB_TOPIC, testdata);
    ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );   

    /* 属性上报--订阅消息 */
    sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", POST_REPLY_TOPIC);
    ESP8266_Cmd ( cCmd, "OK", NULL, 1000 ); 
    
    /* 属性上报--发布消息 */
    sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", POST_TOPIC, postdata);
    ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );  

    while (1)
    {
        /* 设置属性--订阅消息 */
        sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", SET_PROPERTY_TOPIC);
        ESP8266_Cmd ( cCmd, "OK", NULL, 2000 );          
    }  
}

3.2.1 ESP8266_Cmd函数介绍

        此函数主要实现了向esp8266模块发送AT指令,并且在串口助手打印收到的AT回复,形参reply1和reply2为返回字符串的子集,如果返回字符串存在reply1和reply2这两个参数,那么返回成功。

bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{    
	strEsp8266_Fram_Record .InfBit .FramLength = 0;               //从新开始接收新的数据包

	macESP8266_Usart ( "%s\r\n", cmd );

	if ( ( reply1 == 0 ) && ( reply2 == 0 ) )                      //不需要接收数据
		return true;
	
	Delay_ms ( waittime );                 //延时
	
	strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';

	macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );
  
	if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) || 
						 ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) ); 
 	
	else if ( reply1 != 0 )
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );
	
	else
		return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );
	
}

3.2.2 wifi连接函数介绍

        连接wifi主要通过< AT+CWJAP="wifi帐号","wifi密码"  >指令进行wifi的连接,这里做了简单的处理,既是已经连上wifi下次不必重复连接。

bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{
	char cCmd [120];

    sprintf ( cCmd, "AT+CWJAP?");
    /* 如果已经连接wifi,那么不需要重复链接 */
    if (ESP8266_Cmd ( cCmd, "+CWJAP:", NULL, 5000 ) == true)
    {
        return true;
    }
    
    printf("正在连接wifi\r\n");
	sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );
	
	return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );
	
}

3.2.3 云端连接语句介绍

        云端的连接主要分为两部分: 详情请参见ESP8266 -- 串口助手 AT MQTT 指令与阿里云物联网平台建立通信(三)

一是配置云端参数:配置云端参数主要是< AT+MQTTUSERCFG=0,1,"client_id","username","password",0,0,"" >指令实现。

二是连接云端:通过< AT+MQTTCONN=0,"host",port,0 > 指令实现。

#define BROKER_HOST_IP          "iot-06z12ga2pdtk6xu.mqtt.iothub.aliyuncs.com"      //要连接的服务器的 IP
#define BROKER_HOST_PORT        "1883"                                              //要连接的服务器的端口

/* 对于BROKER_CLIENT_ID定义字符串的解释:
   原本字符串:"izi37b1wleB.TestDevice|securemode=2,signmethod=hmacsha256,timestamp=1701570366200|"
   esp8266支持的字符串:"izi37b1wleB.TestDevice|securemode=2\,signmethod=hmacsha256\,timestamp=1701570366200|"     需在','前加'\'
   C语言基于esp8266支持的字符串:"izi37b1wleB.TestDevice|securemode=2\\,signmethod=hmacsha256\\,timestamp=1701570366200|"  需在'\'前再加一个'\'
   最终通过串口发出去的字符串:"izi37b1wleB.TestDevice|securemode=2\,signmethod=hmacsha256\,timestamp=1701570366200|"
 */
#define BROKER_CLIENT_ID        "izi37b1wleB.TestDevice|securemode=2\\,signmethod=hmacsha256\\,timestamp=1701570366200|"   
#define BROKER_USERNAME         "TestDevice&izi37b1wleB"
#define BROKER_USERNAME_PWD     "77517177642f88688ac2d6286f30699cff7d699daad8394d837608dc5db5935b"

/* 配置云端参数 */
sprintf (cCmd, "AT+MQTTUSERCFG=0,1,\"%s\",\"%s\",\"%s\",0,0,\"\"", BROKER_CLIENT_ID, BROKER_USERNAME,BROKER_USERNAME_PWD);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );    

/* 连接云端 */
sprintf (cCmd, "AT+MQTTCONN=0,\"%s\",%s,0", BROKER_HOST_IP, BROKER_HOST_PORT);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );    		

3.2.4 环回消息测试语句介绍

        环回消息主要是依赖自定义的发布和接收Topic,首先使用< AT+MQTTSUB=0,"topic",0 >命令订阅消息,再通过< AT+MQTTPUB=0,"topic","data",0,0 >指令回读发送的消息。

const char testdata[] = "This is a MQTT loop test";

#define LOOP_PUB_SUB_TOPIC      "/izi37b1wleB/TestDevice/user/LoopTopic"  //环回测试主题

/* 订阅环回消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", LOOP_PUB_SUB_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );     
    
/* 发送环回消息 */
sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", LOOP_PUB_SUB_TOPIC, testdata);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 ); 

3.2.5 属性上报语句介绍

        属性上报和环回消息类似,只是订阅的主题不一样,环回测试主题是自定义的收发Topic,属性上报则是物模型的属性上报Topic。

/* 对于postdata定义字符串的解释:
   原本字符串:                   "{
    (JSON格式)                         "id":1701504913858,
                                       "params":
                                       {
                                           "TestTSL":888
                                       },
                                       "version":"1.0",
                                       "method":"thing.event.property.post"
                                   }"
                                   
   esp8266支持的字符串:          "{
   (也就是在'"'前面增加'\'             \"id\":1701504913858\,
          在','前面增加'\')            \"params\":
                                       {
                                           \"TestTSL\":888
                                       }\,
                                       \"version\":\"1.0\"\,
                                       \"method\":\"thing.event.property.post\"
                                   }"
                              
   C语言基于esp8266支持的字符串: "{
   (如果是','需在'\'前再加1个'\',     \\\"id\\\":1701504913858\\,
    如果是'"'需在'\'前再加2个'\'       \\\"params\\\":
                                       {
                                           \\\"TestTSL\\\":888
                                       }\\,
                                       \\\"version\\\":\\\"1.0\\\"\\,
                                       \\\"method\\\":\\\"thing.event.property.post\\\"
                                   }"
                                   
   最终通过串口发出去的字符串:   "{
                                       \"id\":1701504913858\,
                                       \"params\":
                                       {
                                           \"TestTSL\":888
                                       }\,
                                       \"version\":\"1.0\"\,
                                       \"method\":\"thing.event.property.post\"
                                   }"  
 */
 
const char postdata[] = "{\\\"id\\\":1701504913858\\,\\\"params\\\":{\\\"TestTSL\\\":888}\\,\\\"version\\\":\\\"1.0\\\"\\,\\\"method\\\":\\\"thing.event.property.post\\\"}";

#define POST_TOPIC              "/sys/izi37b1wleB/TestDevice/thing/event/property/post"        //发布
#define POST_REPLY_TOPIC        "/sys/izi37b1wleB/TestDevice/thing/event/property/post_reply"  //订阅

/* 属性上报--订阅消息 */
sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", POST_REPLY_TOPIC);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 ); 

/* 属性上报--发布消息 */
sprintf (cCmd, "AT+MQTTPUB=0,\"%s\",\"%s\",0,0", POST_TOPIC, postdata);
ESP8266_Cmd ( cCmd, "OK", NULL, 1000 );  

3.2.6 设置属性语句介绍

        设置属性就是实时订阅云端的消息,这里2s订阅一次消息。

#define SET_PROPERTY_TOPIC      "/sys/izi37b1wleB/TestDevice/thing/service/property/set"       //订阅

while (1)
{
    /* 设置属性--订阅消息 */
    sprintf (cCmd, "AT+MQTTSUB=0,\"%s\",0", SET_PROPERTY_TOPIC);
    ESP8266_Cmd ( cCmd, "OK", NULL, 2000 );          
}  

4 实验现象

4.1 代码运行现象

ESP8266 -- STM32与阿里云物联网平台建立通信(四),esp8266,stm32,阿里云,物联网

4.2 属性上报现象  

        这里属性上报的TestTSL=888,我们打开云端,查看到TestTSL的值确实是888。ESP8266 -- STM32与阿里云物联网平台建立通信(四),esp8266,stm32,阿里云,物联网

 4.3 设置属性现象

        通过阿里云物联网平台,设置TestTSL=123,查看到串口助手显示的值也为123。

ESP8266 -- STM32与阿里云物联网平台建立通信(四),esp8266,stm32,阿里云,物联网

        注意:此代码不能直接和云端进行通信,需要自己搭建云平台,并修改相对应的云端IP、client_id及密码,云端的搭建可以参考:ESP8266 -- 搭建阿里云物联网与MQTT.fx通信的平台(二)

接下来讲解利用物联网平台读取和控制STM32板载资源,敬请期待。。。文章来源地址https://www.toymoban.com/news/detail-767119.html

到了这里,关于ESP8266 -- STM32与阿里云物联网平台建立通信(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 标准库+ESP8266+华为云物联网平台

    文章内容:     STM32标准库通过串口发送AT指令完成与ESP8266的控制实现接入华为云物联网平台,并完成基本通信与控制,包括设备属性上报和命令下发解析与响应,并将相关代码打包成HuaweiIOT_at_esp8266.c和HuaweiIOT_at_esp8266.h驱动文件。 一、华为云物联网平台 创建 产品与设备

    2024年02月12日
    浏览(56)
  • STM32 HAL库+ESP8266+华为云物联网平台

    文章内容:     STM32 HAL库通过串口发送AT指令完成与ESP8266的控制实现接入华为云物联网平台,并完成基本通信与控制,包括设备属性上报和命令下发解析与响应。     文末获取 “STM32 HAL库+ESP8266+华为云物联网平台keil工程 ”下载的链接。 一、华为云物联网平台 创建 产品

    2024年02月14日
    浏览(60)
  • STM32+ESP8266(AT固件)连接阿里云物联网 保姆级教学(附代码)--1.创建产品和设备

    提示:这里是从实际应用如何使用教学配置,未从原理讲解,适合小白从零开始到成功,比较有成就感 STM32+ESP8266(AT固件)连接阿里云物联网系列保姆级教学 1. 创建产品和设备 2. 设置产品Topic数据和功能定义设备物模型数据显示 3. 硬件连接+代码修改 4. Web数据可视化 5.功能

    2024年04月25日
    浏览(89)
  • STM32+ESP8266(AT固件)连接阿里云物联网 保姆级教学(附代码) --3. STM32硬件连接+keil代码修改

    提示:这里是从实际应用如何使用教学配置,未从原理讲解,适合小白从零开始到成功,比较有成就感 STM32+ESP8266(AT固件)连接阿里云物联网系列保姆级教学 1. 创建产品和设备 2. 设置产品Topic数据和功能定义设备物模型数据显示 3. 硬件连接+代码修改 4. Web数据可视化 5.功能

    2024年02月05日
    浏览(50)
  • stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

    (示例:stm32f103c8t6+esp 01s 串口A T 指令模式) 流程简介:       本期教程使用的是stm32+AT指令控制esp01s接入华为云联网平台完成数据上报与命令处理,在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进

    2024年02月02日
    浏览(50)
  • STM32+ESP8266(AT固件)连接阿里云物联网 保姆级教学(附代码)--4. Web数据可视化

    提示:这里是从实际应用如何使用教学配置,未从原理讲解,适合小白从零开始到成功,比较有成就感 STM32+ESP8266(AT固件)连接阿里云物联网系列保姆级教学 1. 创建产品和设备 2. 设置产品Topic数据和功能定义设备物模型数据显示 3. 硬件连接+代码修改 4. Web数据可视化 5.功能

    2024年04月10日
    浏览(56)
  • 【ESP-01S / ESP8266 AT指令连接阿里云物联网平台】

    关注+星标 公众号,不错过精彩内容 作者 | MakingClub 微信公众号 | electronic造物实验室 注册阿里云账号并搜索物联网服务。选择并进入物联网平台产品页。 点击管理控制台,进入物联网平台管理界面。 选择公共实例(如果尚未开通,需要先进行开通,具体步骤不再赘述),然

    2024年02月07日
    浏览(65)
  • STM32+ESP8266(AT固件)连接阿里云物联网 保姆级教学(附代码)--2. 设置产品Topic数据和功能定义设备物模型数据显示

    提示:这里是从实际应用如何使用教学配置,未从原理讲解,适合小白从零开始到成功,比较有成就感 STM32+ESP8266(AT固件)连接阿里云物联网系列保姆级教学 1. 创建产品和设备 2. 设置产品Topic数据和功能定义设备物模型数据显示 3. 硬件连接+代码修改 4. Web数据可视化 5.功能

    2024年02月03日
    浏览(64)
  • 物联网点灯项目:阿里云物联网平台+ESP32IDF+uniapp

    首先看效果(不太清晰)   视频演示效果 其次我讲一下大概的实现过程:前端用uniapp,(后来软工学长告诉我如果不是跨端开发的话完全可以不用uniapp,如果你要开发微信小程序就用微信开发者工具,如果你要开发移动端app就用安卓studio,因为我是自己琢磨的,当时只知道

    2024年01月21日
    浏览(50)
  • Esp8266对接阿里云物联网远程实时温度监控{探讨帖}

    最近一个小伙伴和我聊了一小,说要准备做一个台球的一个扫码控制的功能,实现就行,用户进入台球桌,扫码打开小程序,付费购买不同时间段套餐,然后启动台球桌电灯,也就是扫码开灯。听了之后,于是自己在淘宝买了一个ESP8266准备开始研究一下:   首先,说明,本

    2024年02月05日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包