stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

这篇具有很好参考价值的文章主要介绍了stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(示例:stm32f103c8t6+esp01s串口AT指令模式)

流程简介:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

一、 MQTT透传AT固件烧录

      本期教程使用的是stm32+AT指令控制esp01s接入华为云联网平台完成数据上报与命令处理,在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进行MQTT固件烧录,如果平时一直在使用原厂固件开发,可跳过第一步,若AT指令无效再按第一步操作。

1. 官网下载烧录工具和固件

烧录工具链接:https://docs.ai-thinker.com/tools

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

固件链接:

https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB

大家根据自己需要选择相应的版本,我使用的是esp01s,下载的是1471号

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

2. 打开固件烧录工具

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

连接usb转ttl模块,点击START,然后保持esp01s的IO0拉低后重新上电

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

 文章来源地址https://www.toymoban.com/news/detail-431446.html

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

打开串口助手,按下复位,输入命令”AT”,注意要取消勾选十六进制发送,勾选发送新行,然后检查串口打印工作状况,下图表示正常:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

3. 串口调试

我们即将用到的AT指令可以从官方手册中学习:

https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

1) AT+CWMODE=1

设置模块为STA模式

2) AT+CWJAP="填写wifi名称","填写WiFi密码"

连接WiFi,需略微等待片刻,等显示连接后再进行下面的操作

3) AT+MQTTUSERCFG=0,1,"NULL","填写用户名","填写密码",0,0,""

设置MQTT的登陆用户名与密码

用户名与密码为华为云MQTT三元组的相关信息,可以在下面的网站生成:https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

具体可以参考之前的文章

4) AT+MQTTCLIENTID=0,"填写ClientID"

设置MQTT的ClientID,ClientID华为云MQTT三元组的相关信息,在上一步骤中获取的三元组中查看

5) AT+MQTTCONN=0,"填写MQTT接入的地址",1883,1

设置MQTT接入地址,华为云物联网平台的地址,比如iot-mqtts.cn-north-4.myhuaweicloud.com,具体参考控制台首页的平台接入地址

6) AT+MQTTSUB=0,"订阅的主题tpoic",1

完成属性上报的话需要先订阅设备属性上报的主题,此处可填写为:

$oc/devices/填写设备ID/sys/properties/report

7) AT+MQTTPUB=0," 订阅的主题tpoic ","上报的json数据",0,0

订阅的主题:

$oc/devices/填写设备ID/sys/properties/report

上报的json数据:

{\"services\":[{\"service_id\":\"填写服务ID\"\,\"properties\":{\"填写设备属性\": 填写属性数据值}}]}

建议大家完成这步时,先使用MQTT.fx进行设备属性上报测试,确保数据无误正常上传,具体参数因个人的配置而异

在完成上面的每一步时,系统都会打印一个OK,正常效果如下:

    

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

    此时我们可以查看华为云物联网平台的设备属性以及消息记录:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

8) AT+MQTTSUB=0,"订阅的主题topic ",1

此时我们在这填写的是平台下发命令的主题:$oc/devices/填写设备ID/sys/commands/#

9)  进入华为云物联网平台的->监控运维->在线调试,完成命令下发

服务ID与下发命令的创建方法参考以前的文章:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

此时设备会接收到下发的命令:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

接收到命令后我们需要对命令进行响应,即下一步的步骤

10) 特别注意!!!下面两步的操作时间建议接收到命令后的20s以内,超时后平台会认定为同步命令设备响应异常!

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

11) AT+MQTTSUB=0,"$oc/devices/填写设备ID /sys/commands/response/request_id=填写接收到的request_id ",1

订阅设备响应平台命令主题,其中接收到的request_id在上图接收到的数据中,我们需要把它拿出来放到新订阅的tpoic的对应位置里

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

12)  AT+MQTTPUB=0,"填写上面订阅的含request_id的完整主题","填写响应值,可以为空",0,0

例如:AT+MQTTPUB=0,"$oc/devices/填写设备id/sys/commands/response/request_id=填写request_id ","",0,0

13) 完成上面的三步操作后,我们可以看到华为云物联网平台已经完成了命令的接收与响应

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

此时,我们的设备属性上报与设备命令的接收响应功能就已经完成了,接下来我们完成STM32代替串口助手完成对esp8266的上述控制。

二、 STM32编程

1. 打开STM32CubeMX创建工程

(1)配置串口与LED的GPIO

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

(2)打开串口并使能串口中断

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

2. 打开工程,编译,下载,检查无误

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

3. 串口收发

1) 添加头文件:

#include <stdio.h>
#include <string.h>

2) printf重定向

