diff --git a/crates/core/src/bc_protocol/connection/discovery.rs b/crates/core/src/bc_protocol/connection/discovery.rs index 8c5434ab..4788b8f5 100644 --- a/crates/core/src/bc_protocol/connection/discovery.rs +++ b/crates/core/src/bc_protocol/connection/discovery.rs @@ -421,19 +421,24 @@ impl Discoverer { }), }; trace!("Sending look up {:?}", msg); - let (packet, _) = self + let (reg, relay, _) = self .retry_send(msg, addr, |bc, addr| match bc { UdpDiscovery { tid: _, - payload: UdpXml::M2cQr(m2c_q_r), - } if valid_addr(&m2c_q_r.reg) => Some((m2c_q_r, addr)), + payload: + UdpXml::M2cQr(M2cQr { + reg: Some(reg), + relay: Some(relay), + .. + }), + } if valid_addr(®) && valid_addr(&relay) => Some((reg, relay, addr)), _ => None, }) .await?; trace!("Look up complete"); Ok(UidLookupResults { - reg: SocketAddr::new(packet.reg.ip.parse()?, packet.reg.port), - relay: SocketAddr::new(packet.relay.ip.parse()?, packet.relay.port), + reg: SocketAddr::new(reg.ip.parse()?, reg.port), + relay: SocketAddr::new(relay.ip.parse()?, relay.port), }) } @@ -489,14 +494,15 @@ impl Discoverer { dmap, dev, relay, - sid, + sid: Some(sid), rsp, .. }), } if (dev.as_ref().map(valid_addr).unwrap_or(false) || dmap.as_ref().map(valid_addr).unwrap_or(false) || relay.as_ref().map(valid_addr).unwrap_or(false)) - && rsp != -1 => + && rsp != -1 + && rsp != -3 => { Some(Ok((sid, dev, dmap, relay))) } @@ -544,7 +550,7 @@ impl Discoverer { } if (dev.as_ref().map(valid_addr).unwrap_or(false) || dmap.as_ref().map(valid_addr).unwrap_or(false) || relay.as_ref().map(valid_addr).unwrap_or(false)) - && rsp == -1 => + && (rsp == -1 || rsp == -3) => { Some(Err(Error::RegisterError)) } diff --git a/crates/core/src/bcudp/xml.rs b/crates/core/src/bcudp/xml.rs index b60dead6..397e707c 100644 --- a/crates/core/src/bcudp/xml.rs +++ b/crates/core/src/bcudp/xml.rs @@ -146,7 +146,7 @@ pub struct ClientList { pub struct D2cCr { /// Called timer but not sure what it is a timer of pub timer: Timer, - /// Unknown + /// Unknown seems to be 0 on success and -3 on fail pub rsp: u32, /// Client ID pub cid: i32, @@ -237,13 +237,17 @@ pub struct C2mQ { #[derive(PartialEq, Eq, Default, Debug, Deserialize, Serialize, Clone)] pub struct M2cQr { /// The register server location - pub reg: IpPort, + #[serde(skip_serializing_if = "Option::is_none")] + pub reg: Option, /// The relay server location - pub relay: IpPort, + #[serde(skip_serializing_if = "Option::is_none")] + pub relay: Option, /// The log server location - pub log: IpPort, + #[serde(skip_serializing_if = "Option::is_none")] + pub log: Option, /// The camera location - pub t: IpPort, + #[serde(skip_serializing_if = "Option::is_none")] + pub t: Option, } /// Used as part of M2C_Q_R to provide the host and port @@ -328,11 +332,14 @@ pub struct R2cCr { /// The location of the relay #[serde(skip_serializing_if = "Option::is_none")] pub relay: Option, + /// The location of the relayt (not sure what the t is for) + #[serde(skip_serializing_if = "Option::is_none")] + pub relayt: Option, /// The nat type. Known values `"NULL"` pub nat: String, - /// The camera SID - pub sid: u32, - /// rsp. Known values `0` + /// The camera SID, missing when rsp is `-3` + pub sid: Option, + /// rsp. Known values `0`, `-3, seems to be 0 on success and -3 on fail` pub rsp: i32, /// ac. Known values. `127536491` pub ac: u32, @@ -347,7 +354,7 @@ pub struct D2cCfm { pub sid: u32, /// Type of connection observed values are `"local"` pub conn: String, - /// Unknown known values are `0` + /// Unknown known values are `0`, `-3, seems to be 0 on success and -3 on fail` pub rsp: u32, /// The client connection ID pub cid: i32, @@ -366,7 +373,7 @@ pub struct C2rCfm { pub sid: u32, /// Type of connection observed values are `"local"` pub conn: String, - /// Unknown known values are `0` + /// Unknown known values are `0`, `-3, seems to be 0 on success and -3 on fail` pub rsp: u32, /// The client connection ID pub cid: i32,