find/
find.rs

1use echonet_lite as el;
2use el::prelude::*;
3use std::io;
4use std::net::{Ipv4Addr, UdpSocket};
5use std::time::Duration;
6
7const EL_MULTICAST_ADDR: Ipv4Addr = Ipv4Addr::new(224, 0, 23, 0);
8
9fn main() -> io::Result<()> {
10    let socket = UdpSocket::bind("0.0.0.0:3610")?;
11    socket.set_read_timeout(Some(Duration::from_secs(2)))?;
12    socket.set_multicast_loop_v4(true)?;
13    socket.join_multicast_v4(&EL_MULTICAST_ADDR, &[0, 0, 0, 0].into())?;
14
15    let packet = el::ElPacketBuilder::new()
16        .transaction_id(1)
17        .seoj([0x05u8, 0xFFu8, 0x01u8])
18        .deoj([0x0Eu8, 0xF0u8, 0x01u8])
19        .esv(el::ServiceCode::Get)
20        .props(el::props!([0x80, []]))
21        .build();
22    let bytes = packet.serialize().expect("fail to serialize");
23
24    socket.send_to(&bytes, (EL_MULTICAST_ADDR, 3610))?;
25    loop {
26        let mut buffer = [0u8; 1024];
27        match socket.recv_from(&mut buffer) {
28            Err(_) => break,
29            Ok((_, src_addr)) => {
30                if let Ok((_, response)) = el::ElPacket::from_bytes(&buffer) {
31                    if response.is_response_for(&packet) {
32                        println!("got response from {src_addr}");
33                        println!("{response}");
34                    }
35                }
36            }
37        }
38    }
39
40    Ok(())
41}