diff --git a/README.md b/README.md index b949a27..191e878 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Very rough for now. ## Topic spec ``` -prefix/status -> { "status": "running" } # last-will message here? +prefix/status -> { "status": "running" } # last-will message here too prefix/connect/ <- { "host": "localhost", diff --git a/src/main.rs b/src/main.rs index 2aba662..0f9c41a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,7 @@ -use rumqttc::{self, AsyncClient, Event, Incoming, MqttOptions, Publish, QoS}; +use rumqttc::{self, AsyncClient, Event, Incoming, LastWill, MqttOptions, Publish, QoS}; use serde::{Deserialize, Serialize}; -// use serde_json::Result; -use std::error::Error; +use serde_json::json; use std::time::Duration; -use tokio::{task, time}; use tokio_modbus::prelude::*; use clap::Parser; @@ -76,6 +74,13 @@ struct ConnectStatus { status: ConnectState, } +#[derive(Serialize)] +#[serde(rename_all = "lowercase")] +enum MainStatus { + Running, + Stopped, +} + #[tokio::main(worker_threads = 1)] async fn main() { let args = Cli::parse(); @@ -85,18 +90,39 @@ async fn main() { mqttoptions.set_credentials(u, p); } mqttoptions.set_keep_alive(Duration::from_secs(5)); + mqttoptions.set_last_will(LastWill { + topic: format!("{}/status", args.mqtt_topic_prefix).to_string(), + message: serde_json::to_vec(&json!({ + "status": MainStatus::Stopped, + })) + .unwrap() + .into(), + qos: QoS::AtMostOnce, + retain: false, + }); let (client, mut eventloop) = AsyncClient::new(mqttoptions, 10); client - .subscribe(format!("{}/#", args.mqtt_topic_prefix), QoS::AtMostOnce) + .subscribe( + format!("{}/connect/#", args.mqtt_topic_prefix), + QoS::AtMostOnce, + ) .await .unwrap(); - // let socket_addr = "10.10.10.219:502".parse().unwrap(); - // let mut modbus = tcp::connect_slave(socket_addr, Slave(0x01)).await.unwrap(); - // let data = modbus.read_input_registers(5017, 2).await.unwrap(); - // println!("Response is '{:#06x?}'", data); + client + .publish( + format!("{}/status", args.mqtt_topic_prefix).to_string(), + QoS::AtMostOnce, + false, + serde_json::to_vec(&json!({ + "status": MainStatus::Running, + })) + .unwrap(), + ) + .await + .unwrap(); while let Ok(event) = eventloop.poll().await { match event { @@ -147,7 +173,6 @@ async fn main() { .unwrap(); } Err(err) => { - use serde_json::json; client .publish( format!("{}/status/{}", args.mqtt_topic_prefix, conn_name)