Pular para o conteúdo principal

Transmissão de Áudio via MQTT

Este projeto demonstra como usar a placa reSpeaker Lite, que inclui um microcontrolador XIAO ESP32S3 integrado, para gerar e enviar dados de áudio para um broker MQTT.

Biblioteca Necessária

Funcionalidade

O sketch executa as seguintes tarefas:

  • Conecta à rede WiFi especificada.
  • Conecta ao broker MQTT especificado.
  • Gera áudio de ruído branco usando a classe WhiteNoiseGenerator da biblioteca reSpeaker Lite.
  • Codifica os dados de áudio como um arquivo WAV usando a classe WAVEncoder da biblioteca reSpeaker Lite.
  • Envia os dados de áudio codificados para o tópico MQTT especificado usando a classe MqttClient da biblioteca ArduinoMqttClient.
  • Mantém a conexão MQTT chamando regularmente a função poll().

Código

Modifique as seguintes linhas no sketch para corresponder às configurações da sua rede WiFi e do 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);
}

Abra o Serial Monitor para verificar a saída e os logs.

pir

Em seguida, você poderá ver os dados no seu servidor MQTT.

pir

Personalização

Você pode personalizar a geração e a codificação de áudio modificando as seguintes linhas no sketch:

WhiteNoiseGenerator<int16_t> noise(32000);
GeneratedSoundStream<int16_t> in_stream(noise);
EncodedAudioStream out_stream(&mqttClient, new WAVEncoder());
  • WhiteNoiseGenerator gera áudio de ruído branco com uma amplitude máxima especificada.
  • GeneratedSoundStream cria um fluxo de entrada a partir do áudio gerado.
  • EncodedAudioStream codifica os dados de áudio usando o codificador especificado (WAV neste caso).

Você também pode ajustar o tamanho dos dados de áudio enviados modificando as constantes SIZE e N:

#define SIZE 1024
#define N 100
  • SIZE representa o tamanho de cada bloco de dados de áudio.
  • N representa o número de blocos de dados de áudio a serem enviados.
Loading Comments...