17 releases (9 breaking)
0.11.0 | Dec 12, 2024 |
---|---|
0.10.0 | Nov 26, 2024 |
0.9.0 | Jun 26, 2024 |
0.7.0 | Mar 12, 2024 |
0.2.1 | Nov 7, 2022 |
#539 in Network programming
327 downloads per month
1.5MB
25K
SLoC
dis-rs
dis-rs
is an implementation of the Distributed Interactive Simulation
(DIS
) protocol for Rust.
It provides structures and functions to build PDU
s in applications, send them out via a network and parse received
byte streams into PDUs.
Constructing PDU
s is done via builder pattern constructors.
Given a buffer with data from the network, the library can return multiple PDU
s in multiple DIS
versions present in
the buffer.
The library supports both versions 6
and 7
of the standard.
As a rule of thumb, the lib is modeled mostly towards supporting v7
(in terms of how the data is modelled), and
provides compatibility with how thing were in v6 mostly transparent for the user (i.e., an incoming v6
PDU
is parsed
and then stored in a v7
model and put back on the wire based on the version specified in the header).
Features
Here is an overview of the DIS
PDU
s/features supported by dis-rs
:
PDU | Support |
---|---|
Other | ✔️ |
EntityState | ✔️ |
Fire | ✔️ |
Detonation | ✔️ |
Collision | ✔️ |
ServiceRequest | ✔️ |
ResupplyOffer | ✔️ |
ResupplyReceived | ✔️ |
ResupplyCancel | ✔️ |
RepairComplete | ✔️ |
RepairResponse | ✔️ |
CreateEntity | ✔️ |
RemoveEntity | ✔️ |
StartResume | ✔️ |
StopFreeze | ✔️ |
Acknowledge | ✔️ |
ActionRequest | ✔️ |
ActionResponse | ✔️ |
DataQuery | ✔️ |
SetData | ✔️ |
Data | ✔️ |
EventReport | ✔️ |
Comment | ✔️ |
ElectromagneticEmission | ✔️ |
Designator | ✔️ |
Transmitter | ✔️ |
Signal | ✔️ |
Receiver | ✔️ |
IFF | ✔️ |
UnderwaterAcoustic | ✔️ |
SupplementalEmissionEntityState | ✔️ |
IntercomSignal | ❌ |
IntercomControl | ❌ |
AggregateState | ✔️ |
IsGroupOf | ✔️ |
TransferOwnership | ✔️ |
IsPartOf | ✔️ |
MinefieldState | ❌ |
MinefieldQuery | ❌ |
MinefieldData | ❌ |
MinefieldResponseNACK | ❌ |
EnvironmentalProcess | ❌ |
GriddedData | ❌ |
PointObjectState | ❌ |
LinearObjectState | ❌ |
ArealObjectState | ❌ |
TSPI | ❌ |
Appearance | ❌ |
ArticulatedParts | ❌ |
LEFire | ❌ |
LEDetonation | ❌ |
CreateEntityR | ✔️ |
RemoveEntityR | ✔️ |
StartResumeR | ✔️ |
StopFreezeR | ✔️ |
AcknowledgeR | ✔️ |
ActionRequestR | ✔️ |
ActionResponseR | ✔️ |
DataQueryR | ✔️ |
SetDataR | ✔️ |
DataR | ✔️ |
EventReportR | ✔️ |
CommentR | ✔️ |
RecordR | ✔️ |
SetRecordR | ✔️ |
RecordQueryR | ✔️ |
CollisionElastic | ✔️ |
EntityStateUpdate | ✔️ |
DirectedEnergyFire | ❌ |
EntityDamageStatus | ❌ |
InformationOperationsAction | ❌ |
InformationOperationsReport | ❌ |
Attribute | ✔️ |
Enumerations
dis-rs
uses the SISO-REF-010
reference to map the wire level encoding to actual names of enumerations and values in
code.
E.g., one can use the enum PduType::EntityState
in code instead of remembering that a 1
means that specific value.
The code for these enums is generated using a build script from the published SISO-REF-010.xml file.
Usage
Constructing PDUs
PDU
s are constructed using a default()
or builder()
associated functions on the structs for PduHeader
or
PduBody
s.
Using SomePdu::builder()
constructs a Builder for the PDU.
The Builders start with the default values for PDU fields, and you have to set fields using .with_field_name()
functions.
The build()
function turns the Builder into the typed body of the PDU you are building (e.g., Signal
).
There are no internal validation or checks whether you construct a PDU with valid combinations of fields.
The main data structure is a Pdu
, which consists of a PduHeader
and a PduBody
. The body is a variant of PduBody
,
an enum that wraps a specific struct for that PDU type in a variant (such as Pdu::Signal(Signal)
).
The specific body structs, e.g. an EntityState
, can be wrapped / converted to a PduBody
by call the
into_pdu_body()
function on the struct.
Further, the body can be merged with a PduHeader
using the associated function
Pdu::finalize_from_parts(header, body, timestamp)
. This will give you a complete PDU.
Parsing
The library exposes three functions to parse binary data (the DIS wire format) into PDUs from a buffer: parse()
,
parse_v6_pdus()
and parse_v7_pdus()
.
Each function works the same, where the general parse()
function returns all valid PDUs from the buffer and the others
filter out v6 or v7 version PDUs.
Serializing
To serialize a PDU
to bytes (the DIS
wire format), simply call the serialize()
function on a Pdu
, providing the
buffer as argument.
Crate feature flags
The crate offers one optional feature:
- "serde": Adds support for
serde
to the models. See the exampleserde-json
for details.