echonet-lite 0.1.6

Pure Rust ECHONET Lite implementation
Documentation
use echonet_lite as el;
use el::prelude::*;
use std::io;
use std::net::{Ipv4Addr, UdpSocket};
use std::time::Duration;

const EL_MULTICAST_ADDR: Ipv4Addr = Ipv4Addr::new(224, 0, 23, 0);

fn main() -> io::Result<()> {
    let socket = UdpSocket::bind("0.0.0.0:3610")?;
    socket.set_read_timeout(Some(Duration::from_secs(2)))?;
    socket.set_multicast_loop_v4(true)?;
    socket.join_multicast_v4(&EL_MULTICAST_ADDR, &[0, 0, 0, 0].into())?;

    let packet = el::ElPacketBuilder::new()
        .transaction_id(1)
        .seoj([0x05u8, 0xFFu8, 0x01u8])
        .deoj([0x0Eu8, 0xF0u8, 0x01u8])
        .esv(el::ServiceCode::Get)
        .props(el::props!([0x80, []]))
        .build();
    let bytes = packet.serialize().expect("fail to serialize");

    socket.send_to(&bytes, (EL_MULTICAST_ADDR, 3610))?;
    loop {
        let mut buffer = [0u8; 1024];
        match socket.recv_from(&mut buffer) {
            Err(_) => break,
            Ok((_, src_addr)) => {
                if let Ok((_, response)) = el::ElPacket::from_bytes(&buffer) {
                    if response.is_response_for(&packet) {
                        println!("got response from {src_addr}");
                        println!("{response}");
                    }
                }
            }
        }
    }

    Ok(())
}