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="" 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 68eda3a..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"); - backend::setup(&config).await.expect("Setup backend error"); - mqtt::setup(&config).await.expect("Setup MQTT client 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() {