#![no_std]
#![no_main]
use defmt_rtt as _;
use panic_probe as _;
use embassy_executor::Spawner;
use embassy_time::Timer;
use mqtt_async_embedded::{MqttClient, MqttOptions};
struct FakeAsyncUart;
impl embedded_hal_async::serial::Write for FakeAsyncUart {
async fn write(&mut self, _buf: &[u8]) -> Result<(), Self::Error> {
Ok(())
}
async fn flush(&mut self) -> Result<(), Self::Error> {
Ok(())
}
}
impl embedded_hal_async::serial::Read for FakeAsyncUart {
async fn read(&mut self, buf: &mut [u8]) -> Result<(), Self::Error> {
buf[0] = b'O';
buf[1] = b'K';
Ok(())
}
}
#[derive(Debug)]
struct FakeUartError;
impl embedded_hal::serial::Error for FakeUartError {
fn kind(&self) -> embedded_hal::serial::ErrorKind {
embedded_hal::serial::ErrorKind::Other
}
}
impl embedded_hal::digital::Error for FakeUartError {
fn kind(&self) -> embedded_hal::digital::ErrorKind {
embedded_hal::digital::ErrorKind::Other
}
}
impl embedded_hal::serial::ErrorType for FakeAsyncUart {
type Error = FakeUartError;
}
use mqtt_async_embedded::transport::{MqttTransport, TransportError};
struct AtCommandTransport<UART> {
uart: UART,
}
#[derive(Debug)]
struct AtError;
impl TransportError for AtError {}
impl<UART: embedded_hal_async::serial::Read + embedded_hal_async::serial::Write> MqttTransport
for AtCommandTransport<UART>
{
type Error = AtError;
async fn send(&mut self, _buf: &[u8]) -> Result<(), Self::Error> {
defmt::info!("AT Transport: Sending data...");
Timer::after_millis(100).await;
Ok(())
}
async fn recv<'a>(&mut self, _buf: &'a mut [u8]) -> Result<usize, Self::Error> {
defmt::info!("AT Transport: Receiving data...");
Timer::after_millis(500).await;
_buf[0] = 0x20;
_buf[1] = 0x02;
_buf[2] = 0x00;
_buf[3] = 0x00;
Ok(4)
}
}
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
defmt::info!("Starting ESP8266 UART example...");
let fake_uart = FakeAsyncUart;
let transport = AtCommandTransport { uart: fake_uart };
let options = MqttOptions::new("esp8266-device");
let mut client = MqttClient::new(transport, options);
defmt::info!("Connecting via AT transport...");
match client.connect().await {
Ok(_) => defmt::info!("MQTT Connected!"),
Err(e) => defmt::error!("MQTT Connection Error: {:?}", e),
}
}