1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/examples/opendsme/README.md

96 lines
3.3 KiB
Markdown
Raw Normal View History

2022-06-01 14:55:48 +02:00
# About openDSME
The IEEE 802.15.4 standard with its widespread usage in wireless sensor and
actuator networks was extended by several techniques that allow reliable data
transmission for critical applications, such as industrial plants. This
includes the Deterministic and Synchronous Multi-channel Extension (DSME) that
allows for distributed assignment of time slots on multiple channels.
openDSME is an open source implementation of the Deterministc and
Synchronous Multi-channel Extension.
## Features
- Topology agnostic (peer-to-peer, star, mesh, etc).
- By design, a DSME network can be extended just by adding more coordinators near the edge.
- Automatic resolution of beacon collision
- Frame transmission using either CSMA-CA or multi-channel GTS (guaranteed time slot)
- Built-in slot negotiation (dynamic allocation) and static allocation.
# Usage
1. A PAN coordinator device starts the DSME network via the GNRC network interface:
```
ifconfig <if_num> pan_coord
ifconfig <if_num> up
```
2. Child devices trigger scanning and join the DSME network:
```
ifconfig <if_num> up
```
3. On a fraction of second, `ifconfig` of the joining child device
should display "Link: up" and the L2 address should be visible
4. Devices may choose CSMA-CA or GTS transmissions. CSMA-CA transmissions are
selected by default. To switch to GTS transmissions, run:
```
ifconfig <if_num> gts
```
To switch back to CSMA-CA transmissions, run:
```
ifconfig <if_num> -gts
```
5. To transmit data, use the `txtsnd` command:
```
txtsnd <if_num> <target_L2_address> <message>
```
In case of GTS transmissions, the MAC will negotiate a slot with the target
device. On success, the message will be transmitted in the next occurrence of
the slot. As a result, the first GTS transmission will take longer than
subsequent transmissions.
Note that GTS expire if not used, which will require a new negotiation.
The expire timeout can be configured with `CONFIG_IEEE802154_DSME_GTS_EXPIRATION`
(by default 16 idle slot occurrences).
## Static GTS allocation
Although not supported by the standard, openDSME includes a mechanism to override
the dynamic allocation with static allocation. This is useful for experimentation
or quick prototypes.
To enable, compile openDSME with `CONFIG_IEEE802154_DSME_STATIC_GTS=1`. This can
be set via Kconfig or CFLAGS.
To allocate slots statically, use the `gts` command:
```
gts <if_num> <neighbour_L2_address> <is_tx> <superframe_id> <slot_id> <channel_id>
```
For example, to allocate a pair of slots node 1 (`DE:AD`) and node
B (`BE:EF`), run:
In node 1 (`DE:AD`)
```
gts 3 BE:EF 1 0 0 0
```
In node 2 (`BE:EF`)
```
gts 3 DE:AD 0 0 0 0
```
The slot is located in the first slot (0) of the first superframe in the
multisuperframe (0) and uses the first channel (0). Node 1 allocates a TX slot
and node 2 an RX slot.
In contrast to standard GTS, static GTS do not expire.
To understand more about the superframe structure, check the openDSME
documentation in the RIOT documentation.
# Port limitations
- So far only GNRC link layer communication is supported (e.g `txtsnd`).
- Only PAN coordinator and child roles are supported. This is not an
openDSME limitation, but rather a missing configuration in the RIOT contrib.
- The current openDSME utilizes heap to allocate internal data structures.
- The scanning/joining procedure is hardcoded to join openDSME beacons.