mod common;
use mqttrust::{Mqtt, QoS, SubscribeTopic};
use mqttrust_core::bbqueue::BBBuffer;
use mqttrust_core::{EventLoop, MqttOptions, Notification};
use common::clock::SysClock;
use common::network::Network;
use native_tls::TlsConnector;
use std::sync::Arc;
use std::thread;
use crate::common::credentials;
static mut Q: BBBuffer<{ 1024 * 6 }> = BBBuffer::new();
fn main() {
env_logger::init();
let (p, c) = unsafe { Q.try_split_framed().unwrap() };
let hostname = credentials::HOSTNAME.unwrap();
let connector = TlsConnector::builder()
.identity(credentials::identity())
.add_root_certificate(credentials::root_ca())
.build()
.unwrap();
let mut network = Network::new_tls(connector, String::from(hostname));
let thing_name = "mqttrust";
let mut mqtt_eventloop = EventLoop::new(
c,
SysClock::new(),
MqttOptions::new(thing_name, hostname.into(), 8883),
);
let mqtt_client = mqttrust_core::Client::new(p, thing_name);
thread::Builder::new()
.name("eventloop".to_string())
.spawn(move || loop {
match nb::block!(mqtt_eventloop.connect(&mut network)) {
Err(_) => continue,
Ok(true) => {
log::info!("Successfully connected to broker");
}
Ok(false) => {}
}
match mqtt_eventloop.yield_event(&mut network) {
Ok(Notification::Publish(_)) => {}
Ok(n) => {
log::trace!("{:?}", n);
}
_ => {}
}
})
.unwrap();
loop {
thread::sleep(std::time::Duration::from_millis(5000));
mqtt_client
.subscribe(&[SubscribeTopic {
topic_path: format!("{}/device/advisor", thing_name).as_str(),
qos: QoS::AtLeastOnce,
}])
.unwrap();
mqtt_client
.publish(
format!("{}/device/advisor/hello", thing_name).as_str(),
format!("Hello from {}", thing_name).as_bytes(),
QoS::AtLeastOnce,
)
.unwrap();
}
}