以下述代碼中,我們首先定義了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);
}
}
請各位指正點評。
|