AI智能
改变未来

使用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);      //连接wifiSerial.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 = \"服务器地址\";  //要连接到的服务器IPconst 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名称,密码)重新连接wifdelay(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官方文档

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 使用Arduino开发ESP32(六):基于arduino的ESP32,连接MQTT服务器,发送,接收消息;与MQTT服务器的搭建,