Compare commits

...

22 commits

Author SHA1 Message Date
ff1888538d Update Rust crate if-addrs to 0.11.0 2023-12-06 02:02:52 +01:00
c5eb1b5eff Merge pull request 'Update Rust crate tokio to 1.34.0' () from renovate/tokio-1.x into master
Reviewed-on: 
2023-11-11 08:26:02 +01:00
405b750482 Update Rust crate tokio to 1.34.0 2023-11-10 02:02:34 +01:00
e9df623c3b Merge pull request 'Update Rust crate serde_json to 1.0.108' () from renovate/serde_json-1.x into master
Reviewed-on: 
2023-10-31 11:18:00 +01:00
6dab56ba02 Update Rust crate serde_json to 1.0.108 2023-10-31 02:02:25 +01:00
9a2df58f5c Merge pull request 'Update Rust crate futures to 0.3.29' () from renovate/rust-futures-monorepo into master
Reviewed-on: 
2023-10-27 08:02:54 +02:00
33ea4ab4b6 Update Rust crate futures to 0.3.29 2023-10-27 02:02:45 +02:00
88d511daa3 Merge pull request 'Update Rust crate base64 to 0.21.5' () from renovate/base64-0.x into master
Reviewed-on: 
2023-10-25 07:46:20 +02:00
14a6cd23c6 Update Rust crate base64 to 0.21.5 2023-10-24 02:02:40 +02:00
f7709686e1 Merge pull request 'Update Rust crate num-derive to 0.4.1' () from renovate/num-derive-0.x into master
Reviewed-on: 
2023-10-10 06:26:20 +02:00
b824f76995 Merge pull request 'Update Rust crate tokio to 1.33.0' () from renovate/tokio-1.x into master
Reviewed-on: 
2023-10-10 06:26:09 +02:00
3db9029d00 Update Rust crate tokio to 1.33.0 2023-10-10 02:02:25 +02:00
3f595f5c3b Update Rust crate num-derive to 0.4.1 2023-10-10 02:02:22 +02:00
8ea4fc1aef Fix release build 2023-10-09 20:40:05 +02:00
f8fa859c29 Merge pull request 'Update Rust crate num-traits to 0.2.17' () from renovate/num-traits-0.x into master
Reviewed-on: 
2023-10-09 11:21:41 +02:00
56fe4beb2a Improve write test 2023-10-09 07:39:13 +02:00
2cf725b5aa Update Rust crate num-traits to 0.2.17 2023-10-08 02:02:35 +02:00
e614c2a753 Merge pull request 'Update Rust crate if-addrs to 0.10.2' () from renovate/if-addrs-0.x into master
Reviewed-on: 
2023-10-07 07:06:25 +02:00
502790823e Merge pull request 'Update Rust crate reqwest to 0.11.22' () from renovate/reqwest-0.x into master
Reviewed-on: 
2023-10-07 07:05:44 +02:00
613dc3c530 Merge pull request 'Update Rust crate sha2 to 0.10.8' () from renovate/sha2-0.x into master
Reviewed-on: 
2023-10-07 07:05:15 +02:00
07a23ab18d Update Rust crate sha2 to 0.10.8 2023-10-07 02:02:59 +02:00
9660de01aa Update Rust crate reqwest to 0.11.22 2023-10-07 02:02:41 +02:00
4 changed files with 102 additions and 36 deletions

View file

@ -7,22 +7,22 @@ edition = "2021"
[dependencies]
anyhow = { version = "1.0.75", features = ["backtrace"] }
if-addrs = "0.10.2"
if-addrs = "0.11.0"
rand = "0.8.5"
chrono = "0.4.31"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.107"
reqwest = "0.11.20"
tokio = { version = "1.32.0", features=["macros", "rt-multi-thread"] }
futures = "0.3.28"
serde_json = "1.0.108"
reqwest = "0.11.22"
tokio = { version = "1.34.0", features=["macros", "rt-multi-thread"] }
futures = "0.3.29"
serial_test = "2.0.0"
num-traits = "0.2.0"
num-derive = "0.4.0"
num-traits = "0.2.17"
num-derive = "0.4.1"
#crypto
cbc = { version = "0.1.2", features = ["alloc"] }
md5 = "0.7.0"
base64 = "0.21.4"
base64 = "0.21.5"
hmac = "0.12.1"
sha2 = "0.10.7"
sha2 = "0.10.8"
aes = "0.8.3"

View file

