Initial commit based on rumqttc example
commit
c63072715d
|
@ -0,0 +1 @@
|
||||||
|
/target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,12 @@
|
||||||
|
[package]
|
||||||
|
name = "modbus-mqtt"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = { version = "3.2.12", features = ["derive", "env"] }
|
||||||
|
rumqttc = { version = "0.13.0", features = ["url"], git = "https://github.com/bytebeamio/rumqtt" }
|
||||||
|
tokio = { version = "1.20.0", features = ["rt", "rt-multi-thread"] }
|
||||||
|
tokio-modbus = "0.5.3"
|
|
@ -0,0 +1,63 @@
|
||||||
|
use rumqttc::{self, AsyncClient, MqttOptions, QoS};
|
||||||
|
use std::error::Error;
|
||||||
|
use std::time::Duration;
|
||||||
|
use tokio::{task, time};
|
||||||
|
|
||||||
|
use clap::Parser;
|
||||||
|
|
||||||
|
#[derive(Parser)]
|
||||||
|
struct Cli {
|
||||||
|
mqtt_host: String,
|
||||||
|
|
||||||
|
#[clap(short = 'n', long, default_value = "modbus")]
|
||||||
|
mqtt_name: String,
|
||||||
|
|
||||||
|
#[clap(short = 'p', long, default_value_t = 1883)]
|
||||||
|
mqtt_port: u16,
|
||||||
|
|
||||||
|
#[clap(short = 'u', long, env = "MQTT_USER")]
|
||||||
|
mqtt_user: Option<String>,
|
||||||
|
|
||||||
|
#[clap(short = 'P', long, env)]
|
||||||
|
mqtt_password: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main(worker_threads = 1)]
|
||||||
|
async fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
let args = Cli::parse();
|
||||||
|
|
||||||
|
let mut mqttoptions = MqttOptions::new("mqtt", args.mqtt_host.as_str(), args.mqtt_port);
|
||||||
|
if let (Some(u), Some(p)) = (args.mqtt_user, args.mqtt_password) {
|
||||||
|
mqttoptions.set_credentials(u, p);
|
||||||
|
}
|
||||||
|
mqttoptions.set_keep_alive(Duration::from_secs(5));
|
||||||
|
|
||||||
|
let (client, mut eventloop) = AsyncClient::new(mqttoptions, 10);
|
||||||
|
task::spawn(async move {
|
||||||
|
requests(client).await;
|
||||||
|
time::sleep(Duration::from_secs(3)).await;
|
||||||
|
});
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let event = eventloop.poll().await;
|
||||||
|
println!("{:?}", event.unwrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn requests(client: AsyncClient) {
|
||||||
|
client
|
||||||
|
.subscribe("hello/world", QoS::AtMostOnce)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
for i in 1..=10 {
|
||||||
|
client
|
||||||
|
.publish("hello/world", QoS::ExactlyOnce, false, vec![1; i])
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
time::sleep(Duration::from_secs(1)).await;
|
||||||
|
}
|
||||||
|
|
||||||
|
time::sleep(Duration::from_secs(120)).await;
|
||||||
|
}
|
Loading…
Reference in New Issue