MQTT Audio Streaming
Este proyecto demuestra cómo usar la placa reSpeaker Lite, que incluye un microcontrolador XIAO ESP32S3 integrado, para generar y enviar datos de audio a un broker MQTT.
Librería requerida
Funcionalidad
El sketch realiza las siguientes tareas:
- Se conecta a la red WiFi especificada.
- Se conecta al broker MQTT especificado.
- Genera audio de ruido blanco usando la clase
WhiteNoiseGenerator
de la librería reSpeaker Lite. - Codifica los datos de audio como un archivo WAV usando la clase
WAVEncoder
. - Envía los datos de audio codificados al tópico MQTT especificado usando la clase
MqttClient
de la librería ArduinoMqttClient. - Mantiene la conexión MQTT llamando regularmente a la función
poll()
.
Código
Modifica las siguientes líneas del sketch para que coincidan con la configuración de tu red WiFi y broker MQTT:
const char* ssid = "SSID"; // Tu SSID de Wi-Fi
const char* password = "PASSWORD"; // Tu contraseña de Wi-Fi
const char* broker = "test.mosquitto.org";
const char* topic = "audio.wav";
int port = 1883;
Código
#include "WiFi.h"
#include "ArduinoMqttClient.h"
#include "AudioTools.h"
#define SIZE 1024
#define N 100
// Comunicación
const char* ssid = "SSID"; // Tu SSID de Wi-Fi
const char* password = "PASSWORD"; // Tu contraseña de Wi-Fi
const char* broker = "test.mosquitto.org";
const char* topic = "audio.wav";
int port = 1883;
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
// Audio
AudioInfo info(16000, 1, 32);
WhiteNoiseGenerator<int16_t> noise(32000); // Generador de ruido blanco con amplitud máxima de 32000
GeneratedSoundStream<int16_t> in_stream(noise); // Flujo generado desde el ruido
EncodedAudioStream out_stream(&mqttClient, new WAVEncoder()); // Codifica como archivo WAV
StreamCopy copier(out_stream, in_stream, SIZE); // Copia el audio al cliente MQTT
// Conexión WiFi
void connectWIFI() {
Serial.print("Conectando a la red Wi-Fi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
Serial.print("Conectando");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println("¡Conectado a la red Wi-Fi!");
Serial.println();
}
// Conexión al servidor MQTT
void connectMQTT() {
mqttClient.setId("reSpeaker");
Serial.print("Conectando al broker MQTT: ");
Serial.println(broker);
if (!mqttClient.connect(broker, port)) {
Serial.print("¡Conexión MQTT fallida! Código de error = ");
Serial.println(mqttClient.connectError());
stop();
}
Serial.println("¡Conectado al broker MQTT!");
Serial.println();
}
// Enviar audio al servidor MQTT
void sendMQTT() {
out_stream.begin(info);
mqttClient.beginMessage(topic, SIZE * N, true);
copier.copyN(N); // Copia 100 * 1024 bytes de audio
mqttClient.endMessage();
}
void setup() {
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
connectWIFI();
connectMQTT();
noise.begin(info);
in_stream.begin(info);
sendMQTT();
}
void loop() {
mqttClient.poll();
delay(10000);
}
Abre el Monitor Serial
para ver la salida y los registros:

Luego podrás visualizar los datos en tu servidor MQTT:

Personalización
Puedes personalizar la generación y codificación del audio modificando las siguientes líneas del sketch:
WhiteNoiseGenerator<int16_t> noise(32000);
GeneratedSoundStream<int16_t> in_stream(noise);
EncodedAudioStream out_stream(&mqttClient, new WAVEncoder());
WhiteNoiseGenerator
genera audio de ruido blanco con una amplitud máxima especificada.GeneratedSoundStream
crea un flujo de entrada a partir del audio generado.EncodedAudioStream
codifica los datos de audio utilizando el codificador especificado (WAV en este caso).
También puedes ajustar el tamaño de los datos de audio enviados modificando las constantes SIZE
y N
:
#define SIZE 1024
#define N 100
SIZE
representa el tamaño de cada bloque de datos de audio.N
representa la cantidad de bloques de datos de audio a enviar.