Transmisión de Audio por MQTT
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.
Biblioteca 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 biblioteca reSpeaker Lite.
- Codifica los datos de audio como un archivo WAV usando la clase WAVEncoder de la biblioteca reSpeaker Lite.
- Envía los datos de audio codificados al tópico MQTT especificado usando la clase MqttClient de la biblioteca ArduinoMqttClient.
- Mantiene la conexión MQTT llamando regularmente a la función poll().
Código
Modifica las siguientes líneas en el sketch para que coincidan con tu configuración de WiFi y broker MQTT:
const char* ssid = "SSID"; // your Wi-FI SSID (name)
const char* password = "PASSWORD"; // your Wi-Fi password (use for WPA, or use as key for WEP)
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
// Communication
const char* ssid = "SSID"; // your Wi-FI SSID (name)
const char* password = "PASSWORD"; // your Wi-Fi password (use for WPA, or use as key for WEP)
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); // subclass of SoundGenerator with max amplitude of 32000
GeneratedSoundStream<int16_t> in_stream(noise); // Stream generated from noise
EncodedAudioStream out_stream(&mqttClient, new WAVEncoder()); // encode as wav file
StreamCopy copier(out_stream, in_stream, SIZE); // copies sound to MQTT client
// Connect to Wifi
void connectWIFI() {
// attempt to connect to WiFi network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println("You're connected to the network");
Serial.println();
}
// Connect to MQTT Server
void connectMQTT() {
// You can provide a unique client ID, if not set the library uses Arduino-millis()
// Each client must have a unique client ID
mqttClient.setId("reSpeaker");
// You can provide a username and password for authentication
// mqttClient.setUsernamePassword("username", "password");
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.println(broker);
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
stop();
}
Serial.println("You're connected to the MQTT broker!");
Serial.println();
}
// Send audio to MQTT Server
void sendMQTT() {
// make sure that we write wav header
out_stream.begin(info);
// send message, the Print interface can be used to set the message contents
mqttClient.beginMessage(topic, SIZE * N, true);
// copy audio data to mqtt: 100 * 1024 bytes
copier.copyN(N);
mqttClient.endMessage();
}
void setup() {
// Initialize logger
Serial.begin(115200);
AudioLogger::instance().begin(Serial, AudioLogger::Info);
// connect
connectWIFI();
connectMQTT();
// setup audio
noise.begin(info);
in_stream.begin(info);
// send Audio
sendMQTT();
}
void loop() {
// call poll() regularly to allow the library to send MQTT keep alives which
// avoids being disconnected by the broker
mqttClient.poll();
delay(10000);
}
Abre el Monitor Serie
para verificar la salida y los registros.
Luego puedes ver los datos en tu servidor MQTT.
Personalización
Puedes personalizar la generación y codificación de audio modificando las siguientes líneas en el 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 usando el codificador especificado (WAV en este caso).
También puedes ajustar el tamaño de los datos de audio que se envían modificando las constantes SIZE y N:
#define SIZE 1024
#define N 100
SIZE
representa el tamaño de cada fragmento de datos de audio.N
representa el número de fragmentos de datos de audio a enviar.