68 lines
1.3 KiB
Rust
68 lines
1.3 KiB
Rust
|
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<Self> {
|
||
|
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(())
|
||
|
}
|
||
|
}
|