loop {
let dat = match conn.recv().await.unwrap();
let mut bytes = BytesMut::from(dat.as_slice());
let pdu_header = PduHeader::decode(&mut bytes);
let body_data = BytesMut::from(&dat[12..]);
match pdu_header.pdu_type {
PduType::Transmitter => {
// this does not work
//let xmsn = TransmitterPdu::deserialize(bytes);
// this *does* work
let xmsn = TransmitterPdu::deserialize_without_header(body_data, pdu_header);
println!("{:?}", xmsn);
println!("{:?}", pdu_header.pdu_type);
println!("{:?}", PduType::Transmitter);
println!("{:?}", pdu_header);
},
_ => continue,
}
}
Err(InvalidDISHeader)
Transmitter
Transmitter
PduHeader { protocol_version: IEEE1278_1A_1998, exercise_id: 1, pdu_type: Transmitter, protocol_family: RadioCommunications, timestamp: 3066130581, length: 104, padding: 0 }
Ok(TransmitterPdu { pdu_header: PduHeader { protocol_version: IEEE1278_1A_1998, exercise_id: 1, pdu_type: Transmitter, protocol_family: RadioCommunications, timestamp: 3459835265, length: 104, padding: 0 }, entity_id: EntityId { simulation_address: SimulationAddress { site_id: 50, application_id: 2 }, entity_id: 5 }, radio_id: 1, radio_entity_type: RadioEntityType { entity_kind: 7, domain: 0, country: 0, category: 0, nomenclature_version: 0, nomenclature: 0 }, transmit_state: 2, input_source: 0, padding1: 0, antenna_location: Vector3Double { x: 0.0, y: 0.0, z: 0.0 }, relative_antenna_location: Vector3Float { x: 0.0, y: 0.0, z: 0.0 }, antenna_pattern_type: 0, antenna_pattern_count: 0, frequency: 100, transmit_frequency_bandwidth: 25000.0, power: 40.0, modulation_type: ModulationType { spread_spectrum: 0, major: 0, detail: 0, system: 0 }, crypto_system: 0, crypto_key_id: 0, modulation_parameter_count: 0, padding2: 0, padding3: 0, modulation_parameter_list: [], antenna_pattern_list: [] })
Transmitter
Transmitter
PduHeader { protocol_version: IEEE1278_1A_1998, exercise_id: 1, pdu_type: Transmitter, protocol_family: RadioCommunications, timestamp: 3459835265, length: 104, padding: 0 }
Transmission::deserialize should be able to take a BytesMut containing a pdu and pdu header, and deserialize it into a TranssmissionPdu
Transmission::deserialize cannot take a BytesMut containing a pdu and pdu header, and deserialize it into a TranssmissionPdu
I have also seen this exact case with SignalPdu as well. I looked at the source code and it doesn't make sense why it would fail to detect the proper pdu_type, but for some reason that is the case. Am I doing something wrong here?