//支持printf函数串口发送
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
    int handle;
};
FILE __stdout;
void _sys_exit(int x)//避免半主机模式
{
    x=x;
}
int fputc(int ch,FILE *f)
{
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
    USART1->DR=(uint8_t)ch;
    return ch;
}
#endif
 

4. 发送测试

-------------------------------
-------------------------------
//主函数中插入
  while (1)
  {
    /* USER CODE END WHILE */
      printf("Hello esp8266\r\n");
      delay(4000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
​
void delay(int t)
{
  int i,j=0;
  for(i=0;i<5000;i++)
    for(j=0;j<t;j++);
}
 

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

5. 接收测试

​(1)main.c中添加下列声明

char R_data[1024];      //定义结束数据的缓冲区
uint8_t R_length=0;      //定义结束数据的长度
uint8_t R_i=0;        //由于遍历缓冲区数据
 

(2)重写串口接收中断回调函数

//重写串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  char analysis_Str[256];
  if(huart->Instance == USART1)
  {
    HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);
    // save char from uart receive
    if(aRxBuffer1!='\n')
      R_data[R_length++]=aRxBuffer1;
                 else 
     for(R_i=0;R_i<R_length;R_i++)
        printf("%c",R_data[R_i]);
   }
}
 

(3)在串口初始化后使能串口中断

HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); //使能串口接收中断
 

运行测试:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

6.  完善主要接入华为云物联网平台的相关代码

(1)接入华为云初始化

void HuaweiIot_init(void)
{
    uint8_t i=0;
    for(i=0;i<10;i++)
    {
        if(at_start_flag==1)
        {
            AT_write("AT\r\n");
            printf("AT+RST\r\n");
            delay(1000);
            AT_write("AT\r\n");
            AT_write("AT+CWMODE=1\r\n");
            AT_write("AT+CWJAP=\"wifi名称\",\"wifi密码\"\r\n");
            AT_write("AT+MQTTUSERCFG=0,1,\"NULL\",\"三元组之Username\",\"三元组之password\",0,0,\"\"\r\n");
            AT_write("AT+MQTTCLIENTID=0,\"三元组之ClientID\"\r\n");
            AT_write("AT+MQTTCONN=0,\"MQTT接入地址\",1883,1\r\n");
            AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/properties/report\",1\r\n");
            AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/commands/#\",1\r\n");
            AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/commands/response/#\",1\r\n");
            break;
        }    
        else
        {
            printf("等待模块就绪...\r\n");
            delay(1000);
        }            
    }
}
 

 (2) AT命令发送

void AT_write(char atstring[1024])//阻塞等待OK
{
    printf("%s",atstring);
    while(1)
    {
            if(R_data[0]=='O'&&R_data[1]=='K') break;
            else if(R_data[0]=='b'&&R_data[1]=='u'&&R_data[2]=='s'&&R_data[3]=='y')
            {
            }
            else delay(50);
    }
    R_data[0]=R_data[1]=0;
    delay(50);
}
 

(3) 属性上报

void HuaweiIot_publish(void)
{
    char pubtemp[256];
    if(at_start_flag==1)
    {    
        sprintf(pubtemp,"AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/properties/report\",\"{\\\"services\\\":[{\\\"service_id\\\":\\\"服务ID\\\"\\,\\\"properties\\\":{\\\"属性\\\": %d}}]}\",0,0\r\n",hometemp++);
        AT_write(pubtemp);
    }
}
 

(4)串口接收中断回调

