标题: STM32单片机+ESP8266+ONENET [打印本页]

作者: mbgandkyh    时间: 2023-3-7 09:38
标题: STM32单片机+ESP8266+ONENET
以下述代码中,我们首先定义了mqtt_buf、mqtt_topic和mqtt_payload三个变量,分别用于存储MQTT客户端的缓存、MQTT主题和MQTT消息负载。然后,在ESP8266_SendString函数中,我们通过USART1向ESP8266模块发送AT指令,以连接到WiFi网络。接着,在MQTT_Client_Init函数中,我们使用MQTTClientInit函数初始化MQTT客户端,使用MQTTClientConnectOptions结构体设置MQTT连接选项,然后使用MQTTClientConnect函数连接到ONENET云平台。在MQTT_Publish函数中,我们使用MQTTClient_publish函数向ONENET云平台发布MQTT消息。最后,在main函数中,我们获取传感器数据并构造JSON数据,然后通过MQTT_Publish函数发布数据到ONENET云平台。需要注意的是,获取传感器数据和构造JSON数据的代码需要根据具体的传感器类型和数据格式进行修改。

#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#include "MQTTClient.h"
#define ESP8266_USART USART1
#define MQTT_BUF_SIZE 1024
#define MQTT_TOPIC_LEN 128
#define MQTT_PAYLOAD_LEN 512
char mqtt_buf[MQTT_BUF_SIZE];
char mqtt_topic[MQTT_TOPIC_LEN];
char mqtt_payload[MQTT_PAYLOAD_LEN];
void ESP8266_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;

    // 使能GPIOA和USART1的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

    // 配置PA9为USART1的TX引脚,PA10为USART1的RX引脚
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 配置USART1
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_Init(ESP8266_USART, &USART_InitStruct);

    // 使能USART1
    USART_Cmd(ESP8266_USART, ENABLE);
}
void ESP8266_SendString(char *str)
{
    while (*str)
    {
        USART_SendData(ESP8266_USART, (uint16_t) *str++);
        while (USART_GetFlagStatus(ESP8266_USART, USART_FLAG_TXE) == RESET);
    }
}
void MQTT_Client_Init(Network *net, MQTTClient *client)
{
    MQTTClientInit(client, net, 1000, mqtt_buf, MQTT_BUF_SIZE, mqtt_payload, MQTT_PAYLOAD_LEN);
    MQTTClientConnectOptions conn_opts = MQTTClientConnectOptions_initializer;
    conn_opts.keepAliveInterval = 60;
    conn_opts.cleansession = 1;
    int rc = MQTTClientConnect(*client, &conn_opts);
    if (rc != 0) {
        printf("MQTT client connect failed\n");
    }
}
void MQTT_Publish(MQTTClient client, char *payload)
{
    MQTTMessage msg = MQTTMessage_initializer;
    msg.qos = QOS0;
    msg.retained = 0;
    msg.payload = payload;
    msg.payloadlen = strlen(payload);
    MQTTClient_publish(client, mqtt_topic, &msg);
}
int main(void)
{
    ESP8266_Init();

    // 连接到WiFi网络
    ESP8266_SendString("AT+CWJAP=\"SSID\",\"password\"\r\n");
    // 等待连接结果

    Network network;
    MQTTClient client;
    MQTTString topicString = MQTTString_initializer;
    topicString.cstring = mqtt_topic;
    int rc = 0;

    // 连接到ONENET云平台
    NetworkInit(&network);
    NetworkConnect(&network, "ip", 1883);
    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
    connectData.clientID.cstring = "L7VkaI9WWX";
    connectData.username.cstring = "L7VkaI9WWX";
    connectData.password.cstring = "n3NMsxxWahB3xHI3uGm31UYWnEtOA0I7Rs9JXSxxTS0=";
    connectData.keepAliveInterval = 60;
    MQTT_Client_Init(&network, &client);
    sprintf(mqtt_topic, "/topic/L7VkaI9WWX/data");

    while (1)
    {
        // 获取传感器数据
        float temperature = read_temperature();
        float humidity = read_humidity();

        // 构造JSON数据
        sprintf(mqtt_payload, "{\"temperature\":%!f(MISSING),\"humidity\":%!f(MISSING)}", temperature, humidity);

        // 发布数据到ONENET云平台
        MQTT_Publish(client, mqtt_payload);

        // 延时1s
        delay_ms(1000);
    }
}

请各位指正点评。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1