113 lines
3 KiB
Arduino
113 lines
3 KiB
Arduino
|
|
/**
|
|||
|
|
* @file communication-mqtt-send.ino
|
|||
|
|
* @author Phil Schatzmann
|
|||
|
|
* @brief Send Audio File to MQTT.
|
|||
|
|
* I am using the ArduinoMQTTClient library from Arduino provided by the library manager.
|
|||
|
|
* We can just copy the audio data to the MQTT client!
|
|||
|
|
* @version 0.1
|
|||
|
|
* @date 2023-09-07
|
|||
|
|
*
|
|||
|
|
* @copyright Copyright (c) 2023
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "WiFi.h"
|
|||
|
|
#include "ArduinoMqttClient.h"
|
|||
|
|
#include "AudioTools.h"
|
|||
|
|
|
|||
|
|
#define SIZE 1024
|
|||
|
|
#define N 100
|
|||
|
|
|
|||
|
|
// Communication
|
|||
|
|
const char* ssid = "SSID"; // your network SSID (name)
|
|||
|
|
const char* password = "PASSWORD"; // your network 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(8000, 1, 16);
|
|||
|
|
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("AudioTools");
|
|||
|
|
|
|||
|
|
// 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);
|
|||
|
|
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::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(1000);
|
|||
|
|
}
|