【HAL库】STM32+ESP8266+Onenet+MQTT,极简工程,hal库移植。

ESP8266通过MQTT协议连接Onenet。从标准库移到了HAL库,过程有点麻烦,整了一天。做完后整理了一下,这个极简的工程,方便以后开发,也希望能帮助到大家,节约时间。

代码工程:
https://github.com/wyfroom/ESP8266-Onenet-MQTT

该份代码硬件配置:
板子:STM32F103C8T6最小系统板。
外设:串口1用作调试,串口3用作esp8266。
esp8266:淘宝,esp-01s

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。这个是我从标准库移倒hal库的,直接从我工程里复制就行,很纯净,没有加多余的东西。下面介绍如何根据个人实际使用情况更改一些参数。

cubemx详细使用教程及所有模块整合见这篇:
【HAL库】HAL库STM32cubemx快速使用

image-20230408211617282

2 Cubemx配置

串口1用于调试,串口3用于ESP8266通信,打开中断。

基础的我就不配置了,可以看前面的详细讲解。

3 修改 .c.h 文件

移植时要修改的地方:

1 改所用串口

发送部分:在esp8266.c里,将huart3全部替换为要修改的串口号,比如串口2。

image-20230408212731847

接收部分:用串口中断接收esp8266发来的消息。随便在哪个文件夹填加串口回调函数,我个人是之前专门建了个uart.c文件放串口相关的所有代码。

加入下面的代码(串口号根据个人情况修改)

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart3)//esp8266接收云平台数据
		{
			if(esp8266_cnt >= sizeof(esp8266_buf))
			{            
				esp8266_cnt = 0; //防止串口被刷爆
			}
			esp8266_buf[esp8266_cnt++] = Uart3_RxData;

			HAL_UART_Receive_IT(&huart3,(uint8_t *)&Uart3_RxData, 1); //&取地址
		}
}

2 改wifi名字和密码

image-20230408211926168

3 改产品ID、设备ID、鉴权信息。

image-20230408212601399

4 测试

添加头文件

#include "onenet.h"
#include "esp8266.h"

添加初始化

别忘了开串口中断。

HAL_UART_Receive_IT(&huart3,(uint8_t *)&Uart3_RxData, 1);//开启串口中断
/* esp8266连接wifi+连接Onenet */
HAL_Delay(2000);
ESP8266_Init();					//初始化ESP8266,连接wifi
HAL_Delay(2000);
while(OneNet_DevLink())			//连接OneNET
HAL_Delay(2000);

连接成功的话,onenet会显示设备在线。串口也会打印成功。

image-20230408213614618

image-20230408220823254

发送数据

OneNet_SendData();	//发送数据
ESP8266_Clear();	//清空数据缓存区
HAL_Delay(3000);	//3s发送一次

image-20230408220926312

要发什么数据,在这里改:

image-20230408214852054

接收数据

dataPtr = ESP8266_GetIPD(0);//获取平台返回的数据
if(dataPtr != NULL)//如果返回数据不为空
	OneNet_RevPro(dataPtr);//平台返回数据检测
### STM32F103C8T6 HAL OneNet 平台连接教程 #### 前提条件 为了成功实现 STM32F103C8T6 使用 HAL OneNet 平台的连接,需完成以下准备工作: - 硬件配置:STM32F103C8T6 开发板、ESP8266 Wi-Fi 模块以及必要的外围设备。 - 软件环境:安装并配置好 Keil 或 STM32CubeIDE,并确保已导入 STM32HAL 。 --- #### 一、硬件初始化 ESP8266 配置 在项目启动阶段,应优先验证 STM32ESP8266 是否能够正常通信。推荐使用串口助手测试 AT 指令集的功能性[^1]。具体操作如下: 1. **UART 初始化** - 设置 UART 外设参数(波特率通常为 `9600`),用于 STM32ESP8266 的通信。 - 向 ESP8266 发送基础命令(如 `AT`, `AT+CWMODE=1`)以确认模块响应状态。 ```c // UART 初始化函数 (假设使用 USART1) void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; // 波特率为 9600 huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); // 错误处理机制 } } ``` 2. **Wi-Fi 连接设置** - 利用 AT 指令使 ESP8266 加入指定网络。例如: ```plaintext AT+CWJAP="SSID","PASSWORD" ``` --- #### 二、MQTT 协议对接 Onenet 平台 Onenet 支持 MQTT 协议作为主要数据传输方式之一。以下是关键步骤说明: 1. **创建客户端 ID 及认证信息** - 登录 Onenet 官网注册设备,记录下设备的 `ProductKey` 和 `DeviceSecret`。 - 构造唯一的 ClientID 字符串,格式一般为 `{ClientID}|{timestamp}`。 2. **构建 MQTT 数据包** - 将传感器采集的数据封装成 JSON 格式字符串,便于上传至云端[^3]。 ```json { "datastreams": [ { "id": "temperature", "datapoints": [{ "value": 25 }] }, { "id": "humidity", "datapoints": [{ "value": 60 }] } ] } ``` 3. **发送订阅/发布消息** - 实现 MQTT CONNECT 报文并通过 TCP/IP 协议栈传递给服务器。 - 订阅主题路径形似 `/sys/{product_id}/{device_id}/thing/event/property/post?access_token={token}`。 ```c char mqtt_connect_packet[] = "\x10\x1A\x00\x04MQTT\x04\xC0\x00\x3C\x00\x0DMyUniqueClientId|123456789"; if (HAL_UART_Transmit(&huart1, (uint8_t*)mqtt_connect_packet, sizeof(mqtt_connect_packet), HAL_MAX_DELAY) != HAL_OK) { Error_Handler(); } ``` --- #### 三、完整流程总结 整个过程涉及多个环节协同工作,包括但不限于: - STM32 对外设资源管理; - ESP8266 执行无线网络接入任务; - 上层应用逻辑负责解析和打包业务数据[^2]。 最终目标是以稳定的方式将本地传感节点的状态同步到远程数据中心供后续分析利用。 --- ####
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值