use rumqtt; use rumqtt::LastWill; use rumqtt::MqttClient; use rumqtt::Notification; use rumqtt::Receiver; use rumqtt::{ConnectionMethod, MqttOptions, QoS, ReconnectOptions}; pub struct Mqtt { pub client: MqttClient, pub notifications: Receiver, } impl Mqtt { pub fn connect(host: &str, port: u16) -> Result { let last_will = LastWill { topic: format!("{}/status", crate::MQTT_ID), message: "disconnected".to_string(), qos: QoS::AtLeastOnce, retain: true, }; let options = MqttOptions::new(crate::MQTT_ID, host, port); let options = options .set_connection_method(ConnectionMethod::Tcp) .set_keep_alive(10) .set_last_will(last_will) .set_reconnect_opts(ReconnectOptions::Always(20)); match MqttClient::start(options) { Ok((mut client, notifications)) => { match client.publish( format!("{}/status", crate::MQTT_ID), QoS::AtLeastOnce, true, "connected", ) { Ok(()) => Ok(Mqtt { client, notifications, }), Err(conn_err) => Err(conn_err.to_string()), } } Err(conn_err) => Err(conn_err.to_string()), } } }