From: Scott Worley Date: Tue, 10 Oct 2023 22:34:58 +0000 (-0700) Subject: server: Parse messages X-Git-Tag: v0.1.0~16 X-Git-Url: http://git.scottworley.com/tattlekey/commitdiff_plain/143d53ed1d795c5c5f6e0773ab3c71700d3ef9a0?ds=sidebyside server: Parse messages --- diff --git a/server/src/main.rs b/server/src/main.rs index 0d4377a..c4c0b19 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -18,6 +18,41 @@ use std::net::UdpSocket; const MESSAGE_SIZE: usize = 12; +#[derive(Debug)] +struct MessageKey { + epoch: u32, + device: u16, + seq: u16, +} + +#[derive(Debug)] +struct Message { + key: MessageKey, + ago: u32, +} + +impl From<&[u8; MESSAGE_SIZE]> for Message { + fn from(value: &[u8; MESSAGE_SIZE]) -> Self { + Self { + key: MessageKey { + epoch: u32::from_be_bytes(value[0..=3].try_into().expect("I can't count")), + device: u16::from_be_bytes(value[4..=5].try_into().expect("I can't count")), + seq: u16::from_be_bytes(value[6..=7].try_into().expect("I can't count")), + }, + ago: u32::from_be_bytes(value[8..=11].try_into().expect("I can't count")), + } + } +} +impl TryFrom<&[u8]> for Message { + type Error = std::array::TryFromSliceError; + fn try_from(value: &[u8]) -> Result { + match <[u8; MESSAGE_SIZE]>::try_from(value) { + Ok(correct_size) => Ok(Message::from(&correct_size)), + Err(e) => Err(e), + } + } +} + fn main() { let socket = UdpSocket::bind("0.0.0.0:29803").expect("couldn't bind to address"); loop { @@ -25,12 +60,13 @@ fn main() { match socket.recv_from(&mut buf) { Err(e) => eprintln!("Didn't receive data: {e}"), Ok((number_of_bytes, src_addr)) => { - let filled_buf = &mut buf[..number_of_bytes]; + let filled_buf = &buf[..number_of_bytes]; if number_of_bytes != MESSAGE_SIZE { eprintln!("Ignoring short message ({number_of_bytes}) from {src_addr}"); continue; } - println!("Got packet from {src_addr}: {filled_buf:?}"); + let message = Message::try_from(filled_buf).expect("I can't count"); + println!("Got packet from {src_addr}: {message:?}"); } } }