@ -2,6 +2,9 @@ use super::{body::Body, header::Header, Command, MessageType};
use std::ops::Deref;
pub trait RequestSerializer {
fn message_type(&self) -> MessageType;
fn body_type(&self) -> u8;
fn serialize(&self) -> Vec<u8>;
}
@ -36,6 +39,7 @@ impl CommandRequest {
body,
},
#[cfg(debug_assertions)]
name,
}
}
@ -65,6 +69,14 @@ impl RequestSerializer for CommandRequest {
stream
}
fn message_type(&self) -> MessageType {
self.header().message_type()
}
fn body_type(&self) -> u8 {
self.body().body_type()
}
}
pub struct CommandQuerySubtype {
@ -102,6 +114,14 @@ impl RequestSerializer for CommandQuerySubtype {
fn serialize(&self) -> Vec<u8> {
self.command.serialize()
}
fn message_type(&self) -> MessageType {
self.header().message_type()
}
fn body_type(&self) -> u8 {
self.body().body_type()
}
}
pub struct CommandQueryCustom {
@ -140,6 +160,14 @@ impl RequestSerializer for CommandQueryCustom {
fn serialize(&self) -> Vec<u8> {
self.command.serialize()
}
fn message_type(&self) -> MessageType {
self.header().message_type()
}
fn body_type(&self) -> u8 {
self.body().body_type()
}
}
pub struct CommandHeartbeat;
@ -148,4 +176,12 @@ impl RequestSerializer for CommandHeartbeat {
fn serialize(&self) -> Vec<u8> {
vec![0x00]
}
fn message_type(&self) -> MessageType {
MessageType::None
}
fn body_type(&self) -> u8 {
0
}
}

View file

@ -124,24 +124,22 @@ impl Device {
}
for cmd in cmds {
'sending: loop {
self.build_send(cmd.clone())?;
self.build_send(cmd.clone())?;
loop {
let mut buf = [0; 512];
let bytes_read = match self.socket.lock().unwrap().read(&mut buf) {
Ok(b) => b,
Err(_) => continue,
};
loop {
let mut buf = [0; 512];
let bytes_read = match self.socket.lock().unwrap().read(&mut buf) {
Ok(b) => b,
Err(_) => continue,
};
if bytes_read == 0 {
break;
}
if bytes_read == 0 {
break;
}
match self.parse_message(&buf[..bytes_read])? {
ParseMessage::Success => break 'sending,
ParseMessage::Padding => continue,
}
match self.parse_message(&buf[..bytes_read])? {
ParseMessage::Success => break,
ParseMessage::Padding => continue,
}
}
}
@ -226,7 +224,11 @@ impl Device {
fn send_message(&self, msg: &[u8]) -> Result<()> {
let data = self.security.encode_8370(msg, MsgType::ENCRYPTED_REQUEST)?;
self.socket.lock().unwrap().write(&data)?;
self.socket
.lock()
.unwrap()
.write(&data)
.context(format!("{msg:?}"))?;
Ok(())
}
@ -237,15 +239,26 @@ impl Device {
}
fn build_send(&self, cmd: impl RequestSerializer) -> Result<()> {
let message_type = cmd.message_type();
let body_type = cmd.body_type();
let data = PacketBuilder::builder(self.info.id, cmd).finalize(1);
self.send_message(&data)
Ok(self.send_message(&data).context(format!(
"message_type: {message_type:?}, body_type: {body_type}"
))?)
}
}
#[cfg(test)]
mod test {
use std::net::{Ipv4Addr, SocketAddr};
use std::{
net::{Ipv4Addr, SocketAddr},
sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
};
use anyhow::{Context, Result};
use futures::future::try_join;
@ -342,19 +355,29 @@ mod test {
addr: SocketAddr::new(std::net::IpAddr::V4(Ipv4Addr::new(192, 168, 178, 94)), 6444),
};
let mut device = Device::connect(device_info, token, key)
.await?
.register_update(|attributes| {
println!("{attributes:?}");
let power: Arc<AtomicBool> = Arc::new(AtomicBool::new(false));
Ok(())
let device = Device::connect(device_info, token, key)
.await?
.register_update({
let power = power.clone();
move |attributes| {
println!("{attributes:?}");
power.store(attributes["power"].bool(), Ordering::SeqCst);
Ok(())
}
});
device
.set_attribute("attribute", AttributeValue::Bool(false))
.set_attribute("power", AttributeValue::Bool(true))
.await?;
device.refresh_status().await?;
device
.set_attribute("power", AttributeValue::Bool(false))
.await?;
Ok(())
}

View file

@ -127,7 +127,7 @@ impl DeviceBackend for E1 {
cmd.request()
}
_ => todo!(),
_ => todo!("attribute: {attribute}"),
}
}
@ -148,7 +148,14 @@ impl CommandE1Base {
#[cfg(debug_assertions)] name: &'static str,
) -> Self {
Self {
command: CommandRequest::new(device_protocol_version, 0xE1, message_type, body, name),
command: CommandRequest::new(
device_protocol_version,
0xE1,
message_type,
body,
#[cfg(debug_assertions)]
name,
),
}
}
}