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 4a06764..31594f5 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,7 +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 .next() @@ -230,11 +228,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, @@ -247,11 +241,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); @@ -286,20 +276,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, @@ -322,7 +322,7 @@ impl FleetProvisioner { .map_err(|_| EncodingError::BufferSize)?, }) }, - 1024, + csr.len() + 32, ); mqtt.publish(Publish { @@ -331,28 +331,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, @@ -365,8 +374,7 @@ impl FleetProvisioner { payload: b"", properties: embedded_mqtt::Properties::Slice(&[]), }) - .await - .map_err(|_| Error::Mqtt)?; + .await?; Ok(subscription) }