当前位置:   article > 正文

stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应_物联网如何做到快速响应命令

物联网如何做到快速响应命令

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

流程简介:

一、 MQTT透传AT固件烧录

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

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

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

固件链接:

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

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

2. 打开固件烧录工具

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

 

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

3. 串口调试

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

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

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,正常效果如下:

    

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

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

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

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

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

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

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

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

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

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

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代替串口助手完成对esp8266的上述控制。

二、 STM32编程

1. 打开STM32CubeMX创建工程

(1)配置串口与LED的GPIO

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

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

3. 串口收发

1) 添加头文件:

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

2) printf重定向

  1. //支持printf函数串口发送
  2. #if 1
  3. #pragma import(__use_no_semihosting)
  4. struct __FILE
  5. {
  6. int handle;
  7. };
  8. FILE __stdout;
  9. void _sys_exit(int x)//避免半主机模式
  10. {
  11. x=x;
  12. }
  13. int fputc(int ch,FILE *f)
  14. {
  15. while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
  16. USART1->DR=(uint8_t)ch;
  17. return ch;
  18. }
  19. #endif
 

4. 发送测试

  1. -------------------------------
  2. -------------------------------
  3. //主函数中插入
  4. while (1)
  5. {
  6. /* USER CODE END WHILE */
  7. printf("Hello esp8266\r\n");
  8. delay(4000);
  9. /* USER CODE BEGIN 3 */
  10. }
  11. /* USER CODE END 3 */
  12. }
  13. void delay(int t)
  14. {
  15. int i,j=0;
  16. for(i=0;i<5000;i++)
  17. for(j=0;j<t;j++);
  18. }
 

5. 接收测试

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

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

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

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

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

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

运行测试:

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

(1)接入华为云初始化

  1. void HuaweiIot_init(void)
  2. {
  3. uint8_t i=0;
  4. for(i=0;i<10;i++)
  5. {
  6. if(at_start_flag==1)
  7. {
  8. AT_write("AT\r\n");
  9. printf("AT+RST\r\n");
  10. delay(1000);
  11. AT_write("AT\r\n");
  12. AT_write("AT+CWMODE=1\r\n");
  13. AT_write("AT+CWJAP=\"wifi名称\",\"wifi密码\"\r\n");
  14. AT_write("AT+MQTTUSERCFG=0,1,\"NULL\",\"三元组之Username\",\"三元组之password\",0,0,\"\"\r\n");
  15. AT_write("AT+MQTTCLIENTID=0,\"三元组之ClientID\"\r\n");
  16. AT_write("AT+MQTTCONN=0,\"MQTT接入地址\",1883,1\r\n");
  17. AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/properties/report\",1\r\n");
  18. AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/commands/#\",1\r\n");
  19. AT_write("AT+MQTTSUB=0,\"$oc/devices/设备ID/sys/commands/response/#\",1\r\n");
  20. break;
  21. }
  22. else
  23. {
  24. printf("等待模块就绪...\r\n");
  25. delay(1000);
  26. }
  27. }
  28. }
 

 (2) AT命令发送

  1. void AT_write(char atstring[1024])//阻塞等待OK
  2. {
  3. printf("%s",atstring);
  4. while(1)
  5. {
  6. if(R_data[0]=='O'&&R_data[1]=='K') break;
  7. else if(R_data[0]=='b'&&R_data[1]=='u'&&R_data[2]=='s'&&R_data[3]=='y')
  8. {
  9. }
  10. else delay(50);
  11. }
  12. R_data[0]=R_data[1]=0;
  13. delay(50);
  14. }
 

(3) 属性上报

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

(4)串口接收中断回调

  1. //重写串口接收中断回调函数
  2. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  3. {
  4. char analysis_Str[256];
  5. if(huart->Instance == USART1)
  6. {
  7. HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);
  8. // save char from uart receive
  9. if(aRxBuffer1!='\n')
  10. R_data[R_length++]=aRxBuffer1;
  11. else
  12. {
  13. if(R_length>=5)
  14. {
  15. if(R_data[0]=='r'&&R_data[1]=='e'&&R_data[2]=='a'&&R_data[3]=='d'&&R_data[4]=='y')
  16. {
  17. at_start_flag=1;
  18. printf("检测到ready\r\n");
  19. memset(R_data,0,sizeof(R_data));//清空缓存区
  20. }
  21. }
  22. //我的接收数据长度为201,下面采用JSON字符串硬解析的方式,具体下标请根据自己实际接收的参数处理
  23. //+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"}
  24. if(R_length>200)
  25. {
  26. strncpy(analysis_Str, R_data, 12);//提取出“+MQTTSUBRECV”
  27. if(strcmp(analysis_Str,"+MQTTSUBRECV")==0)
  28. {
  29. memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
  30. //printf("MQTT命令接收头正确\r\n");
  31. strncpy(request_id, R_data+92, 36); //提取出request_id
  32. //printf("request_id=%s\r\n",request_id);
  33. strncpy(analysis_Str, R_data+135, 5); //提取出"paras"
  34. //printf("paras=%s\r\n",analysis_Str);
  35. if(strcmp(analysis_Str,"paras")==0) //有效参数体
  36. {
  37. memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
  38. strncpy(analysis_Str, R_data+144,3); //提取出"led"
  39. //printf("att is %s\r\n",analysis_Str);
  40. if(strcmp(analysis_Str,"led")==0)
  41. {
  42. //printf("led set %c",R_data[149]);
  43. memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
  44. if(R_data[149]=='0')
  45. {
  46. //printf("关灯\r\n");
  47. printf("AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/commands/response/request_id=%s\",\"\",0,0\r\n",request_id);
  48. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  49. memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
  50. }
  51. else if(R_data[149]=='1')
  52. {
  53. //printf("开灯\r\n");
  54. printf("AT+MQTTPUB=0,\"$oc/devices/设备ID/sys/commands/response/request_id=%s\",\"\",0,0\r\n",request_id);
  55. memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
  56. HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  57. }
  58. }
  59. }
  60. }
  61. else
  62. {
  63. //printf("MQTT命令接收头异常:%s\r\n",analysis_Str);
  64. memset(analysis_Str,0,sizeof(analysis_Str));//清空缓存区
  65. }
  66. }
  67. //else printf("MQTT命令长度异常,长度:%d",R_length);
  68. R_length=0;
  69. }
  70. }
  71. }

最终效果:

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/699272
推荐阅读
相关标签
  

闽ICP备14008679号