STM32 + ESP8266 + MQTT:连接 OneNet 物联网平台
2023-11-02 06:26:57
前言
物联网(IoT)是一个快速发展的领域,它将物理世界与数字世界连接起来,使设备能够收集和交换数据。OneNet是阿里云的一个物联网平台,它提供了一系列服务来帮助企业和个人构建和管理物联网解决方案。
STM32和ESP8266是两个流行的微控制器,它们可以很容易地用于构建物联网设备。STM32是一款高性能的32位微控制器,具有强大的处理能力和丰富的外设。ESP8266是一款低功耗的Wi-Fi模块,它可以轻松地连接到互联网。
MQTT是一种轻量级的消息传递协议,它非常适合物联网应用。MQTT协议使用发布/订阅模式,这使得设备可以很容易地将数据发送到服务器,并从服务器接收数据。
硬件准备
- STM32开发板
- ESP8266开发板
- USB转TTL模块
- 面包板
- 杜邦线
- 传感器(如温湿度传感器、光照传感器等)
软件准备
- STM32CubeIDE
- ESP8266 Arduino IDE
- OneNet平台账号
- MQTT客户端(如MQTT.fx)
STM32 + ESP8266连接OneNet平台
1. STM32配置
首先,我们需要配置STM32开发板。将STM32开发板与电脑连接,并打开STM32CubeIDE。
在STM32CubeIDE中,创建一个新的项目。选择STM32系列、开发板型号和编译器。
在项目中添加一个新的文件,并将其命名为“main.c”。
在“main.c”文件中,添加以下代码:
#include "stm32f1xx_hal.h"
int main(void)
{
HAL_Init();
// 配置串口
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置USART
USART_InitTypeDef USART_InitStruct = {0};
USART_InitStruct.BaudRate = 115200;
USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
USART_InitStruct.StopBits = USART_STOPBITS_1;
USART_InitStruct.Parity = USART_PARITY_NONE;
USART_InitStruct.Mode = USART_MODE_TX_RX;
USART_InitStruct.CLKPolarity = USART_POLARITY_LOW;
USART_InitStruct.CLKPhase = USART_PHASE_1EDGE;
USART_InitStruct.CLKLastBit = USART_LASTBIT_DISABLE;
HAL_USART_Init(USART1, &USART_InitStruct);
// 打印信息
HAL_UART_Transmit(&huart1, (uint8_t*)"STM32 ready\r\n", 13, 1000);
while (1)
{
// TODO: 这里可以添加其他代码
}
}
2. ESP8266配置
接下来,我们需要配置ESP8266开发板。将ESP8266开发板与电脑连接,并打开ESP8266 Arduino IDE。
在ESP8266 Arduino IDE中,创建一个新的项目。选择ESP8266系列、开发板型号和编译器。
在项目中添加一个新的文件,并将其命名为“main.ino”。
在“main.ino”文件中,添加以下代码:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Wi-Fi SSID和密码
const char* ssid = "your_ssid";
const char* password = "your_password";
// OneNet平台信息
const char* mqtt_server = "mqtt.onenet.com";
const int mqtt_port = 1883;
const char* product_id = "your_product_id";
const char* device_id = "your_device_id";
const char* secret = "your_secret";
// MQTT客户端
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// 初始化串口
Serial.begin(115200);
// 连接Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to Wi-Fi...");
}
// 连接MQTT服务器
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
if (client.connect(device_id, product_id, secret)) {
Serial.println("Connected to MQTT server");
} else {
Serial.print("Failed to connect to MQTT server, rc=");
Serial.print(client.state());
Serial.println("Retrying...");
delay(5000);
}
}
// 订阅主题
client.subscribe("your_topic");
}
void loop() {
client.loop();
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Received message: ");
Serial.println(payload);
}
3. 连接OneNet平台
现在,我们需要将STM32开发板和ESP8266开发板连接到OneNet平台。
首先,登录OneNet平台,并创建一个产品。产品是物联网设备的集合,我们可以将STM32开发板和ESP8266开发板添加到同一个产品中。
接下来,我们需要创建两个设备。设备是物联网设备的具体实例,我们可以将STM32开发板和ESP8266开发板分别创建为两个设备。
创建设备时,我们需要指定设备的产品ID、设备ID和设备密钥。产品ID是产品的唯一标识符,设备ID是设备的唯一标识符,设备密钥是设备的认证密钥。
4. 数据传输
现在,我们可以开始使用STM32开发板和ESP8266开发板传输数据了。
首先,我们需要在STM32开发板上采集数据。我们可以使用传感器来采集温湿度、光照等数据。
接下来,我们需要将采集到的数据发送到ESP8266开发板上。我们可以使用串口来发送数据。
ESP8266开发板收到数据后,会将数据发送到OneNet平台。OneNet平台收到数据后,会将数据存储在数据库中。
结语
通过本文,我们学习了如何使用STM32和ESP8266连接OneNet物联网平台,并使用MQTT协议实现数据交互。