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}