47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
|
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<Notification>,
|
||
|
}
|
||
|
|
||
|
impl Mqtt {
|
||
|
pub fn connect(host: &str, port: u16) -> Result<Self, String> {
|
||
|
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()),
|
||
|
}
|
||
|
}
|
||
|
}
|