From d6d4af3256a6638f30ff564545be8b0ec3999ad7 Mon Sep 17 00:00:00 2001 From: Mathias Date: Fri, 19 Jul 2024 11:08:21 +0200 Subject: [PATCH 1/2] Fix provisioning topic resulting in status code 143, by subscribing to individual accepted and rejected topic for now --- src/provisioning/error.rs | 12 +++++- src/provisioning/mod.rs | 86 ++++++++++++++++++++++----------------- 2 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/provisioning/error.rs b/src/provisioning/error.rs index deb5725..67f4696 100644 --- a/src/provisioning/error.rs +++ b/src/provisioning/error.rs @@ -1,10 +1,12 @@ #[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] + pub enum Error { Overflow, InvalidPayload, InvalidState, - Mqtt, - DeserializeJson(serde_json_core::de::Error), + Mqtt(embedded_mqtt::Error), + DeserializeJson(#[cfg_attr(feature = "defmt", defmt(Debug2Format))] serde_json_core::de::Error), DeserializeCbor, CertificateStorage, Response(u16), @@ -27,3 +29,9 @@ impl From for Error { Self::DeserializeCbor } } + +impl From for Error { + fn from(e: embedded_mqtt::Error) -> Self { + Self::Mqtt(e) + } +} diff --git a/src/provisioning/mod.rs b/src/provisioning/mod.rs index 57e1ef5..b334fca 100644 --- a/src/provisioning/mod.rs +++ b/src/provisioning/mod.rs @@ -232,11 +232,7 @@ impl FleetProvisioner { retain_as_published: false, retain_handling: RetainHandling::SendAtSubscribeTime, }])) - .await - .map_err(|e| { - error!("Failed subscription to RegisterThingAny! {:?}", e); - Error::Mqtt - })?; + .await?; mqtt.publish(Publish { dup: false, @@ -249,11 +245,7 @@ impl FleetProvisioner { payload, properties: embedded_mqtt::Properties::Slice(&[]), }) - .await - .map_err(|e| { - error!("Failed publish to RegisterThing! {:?}", e); - Error::Mqtt - })?; + .await?; drop(message); drop(create_subscription); @@ -288,20 +280,30 @@ impl FleetProvisioner { mqtt: &'b embedded_mqtt::MqttClient<'a, M, SUBS>, csr: Option<&str>, payload_format: PayloadFormat, - ) -> Result, Error> { + ) -> Result, Error> { if let Some(csr) = csr { let subscription = mqtt - .subscribe::<1>(Subscribe::new(&[SubscribeTopic { - topic_path: Topic::CreateCertificateFromCsrAccepted(payload_format) - .format::<47>()? - .as_str(), - maximum_qos: QoS::AtLeastOnce, - no_local: false, - retain_as_published: false, - retain_handling: RetainHandling::SendAtSubscribeTime, - }])) - .await - .map_err(|_| Error::Mqtt)?; + .subscribe(Subscribe::new(&[ + SubscribeTopic { + topic_path: Topic::CreateCertificateFromCsrRejected(payload_format) + .format::<47>()? + .as_str(), + maximum_qos: QoS::AtLeastOnce, + no_local: false, + retain_as_published: false, + retain_handling: RetainHandling::SendAtSubscribeTime, + }, + SubscribeTopic { + topic_path: Topic::CreateCertificateFromCsrAccepted(payload_format) + .format::<47>()? + .as_str(), + maximum_qos: QoS::AtLeastOnce, + no_local: false, + retain_as_published: false, + retain_handling: RetainHandling::SendAtSubscribeTime, + }, + ])) + .await?; let request = CreateCertificateFromCsrRequest { certificate_signing_request: csr, @@ -333,28 +335,37 @@ impl FleetProvisioner { retain: false, pid: None, topic_name: Topic::CreateCertificateFromCsr(payload_format) - .format::<38>()? + .format::<40>()? .as_str(), payload, properties: embedded_mqtt::Properties::Slice(&[]), }) - .await - .map_err(|_| Error::Mqtt)?; + .await?; Ok(subscription) } else { let subscription = mqtt - .subscribe::<1>(Subscribe::new(&[SubscribeTopic { - topic_path: Topic::CreateKeysAndCertificateAny(payload_format) - .format::<31>()? - .as_str(), - maximum_qos: QoS::AtLeastOnce, - no_local: false, - retain_as_published: false, - retain_handling: RetainHandling::SendAtSubscribeTime, - }])) - .await - .map_err(|_| Error::Mqtt)?; + .subscribe(Subscribe::new(&[ + SubscribeTopic { + topic_path: Topic::CreateKeysAndCertificateAccepted(payload_format) + .format::<38>()? + .as_str(), + maximum_qos: QoS::AtLeastOnce, + no_local: false, + retain_as_published: false, + retain_handling: RetainHandling::SendAtSubscribeTime, + }, + SubscribeTopic { + topic_path: Topic::CreateKeysAndCertificateRejected(payload_format) + .format::<38>()? + .as_str(), + maximum_qos: QoS::AtLeastOnce, + no_local: false, + retain_as_published: false, + retain_handling: RetainHandling::SendAtSubscribeTime, + }, + ])) + .await?; mqtt.publish(Publish { dup: false, @@ -367,8 +378,7 @@ impl FleetProvisioner { payload: b"", properties: embedded_mqtt::Properties::Slice(&[]), }) - .await - .map_err(|_| Error::Mqtt)?; + .await?; Ok(subscription) } From f42460845bfbab7c610174413251560edc18cd8a Mon Sep 17 00:00:00 2001 From: Mathias Date: Fri, 19 Jul 2024 12:57:08 +0200 Subject: [PATCH 2/2] Reduce the overhead of of CreateCertificateFromCsr buffer size --- src/provisioning/mod.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/provisioning/mod.rs b/src/provisioning/mod.rs index b334fca..dbeefe5 100644 --- a/src/provisioning/mod.rs +++ b/src/provisioning/mod.rs @@ -10,14 +10,13 @@ use embedded_mqtt::{ SubscribeTopic, Subscription, }; use futures::StreamExt; -use serde::Serialize; -use serde::{de::DeserializeOwned, Deserialize}; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use error::Error; -use self::data_types::CreateCertificateFromCsrRequest; use self::{ data_types::{ + CreateCertificateFromCsrRequest, CreateCertificateFromCsrResponse, CreateKeysAndCertificateResponse, ErrorResponse, RegisterThingRequest, RegisterThingResponse, }, @@ -137,8 +136,6 @@ impl FleetProvisioner { where C: DeserializeOwned, { - use crate::provisioning::data_types::CreateCertificateFromCsrResponse; - let mut create_subscription = Self::begin(mqtt, csr, payload_format).await?; let mut message = create_subscription @@ -326,7 +323,7 @@ impl FleetProvisioner { .map_err(|_| EncodingError::BufferSize)?, }) }, - 1024, + csr.len() + 32, ); mqtt.publish(Publish {