1. 引言
在物联网(IoT)应用中,设备之间的无线通信是实现远程监控和控制的关键。STM32F103C8T6单片机作为一款高性能、低功耗的微控制器,广泛应用于各种嵌入式系统中。为了实现与云平台的通信,常常需要借助无线模块。ESP8266-WIFI模块是一款集成了Wi-Fi功能的低成本无线通信模块,具有良好的网络连接能力,能够与各种物联网平台进行数据交互。
OneNet物联网平台是一个为设备提供接入、管理、控制、数据存储和分析的云服务平台,通过MQTT协议进行设备间的数据交换,广泛应用于智能家居、环境监测、智能健康等领域。
本项目通过STM32F103C8T6单片机与ESP8266-WIFI模块结合,利用串口通信控制ESP8266发送AT指令,连接到Wi-Fi网络并通过MQTT协议将数据上传至OneNet物联网平台。该系统不仅实现了单片机与Wi-Fi模块的有效通信,还通过MQTT协议保证了数据传输的实时性和稳定性,为物联网设备提供了一个灵活、可靠的通信方案。
本文将详细介绍如何通过STM32F103C8T6单片机控制ESP8266-WIFI模块,并使用MQTT协议与OneNet物联网平台进行数据交互,涵盖从硬件连接到软件实现的完整流程。
讲解2024新版本OneNet云平台MQTT协议的使用(讲解设备上云以及可视化页面设计)
2. 相关技术概述
2.1 STM32F103C8T6单片机
STM32F103C8T6单片机是意法半导体(STMicroelectronics)推出的STM32系列微控制器中的一款基于ARM Cortex-M3核心的中高端产品。它广泛应用于嵌入式系统、物联网设备、自动化控制等领域。该单片机以其高性能、低功耗、丰富的外设接口和易于开发的特性,受到了开发者的青睐。
STM32F103C8T6采用ARM Cortex-M3内核,主频可达72MHz,具有较高的运算处理能力,适合需要较高处理速度的应用。Cortex-M3内核的优势在于其较高的指令执行效率和较低的功耗,这使得STM32F103C8T6能够在嵌入式领域提供良好的性能,同时有效地降低功耗。该芯片的内存配置为64KB的闪存和20KB的SRAM,足够支持大部分中小型嵌入式应用的需求。
在外设方面,STM32F103C8T6集成了丰富的接口,包括多个USART、I2C、SPI接口,支持多种通信协议。这使得它在连接各种传感器、执行器和其他外围设备时具有很大的灵活性。此外,该单片机还包括12位的ADC(模数转换器)和多个定时器,可以广泛应用于模拟信号采集、PWM控制、精确计时等场景。
STM32F103C8T6还具备多种通信接口,如USB、CAN、JTAG/SWD调试接口、以及丰富的GPIO引脚。通过这些接口,开发者能够轻松实现与外部设备的高速通信或进行系统调试和数据监控。同时,它还支持外部中断、DMA(直接存储器访问)等功能,进一步提高了数据处理效率,降低了CPU负载。
该单片机还具有较高的扩展性。它不仅支持多种外部存储器的连接(如SD卡、外部Flash等),还可以通过多种协议与其他设备进行远程通信,常见的如UART、SPI和I2C等串行接口,使得系统能够实现远程数据采集、无线通信等功能。
2.2 ESP8266-WIFI模块
ESP8266-WIFI模块是由Espressif Systems推出的一款低成本、高性能的Wi-Fi无线通信模块。它以其强大的功能和易于集成的特性,成为了物联网(IoT)应用中非常受欢迎的选择。ESP8266不仅支持Wi-Fi功能,还具备强大的处理能力,适合用在嵌入式设备中,尤其是在远程控制、数据采集、智能家居和其他无线通信应用中。
ESP8266内部集成了一个高效的32位处理器,采用了Tensilica Xtensa LX106微处理器,主频最高可达80MHz。该处理器具备足够的运算能力,能够支持Wi-Fi通信和一些基本的应用处理。ESP8266模块集成了Wi-Fi无线电和Wi-Fi协议栈,用户只需要通过AT指令或者直接编程来实现与外部设备的连接,简化了开发过程。它支持802.11 b/g/n协议,可以在2.4GHz频段内进行Wi-Fi通信,适用于各种基于Wi-Fi的无线连接需求。
该模块的突出特点是其小巧的体积和低功耗,适合应用于需要低功耗运行的场合。它可以通过多种电源方式供电,通常工作电压为3.3V,并且最大电流消耗较低,使其非常适合于嵌入式设备、传感器节点以及智能硬件等长时间运行的应用场景。其内置的TCP/IP协议栈支持连接互联网,能够轻松与云平台、手机APP或其他网络设备进行数据交换和远程控制。
ESP8266模块有多种型号和变种,其中一些版本带有较大的Flash存储,可以存储更多的用户程序或Wi-Fi连接信息。常见的ESP8266开发板(如NodeMCU和Wemos D1 mini)提供了丰富的接口和外设,支持Arduino IDE等开发环境,使得开发者能够快速上手,进行Wi-Fi通信和其他功能的开发。此外,ESP8266还支持OTA(Over The Air)远程升级功能,能够在设备部署后,通过无线网络对其固件进行更新和升级。
ESP8266不仅可以作为一个Wi-Fi客户端,连接到路由器或热点进行网络通信,还能够充当Wi-Fi热点(AP模式),使得其他设备可以直接连接到它。这使得ESP8266在物联网应用中非常灵活,可以根据不同需求配置为多种工作模式(如Station模式、Access Point模式、以及两者的混合模式)。通过这些工作模式,ESP8266能够与各种外部设备进行数据交换,实现远程监控、控制以及数据上传等功能。
2.3 MQTT协议
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽、高延迟或不稳定网络环境设计。最初由IBM于1999年开发,MQTT如今已成为物联网(IoT)和移动设备通信中广泛使用的标准协议。它的设计目标是提供一种高效、低功耗、易于实现的通信方式,适用于需要可靠传输和快速响应的应用场景。
MQTT基于客户端-服务器(也称为发布/订阅)模式进行工作,客户端通过发布消息到特定主题(topic)或订阅某个主题来接收消息。这种模式不同于传统的请求/响应模式,减少了数据传输的冗余,并能够通过消息中介(服务器)实现消息的中转和路由。服务器通常被称为“消息代理”(Broker),它接收来自各个客户端的消息,并将其转发到所有订阅了相应主题的客户端。
MQTT的消息传输过程非常简单。首先,客户端连接到MQTT服务器(Broker),并且在建立连接时可以指定一系列的参数,如客户端ID、用户名、密码、保持连接的时间等。连接成功后,客户端可以发布消息到特定的主题,或者订阅某个主题,以接收与该主题相关的消息。当消息发布到主题时,消息代理会将该消息转发给所有订阅了该主题的客户端。消息的内容可以是任意格式的数据,通常是JSON或二进制数据。
MQTT协议的另一个核心特点是其质量服务等级(QoS,Quality of Service)。它定义了消息传递的可靠性,并有三个级别:
- QoS 0(最多一次):消息发送一次,可能丢失,也可能到达,不会进行确认。
- QoS 1(至少一次):消息会至少发送一次,接收方会确认消息,确保消息传递可靠。
- QoS 2(只有一次):消息确保只发送一次,采用四阶段握手协议,适用于要求消息准确到达的场景。
MQTT的轻量级设计使其特别适合于带宽有限、资源受限的设备,如传感器、智能家居设备、嵌入式系统等。它的头部信息非常小,可以在网络负载较高的情况下仍然保持高效的通信。此外,MQTT协议还提供了保留消息和遗嘱消息等功能,进一步提升了通信的可靠性和实时性。保留消息是指服务器会保存主题的最后一条消息,新的订阅者在订阅该主题时会立即接收到这条消息。而遗嘱消息则是客户端异常断开时,服务器代为发布一条预设的消息,通知其他客户端客户端的离线状态。
由于其可靠性、简单性和低带宽要求,MQTT已成为连接物联网设备、进行远程监控和数据交换的重要工具。它不仅广泛应用于智能家居、工业控制、环境监测等领域,还被许多云平台(如OneNet、AWS IoT、Azure IoT)作为设备通信的核心协议。通过MQTT协议,设备能够快速、可靠地进行消息传递和实时数据交互,为各种物联网应用提供了强大的支持。
2.4 OneNet物联网平台
【讲解2024新版本OneNet云平台MQTT协议的使用(讲解设备上云以及可视化页面设计)】 https://www.bilibili.com/video/BV12m421u7A5/?share_source=copy_web&vd_source=347136f3e32fe297fc17177194ce0a8b
OneNet物联网平台是由中国移动推出的一种开放式物联网云平台,为各类物联网设备提供全面的接入、管理、控制和数据分析服务。OneNet平台采用先进的云计算技术,支持大规模设备的连接和数据处理,广泛应用于智能家居、智慧城市、工业物联网、农业物联网等领域。作为一站式物联网服务平台,OneNet提供了丰富的接口和工具,帮助企业和开发者快速构建和部署物联网解决方案。
OneNet平台的核心功能包括设备接入、远程管理、数据存储、数据分析和应用开发等。通过OneNet,用户可以方便地将各种物联网设备连接到云端,并通过平台提供的API接口实现设备的远程监控和控制。OneNet支持多种设备接入方式,包括基于MQTT、CoAP、HTTP等协议的通信,用户可以根据设备的需求选择合适的接入方式。平台还提供了设备状态监控、数据采集和故障诊断等功能,帮助用户实时了解设备的运行状态,确保设备的正常运转。
除了设备管理,OneNet平台还具备强大的数据存储和分析功能。平台能够接收和存储来自不同设备的数据,并提供灵活的数据查询和分析工具。通过数据可视化功能,用户可以直观地查看设备的数据和性能指标,便于进行性能评估和故障预测。此外,OneNet还支持数据流转和报表生成,帮助用户从大量的设备数据中提取有价值的信息,支持基于数据的决策和业务优化。
OneNet平台还提供了丰富的开发者工具和开放API,使得用户能够根据具体需求进行定制化开发。通过API接口,用户可以实现与其他系统(如ERP、CRM、云平台等)的对接,扩展OneNet的功能。同时,OneNet还提供了包括设备管理、数据交换、规则引擎等在内的一整套物联网解决方案,方便企业和开发者进行快速部署和集成。
安全性是OneNet平台的重要特性之一。平台支持多种安全机制,如数据加密、身份验证和权限控制,确保设备数据的传输和存储过程的安全。此外,OneNet还为企业级用户提供了多层次的安全保障方案,确保用户的数据隐私和操作权限不受威胁。
OneNet的应用场景非常广泛,涵盖了智能家居、智能城市、智慧农业、工业控制、环保监测、能源管理等多个领域。在智能家居领域,OneNet帮助用户实现家电设备的远程控制、状态监测和数据分析;在智慧城市领域,OneNet可用于智能交通、环境监测、公共安全等系统的数据处理和管理;在工业物联网领域,OneNet支持设备状态监控、生产过程优化和智能维护等功能。
3. OneNet平台的配置
【讲解2024新版本OneNet云平台MQTT协议的使用(讲解设备上云以及可视化页面设计)】 https://www.bilibili.com/video/BV12m421u7A5/?share_source=copy_web&vd_source=347136f3e32fe297fc17177194ce0a8b
4. 代码设计
以下是一个完整的main.c
文件示例,包含串口2的初始化、ESP8266的MQTT连接、主题订阅以及发布消息。
代码结构说明:
- 串口2初始化:通过STM32的标准库初始化串口2用于与ESP8266进行AT指令通信。
- ESP8266连接到OneNet:通过AT指令与OneNet物联网平台进行连接。
- MQTT主题订阅与消息发布:通过AT指令订阅主题和发布消息。
完整代码:
#include "stm32f10x.h"
#include "string.h"
#include "stdio.h"
#define USART2_BAUDRATE 115200
// 串口2初始化函数
void USART2_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 打开GPIOA时钟(串口2使用的GPIO)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 打开USART2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// 配置PA2为USART2_TX,PA3为USART2_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置USART2
USART_InitStructure.USART_BaudRate = USART2_BAUDRATE;
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(USART2, &USART_InitStructure);
// 使能USART2
USART_Cmd(USART2, ENABLE);
}
// 发送字符串到串口
void USART2_SendString(char* str) {
while (*str) {
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2, *str++);
}
}
// 接收串口数据
char USART2_Receive(void) {
while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);
return USART_ReceiveData(USART2);
}
// 延时函数
void delay_ms(uint32_t ms) {
uint32_t i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 5000; j++) {
// 约1ms延时
}
}
}
// AT指令发送与接收函数
void ESP8266_SendATCommand(char* cmd, char* response, uint16_t timeout) {
USART2_SendString(cmd);
delay_ms(100); // 等待ESP8266响应
uint16_t count = 0;
while (count < timeout) {
if (USART2_Receive() == response[count]) {
count++;
} else {
count = 0;
}
if (count == strlen(response)) {
return; // 响应匹配成功
}
}
}
// 初始化ESP8266并连接OneNet平台
void ESP8266_Init(void) {
// 启动ESP8266并检查返回的AT指令响应
ESP8266_SendATCommand("AT\r\n", "OK", 5000);
ESP8266_SendATCommand("AT+CWMODE=1\r\n", "OK", 5000); // 设置Wi-Fi工作模式为Station模式
ESP8266_SendATCommand("AT+CWJAP=\"your_SSID\",\"your_PASSWORD\"\r\n", "OK", 10000); // 连接Wi-Fi网络
// 配置MQTT连接
ESP8266_SendATCommand("AT+MQTTUSERCFG=0,1,\"dev1\",\"yH646K46wu\",\"version=2018-10-31&res=products%2FyH646K46wu&et=1799216765&method=sha1&sign=8rjj%2Bw4eq5SpC8Zl8ouU78To8eE%3D\",0,0\r\n", "OK", 5000);
ESP8266_SendATCommand("AT+MQTTCONN=0,\"183.230.40.96\",1883,0,0\r\n", "OK", 5000); // 连接到OneNet服务器
}
// 订阅MQTT主题
void ESP8266_SubscribeTopic(void) {
ESP8266_SendATCommand("AT+MQTTSUB=0,\"$sys/yH646K46wu/dev1/#\",0\r\n", "OK", 5000); // 订阅主题
}
// 发布MQTT消息
void ESP8266_PublishMessage(void) {
char message[] = "{\"id\":123,\"dp\":{\"MPU6050\":[{\"v\":20}],\"gps\":[{\"v\":{\"lon\":108.89921,\"lat\":34.268685}}],\"HeartRate\":[{\"v\":90}],\"SPO\":[{\"v\":80}],\"MLX90614\":[{\"v\":18.5}]}}";
// 发布消息
ESP8266_SendATCommand("AT+MQTTPUB=0,\"$sys/yH646K46wu/dev1/dp/post/json\",0,0,\"", "", 100);
USART2_SendString(message); // 发送JSON数据
ESP8266_SendATCommand("\"", "OK", 5000); // 完成消息发送
}
int main(void) {
// 系统初始化
SystemInit();
// 初始化串口2
USART2_Init();
// 初始化ESP8266并连接OneNet
ESP8266_Init();
// 订阅MQTT主题
ESP8266_SubscribeTopic();
// 发布MQTT消息
ESP8266_PublishMessage();
while (1) {
// 这里可以继续处理其他任务
}
}
代码注释说明:
- 串口初始化 (
USART2_Init
):该函数配置了STM32的串口2,设置波特率为115200,传输位长度为8位,停止位为1位,且无校验位。 - AT指令发送与响应 (
ESP8266_SendATCommand
):该函数用于通过串口2发送AT指令,并等待ESP8266模块的响应。若响应正确,则表示操作成功。 - ESP8266初始化与连接Wi-Fi (
ESP8266_Init
):该函数启动ESP8266模块,配置为Station模式并连接Wi-Fi网络。接着,它配置MQTT连接的必要信息并连接到OneNet平台。 - MQTT主题订阅与消息发布:
ESP8266_SubscribeTopic
用来订阅指定的MQTT主题;ESP8266_PublishMessage
用来发布JSON格式的MQTT消息到指定的发布主题。
注意事项:
- Wi-Fi网络:在
ESP8266_SendATCommand("AT+CWJAP=\"your_SSID\",\"your_PASSWORD\"\r\n", "OK", 10000)
中,请替换your_SSID
和your_PASSWORD
为实际的Wi-Fi信息。 - MQTT服务器信息:此示例中已经包含了OneNet平台的IP地址、端口、ClientId、用户名、密码等信息
- AT固件:确保ESP8266上已烧录支持MQTT的AT固件,并且AT指令集与示例代码兼容。