找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1158|回复: 0
打印 上一主题 下一主题
收起左侧

STM32单片机+ESP8266+ONENET

[复制链接]
跳转到指定楼层
楼主
ID:903925 发表于 2023-3-7 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下述代码中,我们首先定义了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);
    }
}

请各位指正点评。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表