From f388f191b610c1a9e54f2d75e601b31d8e8f6116 Mon Sep 17 00:00:00 2001 From: Nicolas Juteau Date: Thu, 16 Jan 2025 13:37:58 -0500 Subject: [PATCH 1/3] proof of concept --- src/backend/mod.rs | 5 +++-- src/main.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 44a9175..822bea8 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -67,11 +67,12 @@ pub async fn setup(conf: &Configuration) -> Result<()> { } pub async fn get_gateway_id() -> Result { - if let Some(b) = BACKEND.get() { + /*if let Some(b) = BACKEND.get() { return b.get_gateway_id().await; } - Err(anyhow!("BACKEND is not set")) + Err(anyhow!("BACKEND is not set"))*/ + return Ok("008000000002226f".to_string()); } pub async fn send_downlink_frame(pl: &gw::DownlinkFrame) -> Result<()> { diff --git a/src/main.rs b/src/main.rs index 68eda3a..bd00fbe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,8 +56,8 @@ async fn main() { commands::setup(&config).expect("Setup commands error"); metadata::setup(&config).expect("Setup metadata error"); - backend::setup(&config).await.expect("Setup backend error"); mqtt::setup(&config).await.expect("Setup MQTT client error"); + backend::setup(&config).await.expect("Setup backend error"); let mut signals = Signals::new([SIGINT, SIGTERM]).unwrap(); signals.forever().next(); From ad6d231882e5476c9c810b36234b8051413e4cd8 Mon Sep 17 00:00:00 2001 From: Nicolas Juteau Date: Thu, 16 Jan 2025 15:05:37 -0500 Subject: [PATCH 2/3] added possibility to override gateway_id in config and use it to run mqtt loop before polling backend --- src/backend/mod.rs | 5 ++--- src/cmd/configfile.rs | 10 ++++++++++ src/config.rs | 15 +++++++++++++++ src/main.rs | 20 ++++++++++++++++++-- src/mqtt.rs | 14 +++++++++++++- 5 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 822bea8..44a9175 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -67,12 +67,11 @@ pub async fn setup(conf: &Configuration) -> Result<()> { } pub async fn get_gateway_id() -> Result { - /*if let Some(b) = BACKEND.get() { + if let Some(b) = BACKEND.get() { return b.get_gateway_id().await; } - Err(anyhow!("BACKEND is not set"))*/ - return Ok("008000000002226f".to_string()); + Err(anyhow!("BACKEND is not set")) } pub async fn send_downlink_frame(pl: &gw::DownlinkFrame) -> Result<()> { diff --git a/src/cmd/configfile.rs b/src/cmd/configfile.rs index d97211c..44cf1b5 100644 --- a/src/cmd/configfile.rs +++ b/src/cmd/configfile.rs @@ -238,6 +238,16 @@ pub fn run(config: &Configuration) { # On MQTT connection error. on_mqtt_connection_error=[] + + +# Gateway configuration +[gateway] + + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="{{ gateway.gateway_id }}" "#; let reg = Handlebars::new(); diff --git a/src/config.rs b/src/config.rs index 0b6d2f9..fd6138b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -14,6 +14,7 @@ pub struct Configuration { pub metadata: Metadata, pub commands: HashMap>, pub callbacks: Callbacks, + pub gateway: Gateway, } impl Configuration { @@ -176,3 +177,17 @@ pub struct Callbacks { pub on_mqtt_connected: Vec, pub on_mqtt_connection_error: Vec, } + +#[derive(Serialize, Deserialize)] +#[serde(default)] +pub struct Gateway { + pub gateway_id: Option, +} + +impl Default for Gateway { + fn default() -> Self { + Gateway { + gateway_id: None, + } + } +} diff --git a/src/main.rs b/src/main.rs index bd00fbe..38be404 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,8 +56,24 @@ async fn main() { commands::setup(&config).expect("Setup commands error"); metadata::setup(&config).expect("Setup metadata error"); - mqtt::setup(&config).await.expect("Setup MQTT client error"); - backend::setup(&config).await.expect("Setup backend error"); + + // Check for overriden gateway_id in config, in which case it will be used + // rather than waiting to fetch it from backend + if let Some(gateway_id) = &config.gateway.gateway_id { + if gateway_id.chars().count() == 0 { + panic!("overriden config gateway_id must not be an empty string"); + } + + info!("Gateway ID overriden in config, starting MQTT loop before polling for backend."); + + mqtt::setup(&config).await.expect("Setup MQTT client error"); + backend::setup(&config).await.expect("Setup backend error"); + } + else { + // poll for backend first to retrieve gateway_id + backend::setup(&config).await.expect("Setup backend error"); + mqtt::setup(&config).await.expect("Setup MQTT client error"); + } let mut signals = Signals::new([SIGINT, SIGTERM]).unwrap(); signals.forever().next(); diff --git a/src/mqtt.rs b/src/mqtt.rs index 2dbeb34..d169041 100644 --- a/src/mqtt.rs +++ b/src/mqtt.rs @@ -45,7 +45,19 @@ pub async fn setup(conf: &Configuration) -> Result<()> { }; // get gateway id - let gateway_id = get_gateway_id().await?; + let gateway_id = if let Some(gateway_id) = &conf.gateway.gateway_id { + // use gateway id overriden in config + gateway_id.clone() + } + else { + // fetch from backend + get_gateway_id().await? + }; + + info!( + "Gateway ID retrieved, gateway_id: {}", + gateway_id + ); // set client id let client_id = if conf.mqtt.client_id.is_empty() { From 46b344599fe14259e40e6649b820e1ba2ef1f718 Mon Sep 17 00:00:00 2001 From: Nicolas Juteau Date: Thu, 16 Jan 2025 15:06:03 -0500 Subject: [PATCH 3/3] added gateway section & gateway_id attribute in vendors toml, disabled by default --- .../dragino/mips_24kc/files/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../kerlink/klkgw/files/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../conduit/files/ap1/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../conduit/files/ap2/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../conduit_ap/files/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../conduit_ap3/files/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../rak/mipsel_24kc/files/chirpstack-mqtt-forwarder.toml | 7 +++++++ .../tektelic/kona/files/chirpstack-mqtt-forwarder.toml | 7 +++++++ 8 files changed, 56 insertions(+) diff --git a/packaging/vendor/dragino/mips_24kc/files/chirpstack-mqtt-forwarder.toml b/packaging/vendor/dragino/mips_24kc/files/chirpstack-mqtt-forwarder.toml index 80e257d..31f7cab 100644 --- a/packaging/vendor/dragino/mips_24kc/files/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/dragino/mips_24kc/files/chirpstack-mqtt-forwarder.toml @@ -19,3 +19,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/kerlink/klkgw/files/chirpstack-mqtt-forwarder.toml b/packaging/vendor/kerlink/klkgw/files/chirpstack-mqtt-forwarder.toml index 6d76421..9a2d939 100644 --- a/packaging/vendor/kerlink/klkgw/files/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/kerlink/klkgw/files/chirpstack-mqtt-forwarder.toml @@ -29,3 +29,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/multitech/conduit/files/ap1/chirpstack-mqtt-forwarder.toml b/packaging/vendor/multitech/conduit/files/ap1/chirpstack-mqtt-forwarder.toml index 853c7ef..aa362c0 100644 --- a/packaging/vendor/multitech/conduit/files/ap1/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/multitech/conduit/files/ap1/chirpstack-mqtt-forwarder.toml @@ -29,3 +29,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/multitech/conduit/files/ap2/chirpstack-mqtt-forwarder.toml b/packaging/vendor/multitech/conduit/files/ap2/chirpstack-mqtt-forwarder.toml index 5fcdc73..3e0ce4f 100644 --- a/packaging/vendor/multitech/conduit/files/ap2/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/multitech/conduit/files/ap2/chirpstack-mqtt-forwarder.toml @@ -29,3 +29,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/multitech/conduit_ap/files/chirpstack-mqtt-forwarder.toml b/packaging/vendor/multitech/conduit_ap/files/chirpstack-mqtt-forwarder.toml index 55526fd..74e8861 100644 --- a/packaging/vendor/multitech/conduit_ap/files/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/multitech/conduit_ap/files/chirpstack-mqtt-forwarder.toml @@ -29,3 +29,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/multitech/conduit_ap3/files/chirpstack-mqtt-forwarder.toml b/packaging/vendor/multitech/conduit_ap3/files/chirpstack-mqtt-forwarder.toml index 62710f7..36185c4 100644 --- a/packaging/vendor/multitech/conduit_ap3/files/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/multitech/conduit_ap3/files/chirpstack-mqtt-forwarder.toml @@ -29,3 +29,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/rak/mipsel_24kc/files/chirpstack-mqtt-forwarder.toml b/packaging/vendor/rak/mipsel_24kc/files/chirpstack-mqtt-forwarder.toml index 80e257d..31f7cab 100644 --- a/packaging/vendor/rak/mipsel_24kc/files/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/rak/mipsel_24kc/files/chirpstack-mqtt-forwarder.toml @@ -19,3 +19,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id="" diff --git a/packaging/vendor/tektelic/kona/files/chirpstack-mqtt-forwarder.toml b/packaging/vendor/tektelic/kona/files/chirpstack-mqtt-forwarder.toml index 80e257d..31f7cab 100644 --- a/packaging/vendor/tektelic/kona/files/chirpstack-mqtt-forwarder.toml +++ b/packaging/vendor/tektelic/kona/files/chirpstack-mqtt-forwarder.toml @@ -19,3 +19,10 @@ ca_cert="" tls_cert="" tls_key="" + +[gateway] + # Gateway ID. + # + # Only set this if you would like to override the Gateway ID fetched from the backend. + # This will allow the MQTT loop to start prior backend setup. + #gateway_id=""