文章内容:

STM32 HAL库通过串口发送AT指令完成与ESP8266的控制实现接入华为云物联网平台,并完成基本通信与控制,包括设备属性上报和命令下发解析与响应。

文末获取“STM32 HAL库+ESP8266+华为云物联网平台keil工程”下载的链接。

一、华为云物联网平台创建产品与设备

华为云物联网平台创建产品与设备(含MQTT.fx测试)

二、STM32 HAL库+ESP8266+华为云物联网平台

1. esp8266 MQTT固件烧录与AT指令接入华为云测试

(5条消息) ESP8266通过AT指令接入华为云物联网平台_FUNIOT的博客-CSDN博客

三、STM32 HAL库+ESP8266+华为云物联网平台

1. 打开STM32CubeMX创建工程

(1)配置串口与LED的GPIO(LED用于华为云命令下发控制)

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

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

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++);
}

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 receiveif(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); //使能串口接收中断

(4)运行测试:

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 receiveif(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;}}
}

最终效果:

公众号搜索”IOT趣制作“回复关键字“8266at”或者“0327”获取相关下载链接:

STM32 HAL库+ESP8266+华为云物联网平台相关推荐

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

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

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

    (示例:stm32f103c8t6+esp01s串口AT指令模式) 流程简介: 一. MQTT透传AT固件烧录 本期教程使用的是stm32+AT指令控制esp01s接入华为云联网平台完成数据上报与命令 ...

  3. ESP8266通过AT指令接入华为云物联网平台

    1. esp8266 MQTT固件烧录 在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进行MQTT固件 ...

  4. 教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发)

    教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发) 一.简介         esp8266系列作为低功耗高性价比的嵌入式无线网络控制模块,深受对嵌入式感兴趣的 ...

  5. 合宙Air780e+luatos接入华为云物联网平台完成设备通信与控制

    一.简介 1.项目介绍 之前发布的文章有esp8266的wifi模块和BC20的NB模块与华为云物联网通信为主,本期文章采用了合宙的4G LTE Cat.1模块,编程语言用的是lua,整体来说代码比较 ...

  6. 【物联网】华为云物联网平台-基于C示例代码的快速体验

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 创建产品 04. 注册设备 05. C语言工程下载 06. 编译OpenSSL库 07. 编译paho库 08. 编译C参 ...

  7. 使用网络调试助手通过MQTT协议接入到华为云物联网平台

    一.写在之前 首先分享一篇华为云的官方指南:在线开发MQTT协议的智慧路灯_设备接入 IoTDA_最佳实践_设备接入_华为云 这篇文章很好地讲述了如何通过MQTT.fx的设备模拟器替代真实的设备,然后 ...

  8. 华为云物联网平台的微信小程序开发

    第0章 简介 上上期出了一个华为云物联网平台的Android APP应用开发教程, 根据后台的私信,包括华为云物联网IOT论坛里和公众号里,发现大家对物联网平台的移动端的开发需求还是很大的,接下来,带 ...

  9. MQTT网关连接华为云物联网平台应用

    1.概述 ZLAN5143D是一款专门为工业环境设计的RS485设备数据采集器/物联网网关,兼具串口服务器.Modbus网关.MQTT网关.RS485转JSON等多种功能于一体.如图 1所示,可以连接 ...

最新文章

  1. 如何建立自信心,不错!
  2. struts2和springmvc实现文件上传
  3. tomcat跳转报错_微信小程序开发:使用reLaunch跳转时报错的解决步骤
  4. PostgreSQL 插入、删除、更新、事务
  5. MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息...
  6. 详解ICT及其业务领域范围
  7. C语言 PTA 时间换算
  8. ps3自建服务器,PS3新手图文教程之网络设置
  9. 数据分析-数据指标描述业务之--咸鱼APP
  10. 赵小楼《天道》深度解析(75)客观是对现有事实的认可,嘴上认可可不行,得心里认,否则就是自欺
  11. 如何在h5页面中调用摄像头来完成拍照之类的操作
  12. JDK Tomcat MySQL一键安装
  13. 关于stm32 HAL 库的一点小总结
  14. Altium Designer 入门笔记(4)层次原理图的设计
  15. s19.基于 Kubernetes v1.25 (kubeadm) 和 Docker 部署高可用集群(一)
  16. Win10系统忘记开机密码的解决办法
  17. phpcms mysql 事务_PHPCMS mysql优化教程
  18. 大数据、云计算系统高级架构师课程
  19. JS在拼接字符串中加入空格
  20. 微众信科IPO被中止: 自称合作放款6000亿 “银税直连“下业务受冲

热门文章

  1. 使用面包板和轻触按钮与小龟机器人主控板DIY电子琴
  2. MongoDB 空间使用
  3. 数据中心液冷技术应用研究进展
  4. python在openstreetmap地图上绘制路线图
  5. Ansys WorkBench导出模态中性文件(.mnf)联合ADAMS柔性体动力学仿真
  6. Linux搭建hadoop高性能集群(一)
  7. IT故障排查思路和方法交流
  8. thunderbird 将收发邮件放在一个thread中
  9. 震惊世界的中国秘方————里面的方子都是一个老中医几十年的心血!!!~~~~~~很强!!!~~~~~~~珍惜身体一定要看!!!~~~(留着有用!!!)
  10. 活字格调用(6612345网页打印浏览器)打印无响应的解放方法_20221215_112738