use std::{net::UdpSocket, time::Duration}; use anyhow::Result; use crate::{ security::{MsgType, Security}, DeviceInfo, }; pub struct Device { info: DeviceInfo, socket: UdpSocket, security: Security, } impl Device { pub fn connect(info: DeviceInfo) -> Result { let socket = UdpSocket::bind("0.0.0.0:0")?; socket.set_write_timeout(Some(Duration::from_secs(10)))?; socket.set_read_timeout(Some(Duration::from_secs(10)))?; socket.connect(info.addr)?; let mut me = Self { info, socket, security: Security::default(), }; if me.info.protocol == 3 { me.authenticate()?; } me.refresh_status()?; Ok(me) } fn authenticate(&mut self) -> Result<()> { let request = self.security.encode_8370(MsgType::HANDSHAKE_REQUEST)?; Ok(()) } pub fn refresh_status(&self) -> Result<()> { // Ok(()) } } #[cfg(test)] mod test { use anyhow::Result; use crate::{device::Device, Startup}; #[tokio::test] async fn connect() -> Result<()> { for device_info in Startup::discover().await? { Device::connect(device_info)?; } Ok(()) } }