Skip to content

mkrainbow/rtio-device-sdk-c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4b52c60 · Feb 5, 2025

History

7 Commits
Feb 5, 2025
Jan 13, 2025
Dec 24, 2024
Jan 13, 2025
Feb 5, 2025
Jan 13, 2025
Dec 24, 2024
Dec 24, 2024
Dec 24, 2024
Jan 13, 2025
Dec 30, 2024
Dec 30, 2024
Dec 24, 2024

Repository files navigation

RTIO Device SDK for Embedded C

English | 简体中文
The author's native language is Chinese. This document is translated using AI.

IoT device SDK in C for RTIO service connectivity.

Demo Compilation on Linux

Install build tools and demo dependencies on Debian-11, for example.

sudo apt updte
sudo apt install gcc g++ make cmake
sudo apt install openssl libssl-dev

Compile the demo.

$ git clone https://github.com/mkrainbow/rtio-device-sdk-c.git
$ cd rtio-device-sdk-c/
$ cmake -S . -B build
$ cd build/
$ make
# ...
[100%] Linking C executable ...

Running the Demo

Running RTIO Server

You can run the RTIO server either through "Docker" or by compiling from source.

Running RTIO via Docker

$ sudo docker pull registry.cn-guangzhou.aliyuncs.com/rtio/rtio:v0.8.0
v0.8.0: Pulling from rtio/rtio
...
Digest: sha256:...

$ sudo docker run  --rm -p 17017:17017 -p 17917:17917 registry.cn-guangzhou.aliyuncs.com/rtio/rtio:v0.8.0
2024-06-03 13:12:23.264 INF rtio starting ...

You can log into the container using the following command, for example, to view the command help.

$ sudo docker run -it --rm --entrypoint /bin/sh  -p 17017:17017 -p 17917:17917 registry.cn-guangzhou.aliyuncs.com/rtio/rtio:v0.8.0
/home/rainbow $ ./rtio -h
Usage of ./rtio: 
...

(Use "$" instead of "#" in code blocks to avoid the command being rendered as a comment. The same applies to the following text.)

Running RTIO from Source

Tools required:

  • Golang: version 1.21.0 or higher (installation steps: https://go.dev/doc/install).
  • GNU Make: version 4.3 or higher recommended.
  • Git.

Get the code.

git clone https://github.com/mkrainbow/rtio.git
cd rtio
make

Run the service using the following command, and use ./out/rtio -h for help.

$ ./out/rtio -disable.deviceverify -disable.hubconfiger -log.level info
2024-12-19 17:07:14.198 INF rtio starting ...

Running rtio_demo_simple

$ cd bin/
$ ./rtio_demo_simple
[INFO] [DEMO_RTIO] [1734767058] [rtio_demo_simple.c:64 main] RTIO server=localhost:17017.
[DEBUG] [DEMO_RTIO] [1734767058] [rtio_demo_simple.c:66 main] The fixed RAM used by RTIO, size=2072 bytes.

In another terminal, use curl to simulate a request to the device URI /rainbow. Here, the curl request sends "hello", and the response is "World!" (since the data field is binary, it is base64-encoded before HTTP transmission).

$ echo -n "Hello"| base64
SGVsbG8=

$ curl http://localhost:17917/cfa09baa-4913-4ad7-a936-3e26f9671b10 -d '{"method":"copost", "uri":"/rainbow","id":12668,"data":"aGVsbG8="}'
{"id":12668,"fid":0,"code":"OK","data":"V29ybGQh"}

$ echo -n "V29ybGQh"| base64 -d
World!

The device-side log shows the received request data "Hello".

[INFO] [DEMO_RTIO] [1734767083] [rtio_demo_simple.c:31 uriRainbow] Handling the copost req with uri=/rainbow, pReqData=hello.

The demo successfully sent a copost request to the device's /rainbow endpoint, and successfully transmitted the request and response data (the device doesn't need to base64 encode/decode, the rtio service handles the conversion).

Running rtio_demo_tls

The RTIO server needs to enable TLS device access. The following example uses Docker.

First, enter interactive mode.

$ sudo docker run -it --entrypoint /bin/sh  --rm  -p 17017:17017 -p 17917:17917 registry.cn-guangzhou.aliyuncs.com/rtio/rtio:v0.8.0
/home/rainbow $ ls
certificates        rtio     # ...

Run RTIO and enable TLS.

/home/rainbow $ ./rtio -disable.deviceverify -disable.hubconfiger -enable.hub.tls -hub.tls.certfile ./certificates/demo_server.crt -hub.tls.keyfile ./certificates/demo_server.key -log.level info
2024-12-24 09:39:38.337 INF rtio starting ...
2024-12-24 09:39:38.337 INF TLS access enabled

In another terminal, run rtio_demo_tls. Note that it should be run from the build/bin/ directory, as the code references the certificate location certificates/RTIORootCA.crt.

$ cd bin/
$ ./rtio_demo_tls
[INFO] [DEMO_RTIO_TLS] [1735034352] [rtio_demo_tls.c:77 main] RTIO server=localhost:17017.
[DEBUG] [DEMO_RTIO_TLS] [1735034352] [rtio_demo_tls.c:79 main] The fixed RAM used by RTIO, size=2072 bytes.

In another terminal, use curl to simulate a request to the device URI /rainbow. Here, the curl request sends "hello", and the response is "World!" (since the data field is binary, it is base64-encoded before HTTP transmission).

$ curl http://localhost:17917/cfa09baa-4913-4ad7-a936-3e26f9671b10 -d '{"method":"copost", "uri":"/rainbow","id":12668,"data":"aGVsbG8="}'
{"id":12668,"fid":0,"code":"OK","data":"V29ybGQh"}

The device-side log shows the received request data "Hello".

[INFO] [DEMO_RTIO_TLS] [1735034642] [rtio_demo_tls.c:37 uriRainbow] Handling the copost req with uri=/rainbow, pReqData=hello.

SDK Integration

The following example is for integrating with the POSIX platform using rtio_demo_simple. Copy rtio_demo_simple and rtio-device-sdk-c into the same directory.

$ cp -r rtio-device-sdk-c/demos-posix/rtio/rtio_demo_simple ./ 
$ ls -d rtio-device-sdk-c rtio_demo_simple 
rtio-device-sdk-c  rtio_demo_simple
$ cd rtio_demo_simple/
$ ls
CMakeLists.txt  core_rtio_config.h  demo_config.h  rtio_demo_simple.c

Modify the CMakeLists.txt to reference the required cmake files.

# ...
# Get root dirs and the cmake-files it depends on.
include( "../../demosRoot.cmake" )
include( "${RTIO_SDK_ROOT_DIR}/tools/cmake/rtioSDK_POSIX_Plaintext.cmake" )
include( "${PLATFORM_DEMOS_ROOT_DIR}/logging-stack/logging.cmake" )

Replace with the following:

# ...
# Get root dirs and the cmake-files it depends on.
include( "../rtio-device-sdk-c/tools/cmake/rtioSDK_POSIX_Plaintext.cmake" )
include( "../rtio-device-sdk-c/demos-posix/logging-stack/logging.cmake" )

Use cmake and make to build the program:

$ cmake -S . -B build
# ...
-- Configuring done
-- Generating done
-- Build files have been written to: ...

$ cd build/
$ make
# ...
[100%] Built target rtio_demo_simple

For non-POSIX platforms, refer to the Demo in demos-esp32 for setup instructions.

Acknowledgements

This project is developed based on aws-iot-device-sdk-embedded-C (202211.00, MIT license), with the coreRTIO project added. Thanks to the project authors and contributors.