在上一篇文章中,说明了MQTT在树莓派部署服务器的方法,和手机客户端作为SUB端的方法。
本节终于到了端PUB的方法,毕竟物联网的物就在这个地方。
ESP32网上介绍有两个库,一个subpubclient和MQTTclient两个,subpub试了一下,较复杂,需要另外使用wifi.h的库,集成度较低,适合深度开发。
而MQTTclient高集成度,只需要实例化一个EspMQTTClient对象
EspMQTTClient client(
"WifiSSID",
"WifiPassword",
"192.168.1.100", // MQTT Broker server ip
"MQTTUsername", // Can be omitted if not needed
"MQTTPassword", // Can be omitted if not needed
"TestClient", // Client name that uniquely identify your device
1883 // The MQTT port, default to 1883. this line can be omitted
);
依次填入wifi名字,密码,MQTT toker的地址,MQTT的用户名,密码,自己给自己PUB起一个名字。
在setup中保持例子的设置,大概是保持串口输出等
// Optionnal functionnalities of EspMQTTClient :
client.enableDebuggingMessages(); // Enable debugging messages sent to serial output
client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overrited with enableHTTPWebUpdater("user", "password").
client.enableLastWillMessage("TestClient/lastwill", "I am going offline");
接下来就是在loop中使用
client.loop();
使PUB端一直运行。
好,这不是什么没发吗?答案在
void onConnectionEstablished()
函数中,这个函数是loop内建调用函数,相当于中断执行函数,loop里面只是一个状态机而已。
在这个函数中,使用
client.publish("mytopic/test", "This is a message");
来实现发布,第一个参数为topic,第二个参数为内容,so easy,美滋滋。
用
client.subscribe("mytopic/test", [](const String & payload) {
Serial.println(payload);
});
来实现订阅到串口打印,so so easy是不是,站在巨人肩上就是不一样。
在
void onConnectionEstablished()
可以加一个while来循环发送消息。忘加delay函数了,以为
client.executeDelayed(5 * 1000, []()
可以有延时作用,但是while在这个delay后,直接又回到第一条执行,结果手机上订阅的消息瞬间炸了。。。手机app也死了。。。
以为树莓派也死了,结果好好的,说明toker的作用,转发而已,跟http服务器有点不一样。
加个delay效果很好。交替发送。
如果不深入修改的话推荐这个库,很好上手,免去wifi+MQTT繁琐的设置,我重启esp32后重连wifi也很快,退出机制也比较完善。
终于在最后5天前基本完成MQTT的小目标,GOOD。