MQTT协议实现公网对讲
使用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地址:点击我
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
想问一下这个对讲不是双工吗?那怎么区分发送端和接收端?
互相为发送端接收端,代码默认是分时全双工的,视频里面我没有接硬件
你好,对讲机的接线看了很多遍,小白的我还是看不懂麦克风和喇叭怎么接,是否可以更详细的展示一下如何接线吗?
INMP441:
BCK --->>>IO4
WS --->>>IO15
data--->>>IO13
MAX98357:
BCK --->>>IO26
WS --->>>IO22
data--->>>IO25
与ESP32板子上的丝印相对应
有个问题想请教你一下,引脚这块还是有点懵
INMP441 这个模块的SD L/B WS SCK 对应你那上面引脚的哪些?
MAX98357 这个模块的LRC BCLK DIN GAIN SD 对应你那上面引脚的哪些呢?
你可以看一下使用手册,IIS无外乎三根线 数据线、左右声道线、时钟线,其他的线都是选配
你这个MQTT协议实现公网对讲的开源程序我烧录到单片机里,按键按下后说话,为什么另一个单片机接收到播放的声音就是“吱吱吱.......",说话声音大一点,吱吱吱......."的声音就大一点
吱吱吱的声音里好像夹杂着我说话的声音,但是很慢,好像慢放一样,我用的是局域网mqtt服务器,
我也遇到了同样的问题,就是只有吱吱声音,请问你解决了吗?
请问你们解决了吗,我用的EMQX Cloud服务器也是这样啊
我又试了下,播放确实有语音,但是也有杂音,而且语音速度很慢,是不是跟MQTT服务器设置有关系,还是程序里面的延时有关系,还是我使用的连接到单片机的排线有关系
很有可能是因为你的MQTT服务器没有配置带宽限制,导致有一些数据包被拒绝了
up主,这个带宽限制哪里配置啊,谢谢
我的也是这样的,请问怎么解决
能不能加一下联系方式,线连好了,MQTT服务器后台也有消息流入和流出,但是扬声器就是不响,我单独测试MAX98357就可以响,用的是tb给的例程 唉
你可以暂时先把接收到的数据打印出来,观察一下是不是有数据,并且你可能需要考虑模块声道的问题
可以,我试试,对了,我用那个Python脚本,收到的是数字,递增的,并没有播放音频
我认为你说的收到的递增数字应该是命令行打印的包数,你可以将所有的PCM数据打印出来,观察是静音还是有数据,如果全为0,请检查MIC的声道是否正确
好的好的,感谢UP主!
我用的是1.0.6的esp32库,这个不会有影响吧?2.0.4的库不就是多适配了开发板的型号吗?
我当时用1.0.x的库存在编译不通过的情况,可能大版本的SDK接口有修改
搞定了,到最后居然是我的INMP441引脚焊反了,我把引脚焊在了金属圈那面,害
UP你好,有不懂的地方请教一下。
bool sendOver=1;//发送完成标志位
bool recOver=0;//接受完成标志位
bool speakOut;//0代表对外讲话,1代表收听
程序中这些变量定义了,有在判断语句中用到,但我没有看到有什么程序和函数给它赋值。为什么呢?
这些变量可能在编码初期使用到了,但是后来代码优化未删除,这个代码质量很差,你可以尝试重写一下
大佬,能把优化后的代码也发我一份学习学习吗,万分感谢!!!我的邮箱2571963466@qq.com
大佬,发我一份语音对讲的demo源码,万分感谢!!!我的邮箱:65521075@qq.com
已发
大佬,发我一份语音对讲的demo源码 我的邮箱:623795040@qq.com
可以转发一下吗?我的邮箱2015966198@qq.com 谢谢!!!
你好,可以把源码也发我一份吗,邮箱:1684173385@qq.com
拜托,麻烦了
你好,可以把源码也发我一份吗,邮箱:1826683460@qq.com
拜托,麻烦了
大佬,按照您之前的教程安装了EMQ 5.3.2,也按照案例上传到ESP32上,MQTT服务器上监听器选项的TCP速率已经调整过了但是语音会有慢放的感觉,想请教下这个问题可以怎么解决。
大佬,我试了git里面的代码但是报错了,请问有demo源码吗,如果可以请发我一份,感谢! 我的邮箱:746770568@qq.com
大佬,也发我一份语音对讲的demo源码 我的邮箱:85116971@qq.com
老师你好,我测试了你的代码,发送没有问题,但是无法接收,监测不到获取数据,指示灯也不亮,请在有空的时候指教一下,感谢了
哥,可以发我一份语音对讲的demo源码,非常感谢,我的邮箱,3153381485@qq.com
大佬,能发一下MQTT服务器代码吗? 支付报酬的。我的邮箱 mbdbk@qq.com
哥,可以发我一份语音对讲的demo源码,非常感谢,我的邮箱,1308137826@qq.com
大佬,发我一份语音对讲的demo源码 我的邮箱:z1092993003@163.com
大佬你好,可以发一份源码吗,我的邮箱:1684173385@qq.com
这个代码运行的平台是什么啊
谢谢大佬制作了这么有趣的一个项目 请问这个项目对ESP32主控有内存和FLASH大小要求吗
需要是ESP32 ,其他的S系列与C系列都不可以
你好,希望能有一个adf版本
大佬,可以把喇叭换成耳机吗,如果可以应该如何实现呢
这个音频模块默认带功率放大器的,你可以使用不带功放的音频模块,当然可能会复杂一些
理论上,你可以尝试降低音量并且直接将喇叭更换为耳机