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