本次开发需要用到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官方文档