mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-14 09:03:50 +01:00
This changes the API of nanocoap with the goal to reduce the expose of
UDP specifics in the API. The plan is to eventually support transports
such as CoAP over TCP and CoAP over WebSocket directly in nanocoap
while sharing most of the code, as e.g. the CoAP Option processing
remains identical. Specifically, the plan is to unlock a transport with
modules and introduce overhead for dispatching to specific transport
only when multiple transports are actually in use.
Support for OSCORE directly in nanocoap is probably not sensible, as
the serialization is very much unlike the other transports. A unified
CoAP API for multiple transports including OSCORE is probably best
implemented on top. But when limited to the boring set of CoAP
transports, we probably can support them well with nanocoap with less
overhead.
Breaking API Changes:
=====================
- `coap_parse()` now returns `ssize_t` instead of `int`
- This function is not really user facing, so the impact should
be limited
- This is useful for stream transports where the buffer may
contain data of more than one packet. The return value contains
the number of bytes actually consumed, which will match the
buffer size for non-stream transports.
API Changes:
============
- `coap_pkt_t` now contains a `uint8_t *buf` pointer instead of a
`coap_hdr_t *hdr` pointer to the beginning of the buffer
- This will also work when the buffer is used by non-UDP
transports
- A deprecated `coap_udp_hdr_t *hdr` has been crammed into
an unnamed `union` with `uint8_t *buf`. For architectures
where pointers have the same memory layout regardless of type
(e.g. all of the supported ones), this will make `hdr` an
alias for `buf`.
- The alias will only be provided if no transport besides UDP is
used in nanocoap. So existing apps will continue to work, new
apps that want to support other transports need to move to
adapt.
- `coap_hdr_t` has been renamed to `coap_udp_hdr_t`
- A deprecated alias was created for deprecation
- `coap_hdr*()` functions have been deprecated
- Equivalent `coap_pkt*()` functions have been created that work
on `coap_pkt_t *` instead of `coap_hdr_t *`
- If non-UDP transports are used, the deprecated `coap_hdr*()`
will probably not be exposed to avoid footguns.
- `coap_build_hdr()` has been renamed to `coap_build_udp_hdr()` and
that works on an `uint8_t *` buffer with a given length, rather than
on a `coap_hdr_t *` with a *figers crossed* length
- a deprecated `coap_build_hdr()` function was added that calls
to `coap_build_udp_hdr()` and has the same signature, so that
users have time to update
Examples
RIOT provides a wide range of examples to demonstrate the capabilities of the OS and its modules.
Each example contains a README.md that provides information and instructions how to run it.
Here is a quick overview of the examples available in the RIOT:
The Essentials
| Example | Description |
|---|---|
| default | This application is a showcase for RIOT's hardware support. Using it for your board, you should be able to interactively use any hardware that is supported. |
| hello-world | A simple "Hello World" that shows the basic structure of a RIOT application. |
| blinky | The classic "Hello World" example for embedded systems: blinking an LED (or printing "Blink!" via stdio when none are available). |
| leds_shell | The application leds_shell is a basic example, which allows easy, interactive control of internal board LEDs, and basic GPIO for externally connected simple devices (for e.g. additional LEDs, relay, motors - via dedicated drivers, etc.) via the shell. |
| saul | This example demonstrates the usage of the SAUL (Sensor Actuator Uber Layer) module. |
| timer_periodic_wakeup | How to set up a periodic wakeup timer using the RIOT operating system. |
| ipc_pingpong | This example is to illustrate the usage of RIOTs IPC messaging system. |
| filesystem | This example showcases ways to interact/manage the filesystem in RIOT. |
| subfolders | This example demonstrates how to use subfolders in RIOT applications. |
RIOT Language Bindings
Officially Supported/Targeted
Rust
| Example | Description |
|---|---|
| rust-hello-world | This example demonstrates how to write a simple RIOT application in Rust. |
| rust-gcoap | This example demonstrates how to write a coap server application in Rust using the RIOTs gcoap module. |
| rust-async | This example demonstrates how to use Rusts async/await syntax in a RIOT application. |
C++
| Example | Description |
|---|---|
| riot_and_cpp | Example of using C++ in RIOT applications. |
Community Supported
| Example | Description |
|---|---|
| javascript | How to write IoT applications using javascript using JerryScript. |
| lua_basic | How to write IoT applications using Lua. |
| lua_REPL | This example demonstrates how to use the Lua Read-Eval-Print Loop (REPL) in RIOT. |
| micropython | How to use the MicroPython port for RIOT. |
| wasm | How to use WebAssembly in RIOT. |
| arduino_hello-world | This application demonstrates the usage of Arduino sketches in RIOT. |
Networking
Constraint Application Protocol (CoAP)
| Example | Description |
|---|---|
| gcoap | This example demonstrates the usage of the gcoap module, a high-level API for CoAP (Constrained Application Protocol) messaging. |
| gcoap_block_server | CoAP server handling for Block requests, build with gcoap using nanocoap block handling functions. |
| gcoap_fileserver | This example demonstrates the usage of the gcoap module to serve files over CoAP. |
| gcoap_dtls | This example demonstrates the usage of the gcoap module with DTLS. |
| nanocoap_server | This example demonstrates the usage of the nanocoap module, a high-level API for CoAP (Constrained Application Protocol) messaging. |
Bluetooth Low Energy (BLE)
NimBLE
| Example | Description |
|---|---|
| nimble_scanner | This example showcases the usage of the NimBLE BLE stack as a scanner. |
| nimble_gatt | This example application configures and runs the NimBLE BLE stack as simple GATT server. |
| nimble_heart_rate_sensor | This example demonstrates how to implement asynchronous data transfer using GATT notifications by implementing a mock-up BLE heart rate sensor. |
Misc BLE Examples
| Example | Description |
|---|---|
| skald_eddystone | This example demonstrates the usage of Skald for creating an Google Eddystone beacon. |
| skald_ibeacon | This example demonstrates the usage of Skald for creating an Apple iBeacon. |
MQTT
| Example | Description |
|---|---|
| asymcute_mqttsn | This application demonstrates the usage of the Asymcute (MQTT-SN) module in RIOT. |
| emcute_mqttsn | This application demonstrates the usage of the emCute (MQTT-SN) module in RIOT. |
| paho-mqtt | This example demonstrates the usage of the Paho MQTT client library in RIOT. |
CoRE Resource Directory
| Example | Description |
|---|---|
| cord_ep | Example of RIOT's Resource Directory (RD) endpoint module, called cord_ep |
| cord_lc | Example of RIOT's Resource Directory (RD) lookup module, called cord_lc |
| cord_epsim | This example shows how a node can register with a CoRE resource directory |
GNRC Networking
| Example | Description |
|---|---|
| gnrc_minimal | This is a minimalistic example for RIOT's gnrc network stack. |
| gnrc_networking | This example demonstrates the usage of the GNRC network stack in RIOT. |
| gnrc_networking_subnets | This example demonstrates IPv6 subnet auto-configuration for networks on a tree topology. |
| gnrc_border_router | Example of gnrc_border_router using automatic configuration |
| gnrc_lorawan | Send and receive LoRaWAN packets and perform basic LoRaWAN commands |
DTLS
| Example | Description |
|---|---|
| dtls-sock | This example shows how to use DTLS sock sock_dtls_t |
| dtls-echo | This example shows how to use TinyDTLS with sock_udp. |
| dtls-wolfssl | This example demonstrates the usage of the DTLS module with the wolfSSL library. |
Misc
| Example | Description |
|---|---|
| lorawan | This application shows a basic LoRaWAN use-case with RIOT. |
| openthread | This example demonstrates the usage of the OpenThread stack in RIOT. |
| lwm2m | Example of a LWM2M client on RIOT |
| ccn-lite-relay | This application demonstrates how to use the Content-Centric Networking stack from CCN-Lite on RIOT |
| telnet_server | Simple telnet server that listens on port 23 over IPv6. |
| posix_sockets | Showcase for RIOT's POSIX socket support |
| spectrum-scanner | This example demonstrates how to monitor energy levels on all available wireless channels |
| sniffer | This application is built to run together with the script ./tools/sniffer.py as a sniffer for (wireless) data traffic. |
| benckmark_udp | This example uses the benchmark_udp module to create a stress-test for the RIOT network stack. |
| sock_tcp_echo | This is a simple TCP echo server / client that uses the SOCK API. |
Advanced Examples
| Example | Description |
|---|---|
| bindist | RIOT allows for creating a "binary distribution", which can be used to ship proprietary, compiled objects in a way that makes it possible to re-link them against a freshly compiled RIOT. This application serves as a simple example. |
| usbus_minimal | This is a minimalistic example for RIOT's USB stack. |
| suit_update | This example shows how to integrate SUIT-compliant firmware updates into a RIOT application. |
| thread_duel | This is a thread duel application to show RIOTs abilities to run multiple-threads concurrently, even if they are neither cooperative nor dividable into different scheduler priorities, by using the optional round-robin scheduler module. |
| posix_select | This example is a showcase for RIOT's POSIX select support |
| psa_crypto | Basic functions of the PSA Crypto API |
| pio_blink | How to use the PIO peripheral on the RaspberryPi Pico to blink an LED. |
| twr_aloha | This example allows testing different two-way ranging algorithms between two boards supporting a dw1000 device. This makes use of the uwb-core pkg. |
| senml_saul | This example demonstrates the usage of the SAUL (Sensor Actuator Uber Layer) module with the SenML (Sensor Measurement Lists) format. |
| opendsme | This example demonstrates the usage of the OpenDSME module in RIOT. |
| xipfs | This example demonstrates the usage of XIPFS for creating and executing an executable file. |
Examples from Guides
Our guides walk you through small tutorials to get started. The following examples are the resulting code from completing their respective guide.
| Example | Description |
|---|---|
| creating_project | Teaches you the very first steps. How to setup a RIOT project, build and run a Hello World in it. Create Project tutorial |
| shell | Teaches you how to use the interactive RIOT shell for your application. Shell tutorial |
| gpio | Teaches you how to configure and use GPIO pins for external hardware interaction. GPIO tutorial |
| saul | Teaches you how to interact with sensors and actuators through the SAUL interface. SAUL tutorial |
| threads | Teaches you how to create and manage multiple execution threads in your RIOT application. Threads tutorial |
| timers | Teaches you how to use timers for periodic tasks and time measurement in RIOT. Timers tutorial |