start writing
This commit is contained in:
commit
77da7cabd5
8 changed files with 2023 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/target
|
||||
**/*.rs.bk
|
||||
/.vscode
|
1893
Cargo.lock
generated
Normal file
1893
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "lifx-mqtt-bridge"
|
||||
version = "0.1.0"
|
||||
authors = ["Lara <git@lara.uber.space>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
lifxi = "0.1"
|
||||
rumqtt = { git = "https://github.com/AtherEnergy/rumqtt" }
|
||||
clap = "2.32"
|
9
src/lamp_lifx.rs
Normal file
9
src/lamp_lifx.rs
Normal file
|
@ -0,0 +1,9 @@
|
|||
use lifxi;
|
||||
|
||||
pub struct LampLifx {}
|
||||
|
||||
impl LampLifx {
|
||||
fn new() -> Self {
|
||||
unimplemented!()
|
||||
}
|
||||
}
|
7
src/lamp_mqtt.rs
Normal file
7
src/lamp_mqtt.rs
Normal file
|
@ -0,0 +1,7 @@
|
|||
pub struct LampMqtt {}
|
||||
|
||||
impl LampMqtt {
|
||||
fn new() -> Self {
|
||||
LampMqtt {}
|
||||
}
|
||||
}
|
1
src/lifx_discover.rs
Normal file
1
src/lifx_discover.rs
Normal file
|
@ -0,0 +1 @@
|
|||
use lifxi;
|
54
src/main.rs
Normal file
54
src/main.rs
Normal file
|
@ -0,0 +1,54 @@
|
|||
extern crate clap;
|
||||
|
||||
mod lamp_lifx;
|
||||
mod lamp_mqtt;
|
||||
mod lifx_discover;
|
||||
mod mqtt_connection;
|
||||
|
||||
use crate::mqtt_connection::Mqtt;
|
||||
use clap::App;
|
||||
use clap::Arg;
|
||||
|
||||
pub const MQTT_ID: &str = "lifx-mqtt-bridge";
|
||||
|
||||
fn main() {
|
||||
let matches = App::new("lifx-mqtt-bridge")
|
||||
.version("0.1")
|
||||
.about("Lifx Mqtt Bridge")
|
||||
.author("Buntpfotenkätzchen")
|
||||
.arg(
|
||||
Arg::with_name("host")
|
||||
.short("h")
|
||||
.long("host")
|
||||
.required(true)
|
||||
.takes_value(true),
|
||||
)
|
||||
.arg(
|
||||
Arg::with_name("port")
|
||||
.short("p")
|
||||
.long("port")
|
||||
.takes_value(true)
|
||||
.default_value("1883"),
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
let host = matches.value_of("host").unwrap();
|
||||
let port: u16 = matches.value_of("port").unwrap().parse().unwrap();
|
||||
println!("Connecting to {}:{}", host, port);
|
||||
|
||||
let mut mqtt = match Mqtt::connect(host, port) {
|
||||
Ok(mqtt) => mqtt,
|
||||
Err(err) => panic!("Error connecting: {}", err),
|
||||
};
|
||||
loop {
|
||||
match mqtt.notifications.recv() {
|
||||
Ok(notification) => {
|
||||
println!("MQTT notification received: {:#?}", notification);
|
||||
}
|
||||
Err(recv_error) => {
|
||||
println!("MQTT channel closed: {}", recv_error);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
46
src/mqtt_connection.rs
Normal file
46
src/mqtt_connection.rs
Normal file
|
@ -0,0 +1,46 @@
|
|||
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()),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue