使用Arduino开发ESP32(六):基于arduino的ESP32,连接MQTT服务器,发送,接收消息;与MQTT服务器的搭建,

本次开发需要用到MQTT服务器,因此需要现在arduino中
安装PubSubClient library
在这里插入图片描述

代码:

#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发出的信息
在这里插入图片描述
关于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.利用后台发送信息
在这里插入图片描述
连接之后,填写好对应的主题与信息,点击发送即可
在这里插入图片描述
3.为什么连接服务器失败:

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

这里的ip地址,win+R调出cmd,输入ipconfig指令查看
在这里插入图片描述
在这里插入图片描述
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官方文档

  • 12
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,以下是将土壤湿度通过ESP32发送MQTT服务器Arduino代码: ```c++ #include <WiFi.h> #include <PubSubClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* mqtt_server = "your_MQTT_SERVER"; const char* mqtt_username = "your_MQTT_USERNAME"; const char* mqtt_password = "your_MQTT_PASSWORD"; const char* mqtt_topic = "your_MQTT_TOPIC"; WiFiClient espClient; PubSubClient client(espClient); int soilSensor = 34; // Soil moisture sensor on analog pin A2 void setup() { Serial.begin(115200); pinMode(soilSensor, INPUT); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } client.setServer(mqtt_server, 1883); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP32Client", mqtt_username, mqtt_password )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } } void loop() { int soilValue = analogRead(soilSensor); String message = String(soilValue); client.loop(); if (!client.connected()) { reconnect(); } client.publish(mqtt_topic, message.c_str()); delay(5000); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } void reconnect() { while (!client.connected()) { Serial.println("Connecting to MQTT..."); if (client.connect("ESP32Client", mqtt_username, mqtt_password )) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } } ``` 请注意替换代码中的以下参数: - `your_SSID`: 您的WiFi网络名称 - `your_PASSWORD`: 您的WiFi网络密码 - `your_MQTT_SERVER`: 您的MQTT服务器地址 - `your_MQTT_USERNAME`: 您的MQTT服务器用户名 - `your_MQTT_PASSWORD`: 您的MQTT服务器密码 - `your_MQTT_TOPIC`: 您想要发布的MQTT主题 希望这能帮到你!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值