本次开发需要用到MQTT服务器,因此需要现在arduino中

安装PubSubClient library

ESP32出现TCP windowfull esp32 arduino tcp_服务器

代码:

#include<WiFi.h>
#include<PubSubClient.h>

const char *id="wifi名称";
const char *psw="wifi密码";
const char *mqttServer="服务器ip地址(域名)";
const int mqttPort=1883;       //服务器TCP协议的端口号
const char *mqttUser="admin";   //登录服务器所需的用户名
const char *mqttPsw="public";   //密码

WiFiClient espClient;     //实例WiFiClient对象
PubSubClient client(espClient);   //实例PubSubClient对象,espClient做参数

void setup() {
  Serial.begin(115200);    //设置波特率
  while(WiFi.status()!=WL_CONNECTED){      //判断wifi是否连接,请确保你所连接的wifi联通了互联网
    delay(500);
    WiFi.begin(id,psw);      //连接wifi
    Serial.println("正在连接wifi...");
}
  Serial.println("已连接!");
  
  client.setServer(mqttServer,mqttPort);    //设置服务器地址,端口
  while(!client.connected()){        //判断是否连接到服务器
    Serial.println("正连接至MQTT服务器..."); 
    if(client.connect("ESP32Client",mqttUser,mqttPsw)){     
    //"ESP32Client"为你的客户端ID,可自定义
      Serial.println("已连接!");  
    }else{
      Serial.println("连接失败");
      Serial.println(client.state());    //重连函数
      delay(2000);  
    }  
  }
  client.subscribe("ESP32");            //订阅名为ESP32的主题
  Serial.println("已订阅主题,等待消息...");
  client.publish("ESP32","Hello world from ESP32");    //向ESP32主题下发送信息"Hello world from ESP32"
}

void loop() {
  client.loop();          //回旋接收函数  等待服务器返回的数据
}

运行效果:

串口输出提示

ESP32出现TCP windowfull esp32 arduino tcp_arduino_02


因为不懂网页后台怎么查看订阅消息,故用手机作为第三方进行接收,可以看到我们确实是收到了esp32发出的信息

ESP32出现TCP windowfull esp32 arduino tcp_串口_03


关于MQTT的一些概念介绍

MQTT 协议的订阅与发布是基于主题的(Topic),一个典型的 MQTT 消息发送与接收的流程如下:

ClientA 连接到 Broker; ClientB 连接到 Broker,并订阅主题 Topic1; ClientA 发送给
Broker 一条消息,主题为 Topic1; Broker 收到 ClientA 的消息,发现 ClientB 订阅了
Topic1,然后将消息转发到 ClientB; ClientB 从 Broker 接收到该消息。 和传统的队列有点不同,如果
ClientB 在 ClientA 发布消息之后再订阅 Topic1,ClientB 不会收到该条消息。

创建MQTT:
ESP32连接MQTT服务器(基于Arduino环境)

1.如何进入mqtt网页后台

在浏览器输入 http://你的服务器IP:18083/#/,进入之后界面如下 输入默认账号:admin,密码:public
一般为http://127.0.0.1:18083/

2.利用后台发送信息

ESP32出现TCP windowfull esp32 arduino tcp_arduino_04


连接之后,填写好对应的主题与信息,点击发送即可

ESP32出现TCP windowfull esp32 arduino tcp_#include_05


3.为什么连接服务器失败:

const char *mqttServer="服务器ip地址(域名)";

这里的ip地址,win+R调出cmd,输入ipconfig指令查看

ESP32出现TCP windowfull esp32 arduino tcp_#include_06


ESP32出现TCP windowfull esp32 arduino tcp_arduino_07


ipv4地址这一栏

注:填写ip地址的前后不要有空格

补充,更完善的例程:

#include<WiFi.h>
#include<PubSubClient.h>

const char*ssid ="wifi名称";               //ESP32连接的WiFi账号
const char*password = "wifi密码";        //WiFi密码
const char*mqttServer = "服务器地址";  //要连接到的服务器IP
const int mqttPort =1883;                 //要连接到的服务器端口号
const char*mqttUser = "admin";            //MQTT服务器账号
const char*mqttPassword = "public";       //MQTT服务器密码
 
WiFiClient espClient;                     // 定义wifiClient实例
PubSubClient client(espClient);          // 定义PubSubClient的实例
 
void callback(char*topic, byte* payload, unsigned int length) 
{
    Serial.print("来自订阅的主题:");              //串口打印:来自订阅的主题:
    Serial.println(topic);                //串口打印订阅的主题
    Serial.print("信息:");              //串口打印:信息:
    for (int i = 0; i< length; i++)        //使用循环打印接收到的信息
    {
        Serial.print((char)payload[i]);
    }
    Serial.println();
    Serial.println("-----------------------");
}
void setup() 
{
    Serial.begin(115200);                   //串口函数,波特率设置
    while (WiFi.status() != WL_CONNECTED)   //若WiFi接入成功WiFi.status()会返回 WL_CONNECTED
    {       
        Serial.println("连接wifi中");         //串口输出:连接wifi中
        WiFi.begin(ssid,password);          //接入WiFi函数(WiFi名称,密码)重新连接wif
        delay(500);                         //若尚未连接WiFi,则进行重连WiFi的循环
    }
    Serial.println("wifi连接成功");             //连接wifi成功之后会跳出循环,串口并输出:wifi连接成功
    client.setServer(mqttServer,mqttPort);  //MQTT服务器连接函数(服务器IP,端口号)
    client.setCallback(callback);           //设定回调方式,当ESP32收到订阅消息时会调用此方法
    while (!client.connected())             //是否连接上MQTT服务器
    {
        Serial.println("连接服务器中");         //串口打印:连接服务器中
        if (client.connect("ESP32Client",mqttUser, mqttPassword ))  //如果服务器连接成功
        {
            Serial.println("服务器连接成功");          //串口打印:服务器连接成功
        }
        else 
        {
            Serial.print("连接服务器失败");            //串口打印:连接服务器失败
            Serial.print(client.state());       //重新连接函数
            delay(2000);                        
        }
    }
    client.subscribe("ESP32");                 //连接MQTT服务器后订阅主题
    Serial.print("已订阅主题,等待主题消息....");                  //串口打印:已订阅主题,等待主题消息
    client.publish("/World","Hello from ESP32");//向服务器发送的信息(主题,内容)
}
 
void loop()   
{
  client.loop();                              //回旋接收函数  等待服务器返回的数据
}

EMQTT常用指令:

emqttd start
后台启动 EMQ TT Broker;
emqttd stop
关闭 EMQ TT Broker;
emqttd restart
重启 EMQ TT Broker;
emqttd console
使用控制台启动 EMQTT Broker;
emqttd foreground
使用控制台启动 EMQ X Broker,与 emqx console 不同,emqx foreground 不支持输入 Erlang
 命令;emqttd ping
Ping EMQ TT Broker。

参考文章
ESP32连接MQTT服务器(基于Arduino环境) emqtt安装
ESP32入门Arduino开发(七)–MQTT publishing 代码例程,函数讲解
MQTT协议理解—发布与订阅 4.1
ESP32连接MQTT服务器(基于Arduino环境) 更完整的例程
EMQTT官方文档