如何使用ESP-01模块连接到MQTT代理

问题描述 投票:0回答:1

我已将ESP-01 WiFi模块与我的stm32f4发现板连接,并已使用AT命令加入了WiFi网络。现在,我想将ESP-01模块连接到在RPi3(连接到同一WiFi网络)上运行的MQTT代理,并订阅/发布主题。

我已尝试建立与MQTT代理的TCP连接,并且已建立连接,但我不知道如何订阅/发布mqtt主题。

#include "mbed.h"

Serial esp(PB_6,PB_7);
Serial pc(PC_10, PC_11);


char* serverIpAddr = "192.168.1.103";  /*Sever ip address*/
int port = 1883; /*Sever Port*/



int main()
{
    char at_recv[10];
    char cwmode_ack[18];
    char conn_status[84];
    char mux_ack[45];
    char ser_ack[100];
    char ping_ack[40];
    char cip_ack[15];

    char clientID[] = "EPBM4";   /* Client nanme show for MQTT server */

    int i =0;
    char *ssid_name = "\"tplink\"";    //Enter SSID in the same format
    /* Password = "\"<Enter Password>\"" */
    char *password = ",\"edutech1234\""; //Enter the password in the same format

    esp.baud(115200);
    pc.baud(115200);

    pc.printf("\r\nInitializing Wifi module\r\n");
    esp.printf("AT+RST\r\n");
    wait(4);
    esp.printf("AT+CWQAP\r\n");
    wait(4);

/* Setting Wifi Mode as Station or APN */
    esp.printf("AT+CWMODE=3\r\n");
    for (int i=0; i<18; i++)
    {
        cwmode_ack[i] = esp.getc();
    }

    for(int j=0; j<18;i++)
    {
        if((cwmode_ack[18-j] == 'O') && (cwmode_ack[18 - (j+1)] == 'K'))
        {
            pc.printf("\r\nWifi mode set to both APN and Station.\r\n");
            break;
        }
    }
    wait(1);

    pc.printf("\r\nConnecting to Router\r\n");

/* Connecting to Wifi Network*/
    esp.printf("AT+CWJAP=");
    esp.printf("%s",ssid_name);
    esp.printf("%s",password);
    esp.printf("\r\n");

    for (int i=0; i<68; i++)
    {
        conn_status[i] = esp.getc();
    }

    for(int j=0; j<68;i++)
    {
        if((conn_status[68-j] == 'O') && (conn_status[68-(j+1)] == 'K'))
        {
            pc.printf("\r\nSuccessfuly connected to WiFi network.\r\n");
            break;
        }
    }

    wait(1);


/* data transmission */
    esp.printf("AT+CIPMODE=0\r\n");
    for (int i=0; i<15; i++)
    {
        cip_ack[i] = esp.getc();
    }

    for(int j=0; j<15;i++)
    {
        if((cip_ack[15-j] == 'O') && (cip_ack[15-(j+1)] == 'K'))
        {
            pc.printf("\r\nTransfer mode set to Normal.\r\n");
            break;
        }
    }
    wait(2);

/* Single Connection over TCP/IP */

    esp.printf("AT+CIPMUX=0\r\n");
    for (int i=0; i<19; i++)
    {
        mux_ack[i] = esp.getc();
    }

    wait(2);

    pc.printf("Connecting to TCP Socket...");
    esp.printf("AT+CIPSTART=\"TCP\",\"192.168.1.103\",1883\r\n");

    for (int i=0; i<56; i++)
    {
        ser_ack[i] = esp.getc();
    }

    for(int j=0; j<56;i++)
    {
        if((ser_ack[56-j] == 'C') && (ser_ack[56-(j+1)] == 'O')&& (ser_ack[56-(j+2)] == 'N') && (ser_ack[56-(j+3)] == 'N')&& (ser_ack[56-(j+4)] == 'E')&& (ser_ack[56-(j+5)] == 'C')&& (ser_ack[56-(j+6)] == 'T'))
        {
            pc.printf("\r\n\r\nTCP connection established..\r\n");
            break;
        }
    }
    wait(2);

    while(1);
}

因此,与MQTT代理建立TCP连接后,任何人都可以指导我如何订阅主题。

mqtt esp8266 stm32f4discovery mbed
1个回答
0
投票

从mbed版本5.14开始,官方支持MQTT库。检查这里:https://github.com/ARMmbed/mbed-mqtt

© www.soinside.com 2019 - 2024. All rights reserved.