返回

STM32 + ESP8266 + MQTT:连接 OneNet 物联网平台

后端

前言

物联网(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协议实现数据交互。