使用MQTT做一个公网对讲机

上一篇博客中,使用ESP32与ESP-NOW协议做了一个短距离对讲机(链接),发布了一个视频在B站

评论区中,很多B友希望可以实现无限距离对讲,这样的话需要服务器转发,刚开始我想使用python写一个TCP或者UDP的转发功能,但是考虑到很多小白没有公网服务器,并且也不会使用python,于是我想到了互联网中的MQTT协议,MQTT协议天生为转发而生;MQTT协议是TCP协议的应用,是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT使用的发布/订阅消息模式,提供了一对多的消息分发机制,从而实现与应用程序的解耦。这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。

我曾经也有一篇文章简单的叙述了MQTT的工作原理与搭建过程(怎样在自己的电脑上搭建MQTT),MQTT可以运行在几乎所有的设备上,例如公网服务器(Linux、Windows系统等)、树莓派、局域网电脑等,当然,如果MQTT服务运行在局域网中,那就只能实现局域网的消息转发。如果你没有公网服务器,可以使用我的MQTT地址,我的MQTT服务器将会免费开放到2025年。我使用的MQTT Broker为EMQ免费开源版,并且修改了cfg文件,将速率与可接入设备限制调高。

如果你只想实现无限对讲,不想关注MQTT,那就看下面的代码吧,代码git链接放在文章最后!

首先需要在Arduino中安装pubsubclient库,这个库是可以运行在ESP上的MQTT库,源码也非常简单,非常值得学习。
代码上基于上个视频的硬件与代码,硬件连接完全相同,软件只进行了通信协议的修改。(重点:)代码中需要修改的只有两个地方,第一个地方是WIFI账号与密码(2.4G),第二个地方是修改角色,发送端或者接收端,具体位于AudioMqtt.h中的SENDER宏定义,你需要将该项设置为1,编译烧录给带有麦克风的设备,再将该项设置为0,编译烧录给带有扬声器的设备。烧录给两个设备,按下发射端的板载按钮说话,你应该就可以听到扬声器中你的声音了。

我们已经了解了MQTT协议的工作原理,我们也可以在电脑上写一段python脚本订阅发布的音频数据并且播放出来,python需要的库为paho-mqtt与pyaudio,代码也在git中,是audiotest.py。

git地址:点击我