Struct echonet_lite::ElPacket
source · pub struct ElPacket {
pub seoj: EchonetObject,
pub deoj: EchonetObject,
pub esv: ServiceCode,
pub props: Properties,
/* private fields */
}
Expand description
An ECHONET Lite packet representation.
ECHONET Lite SPEC shows an ECHONET Lite packet contains
- EHD1: ECHONET Lite message header1 (1-byte)
- EHD2: ECHONET Lite message header2 (1-byte)
- SEOJ: Source ECHONET Lite object specification (3-byte)
- DEOJ: Destination ECHONET Lite object specification (3-byte)
- ESV: ECHONET Lite service
- OPC: Number of processing properties
- (EPC, PDC, EDT) * OPC
Fields§
§seoj: EchonetObject
§deoj: EchonetObject
§esv: ServiceCode
§props: Properties
Implementations§
source§impl ElPacket
impl ElPacket
sourcepub fn serialize(&self) -> Result<Vec<u8>, Error>
pub fn serialize(&self) -> Result<Vec<u8>, Error>
Serializes an ECHONET Lite packet into byte array.
Examples found in repository?
examples/find.rs (line 22)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
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(())
}
sourcepub fn from_bytes(bytes: &[u8]) -> Result<(usize, ElPacket), Error>
pub fn from_bytes(bytes: &[u8]) -> Result<(usize, ElPacket), Error>
Deserializes an ECHONET Lite packet from byte array.
Examples found in repository?
examples/find.rs (line 30)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
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(())
}
sourcepub fn is_response_for(&self, req: &ElPacket) -> bool
pub fn is_response_for(&self, req: &ElPacket) -> bool
Returns whether self
is a response for the req
.
Examples found in repository?
examples/find.rs (line 31)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
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(())
}
sourcepub fn create_response(&self, esv: ServiceCode, props: Properties) -> ElPacket
pub fn create_response(&self, esv: ServiceCode, props: Properties) -> ElPacket
Creates a new response for itself.
esv
must be one of response service code.
props
contains all response properties.
The created response packet has the same transaction ID as original packet. The source and the destination are reversed.
Trait Implementations§
source§impl<'de> Deserialize<'de> for ElPacket
impl<'de> Deserialize<'de> for ElPacket
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
source§impl From<ElPacket> for AirConditionerPacket
impl From<ElPacket> for AirConditionerPacket
source§impl From<ElPacket> for ClassPacket
impl From<ElPacket> for ClassPacket
source§impl From<ElPacket> for ControllerPacket
impl From<ElPacket> for ControllerPacket
source§impl From<ElPacket> for EvpsPacket
impl From<ElPacket> for EvpsPacket
source§impl From<ElPacket> for FuelCellPacket
impl From<ElPacket> for FuelCellPacket
source§impl From<ElPacket> for GeneralLightingPacket
impl From<ElPacket> for GeneralLightingPacket
source§impl From<ElPacket> for LightingSystemPacket
impl From<ElPacket> for LightingSystemPacket
source§impl From<ElPacket> for MeteringPacket
impl From<ElPacket> for MeteringPacket
source§impl From<ElPacket> for MonoFunctionLightingPacket
impl From<ElPacket> for MonoFunctionLightingPacket
source§impl From<ElPacket> for ProfilePacket
impl From<ElPacket> for ProfilePacket
source§impl From<ElPacket> for SmartMeterPacket
impl From<ElPacket> for SmartMeterPacket
source§impl From<ElPacket> for SolarPowerPacket
impl From<ElPacket> for SolarPowerPacket
source§impl From<ElPacket> for StorageBatteryPacket
impl From<ElPacket> for StorageBatteryPacket
source§impl From<ElPacket> for UnimplementedPacket
impl From<ElPacket> for UnimplementedPacket
source§impl PartialEq for ElPacket
impl PartialEq for ElPacket
impl StructuralPartialEq for ElPacket
Auto Trait Implementations§
impl RefUnwindSafe for ElPacket
impl Send for ElPacket
impl Sync for ElPacket
impl Unpin for ElPacket
impl UnwindSafe for ElPacket
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more