//重写串口接收中断回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    char analysis_Str[256];
    if(huart->Instance == USART1)
    {
        HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);
        // save char from uart receive
        if(aRxBuffer1!='\n')
            R_data[R_length++]=aRxBuffer1;
        else
        {
            if(R_length>=5)
            {
                    if(R_data[0]=='r'&&R_data[1]=='e'&&R_data[2]=='a'&&R_data[3]=='d'&&R_data[4]=='y')
                    {
                            at_start_flag=1;
                            printf("检测到ready\r\n");
                            memset(R_data,0,sizeof(R_data));//清空缓存区
                    }
            }
                //我的接收数据长度为201,下面采用JSON字符串硬解析的方式,具体下标请根据自己实际接收的参数处理
    //+MQTTSUBRECV:0,"$oc/devices/61fb2d7fde9933029be5ff9e_esp8266_test01/sys/commands/request_id=4152fb5d-e5ae-4b89-b39d-283ba59cf033",68,{"paras":{"led":1},"service_id":"Dev_data","command_name":"Control"}
            if(R_length>200)
            {
                    strncpy(analysis_Str, R_data, 12);//提取出“+MQTTSUBRECV”
                    if(strcmp(analysis_Str,"+MQTTSUBRECV")==0)
                    {
                            memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
                            //printf("MQTT命令接收头正确\r\n");
                            strncpy(request_id, R_data+92, 36);        //提取出request_id
                            //printf("request_id=%s\r\n",request_id);
                            strncpy(analysis_Str, R_data+135, 5);    //提取出"paras"
                            //printf("paras=%s\r\n",analysis_Str);
                            if(strcmp(analysis_Str,"paras")==0)        //有效参数体
                            {
                                    memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
                                    strncpy(analysis_Str, R_data+144,3);    //提取出"led"
                                    //printf("att is %s\r\n",analysis_Str);
                                    if(strcmp(analysis_Str,"led")==0)
                                    {
                                            //printf("led set %c",R_data[149]);
                                            memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
                                            if(R_data[149]=='0')
                                            {
                                                    //printf("关灯\r\n");
                                                    printf("AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/commands/response/request_id=%s\",\"\",0,0\r\n",request_id);
                                                    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
                                                    memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区    
                                            }
                                           else if(R_data[149]=='1')
                                            {
                                                    //printf("开灯\r\n");
                                                    printf("AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/commands/response/request_id=%s\",\"\",0,0\r\n",request_id);
                                                    memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区        
                                                    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
                                            }                                        
                                    }        
                            }
                    }
                    else
                    {
                        //printf("MQTT命令接收头异常:%s\r\n",analysis_Str);
                        memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
                    }
            }
            //else printf("MQTT命令长度异常,长度:%d",R_length);            
            R_length=0;
        }
    }
}

最终效果:

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

上述教程完成基本功能的核心代码已经给出,如果需要keil项目文件,可公-众,号搜索“IOT趣制作”,回复关键字“8266at”即可。

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

 

到了这里,关于stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【ESP-01S / ESP8266 AT指令连接阿里云物联网平台】

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

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

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

    2024年04月10日
    浏览(45)
  • ESP8266/ESP32 NodeMCU接入阿里云物联网平台

    阿里云物联网平台公共实例是免费的,且不像然也等服务器一样无法区分不同用户发布的话题。本文采用常规的pubsubclient库连接阿里云。ESP8266/ESP32用pubsubclient接入阿里云平台截至写稿的现在,网上有的资源较少,现在我就来介绍一下使用方法 1.登录阿里云官网https://www.aliyu

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

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

    2024年02月03日
    浏览(50)
  • 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 代码

    2024年02月04日
    浏览(49)
  • STM32、ESP8266与MQTT连接阿里云物联网的串口通信异常解析

    STM32、ESP8266与MQTT协议连接阿里云物联网平台时常见的串口通信异常介绍 在构建物联网应用时,STM32、ESP8266与MQTT协议的结合是实现设备与网络间稳定通信的关键。然而,在连接阿里云物联网平台的过程中,串口通信异常成为了一个常见的挑战。本文将探讨这些异常现象及其可

    2024年04月22日
    浏览(37)
  • STM32 ESP8266模块的探索&AT指令介绍

    这是本文的配套资料,最终工程请参考 新_ESP8266资料stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 我使用的是ai-thinker的esp8266-01s,以下为产品规格书 引脚定义:   依据引脚定义,GND接GND,VCC接3.3V,TX接USB转TTL的Rx, Rx 接USB转TTL的RX,之后尝试多次,都只

    2024年04月23日
    浏览(31)
  • 【IoT网络层】STM32 + ESP8266 +MQTT + 阿里云物联网平台 |开源,附资料|

    🌟博主领域:嵌入式领域人工智能软件开发 本节目标: 通过MQTT.fx模拟连接或通过串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266 ESP-01来连接网络,获取设备数据发送到阿里云物联网平台并显示且oled显

    2024年02月04日
    浏览(50)
  • 【代码分享】ESP32接入华为云物联网平台完成属性定时上报(Arduino IDE开发)

    更多相关:华为云IOT物联网 论坛  之前带着大家写过使用esp8266接入华为云物联网平台的教程,有小伙伴后台私信,在ESP32接入华为云时遇到了问题,ESP32和ESP8266的代码几乎差不多的,ESP8266代码中用了“ESP8266.h”开发;ESP32可以直接用“WIFI.h”开发,教程基本和esp8266的那期教

    2024年02月13日
    浏览(44)
  • ESP8266-01S接入机智云物联网平台

    接入机智云物联网平台,首先需要烧写机智云的固件,官网就有免费下载直接使用! 下载对应固件包 ESP8266-01s模块进入烧录模式连接图 GPIO0用于固件烧写模式,低电平为烧写模式,高电平为运行模式(默认状态) ESP8266-01S      USB-TTL串口 3v3---------------3v3 GND--------------GND T

    2023年04月27日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包