# ioto **Repository Path**: mirrors_embedthis/ioto ## Basic Information - **Project Name**: ioto - **Description**: Embedthis Ioto Device Agent -- IoT Device Management - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-31 - **Last Updated**: 2026-01-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EmbedThis Ioto Device Agent

CI Status

The EmbedThis Ioto device agent is an IoT Device Management agent that can be used for cloud-based management or direct management over a local network. Ioto provides everything you need in an IoT device agent, including: an HTTP web server, HTTP client, MQTT client, embedded database and JSON data management. Ioto offers extensive cloud-based management using the AWS IoT platform. Integration is provided for cloud-based state persistency, provisioning, cloud database sync and OTA device upgrading. What is unique about Ioto is that these components are tightly integrated to give an extremely efficient and powerful device agent. Ioto's embedded database will transparently sync device data to the cloud to enable effortless remote management. This distribution includes several [Sample Apps](./apps) to help you get started with Ioto. You can also download the separate Ioto Apps package for a suite of device management apps. See the [README-Cloud](./README-CLOUD.md) for more details about cloud-based management. See the [README-ESP32](./README-ESP32.md) for details about building Ioto for the ESP32 platform. See the [README-FREERTOS](./README-FREERTOS.md) for details about building Ioto for the FreeRTOS platform. Full documentation for the Ioto Agent, the Builder, Device Manager and Ioto service is available at: * https://www.embedthis.com/doc/ ## Licensing Ioto is commercial software and is provided under the following licenses. See [LICENSE.md](LICENSE.md) and [EVAL.md](EVAL.md) for details. It is also offered with a [GPLv2](https://www.gnu.org/licenses/gpl-2.0.html) license from the [Embedthis GitHub Repository](https://github.com/embedthis/ioto). ## Sample Apps The Ioto distribution build includes several sample apps for local or cloud-based management. Apps demonstrate device-side logic to implement various management use cases. The default app is the "unit" test app which runs the test suite. Name | Description -|- ai | Demonstrates using the OpenAI APIs. blank | Empty slate application. blink | Minimal ESP32 blink app to demonstrate linking with Ioto on ESP32 microcontrollers. demo | Cloud-based management of a device. Demonstrates simple data synchronization and metrics. http | Simple embedded web server user/group authentication sample. unit | Unit testing app. Each application has a README.md in the apps/APP directory that describes the application. ## Building from Source Ioto releases are available as source code distributions from the [Builder Site](https://admin.embedthis.com/product). To download, first create an account and login, then navigate to the product list, select the Ioto Eval and click the download link. [Download Source Package](https://admin.embedthis.com/product) The Ioto source distribution contains all the required source files, headers, and build tools. Ioto is cross-platform and runs on a wide variety of operating systems and CPU architectures. EmbedThis offers different levels of verification for different platforms. The platform support tiers are: ### Tier 1 Tier 1 platforms are those that are supported and verified by Ioto. Each release is tested and verified on these platforms. The tier 1 platforms are: - Linux - Mac OS X - Windows ### Tier 2 Tier 2 platforms are those that are supported by Ioto but each release is not always tested and verified on these platforms. The tier 2 platforms are: - ESP32 - FreeBSD - FreeRTOS - VxWorks ### Tier 3 Tier 3 platforms are those that customers have ported Ioto to and may work with little or no effort by customers. For tier 3 environments, you will need to cross-compile. The source code has been designed to run on Arduino, ESP32, FreeBSD, FreeRTOS, Linux, Mac OS X, VxWorks and other operating systems. Ioto supports the X86, X64, Riscv, Riscv64, Arm, Arm64, and other CPU architectures. Ioto can be ported to new platforms, operating systems and CPU architectures. Ask us if you need help doing this. See [Porting Ioto](https://www.embedthis.com/doc/agent/user/hardware.html#porting-ioto-to-a-new-platform/) for porting details. ## Build Configuration When building Ioto, you do not need to use a `configure` program. Instead, you simply run **make** and select your desired App. This will copy the App's configuration and conditionally compile the required services based on the App's **ioto.json5** configuration settings. During the initial build, the App's configuration will be copied to the **state/config** directory. The selectable Ioto services are: * ai -- Enable the AI service * database -- Enable the embedded database * keys -- Get AWS IAM keys for local AWS API invocation (dedicated clouds only) * logs -- Capture log files and send to AWS CloudWatch logs (dedicated clouds only) * mqtt -- Enable MQTT protocol * provision -- Dynamically provision keys and certificates for cloud-based management * register -- Register with the Ioto Builder * serialize -- Run a serialization service when making the device * shadow -- Enable AWS IoT shadow state storage * sync -- Enable transparent database synchronization with the cloud * url -- Enable client HTTP request support * web -- Enable the local embedded web server ## Building If you are building on Windows, or for ESP32 or FreeRTOS, please read the specific instructions for various build environments: * [Building on Windows](#building-on-windows) * [Building for the ESP32](README-ESP32.md) * [Building for FreeRTOS](README-FREERTOS.md) ## Building with Make To build on Linux, MacOS or Windows via WSL, use the system **make** command. The supplied Makefile will build the Ioto library (libioto.a) and the "ioto" main program. If you are embedding Ioto in another program, you should link the Ioto library with your program. See [Linking](#linking-with-ioto) below for details. To build, nominate your selected app via the "APP=NAME" makefile option. For example: $ make APP=unit ## Building on Windows For Windows, you can build one of three ways: * Natively with Windows Visual Studio * Using Windows Command Prompt and nmake * Using Windows WSL using make The easiest way to build is to use Windows WSL and make, but this yields a lower-performing executable. We recommend building with WSL initially to test the Ioto agent. ### Building with Windows WSL Using the [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/about) you get a tightly integrated Linux environment from which you can build and debug using VS Code. To build, first [install WSL](https://learn.microsoft.com/en-us/windows/wsl/install) by running the following command as an administrator: $ wsl --install Then invoke **wsl** to run a wsl (bash) shell: $ wsl To configure WSL for building, install the following packages from the wsl shell. $ apt update $ apt install make gcc build-essential libc6-dev openssl libssl-dev Then extract the Ioto source distribution: $ tar xvfz ioto-VERSION.tgz ioto Finally build via **make**: $ cd ioto $ make To debug with VS Code, add the [WSL extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) to VS Code and then from a WSL terminal, open VS Code from the ioto directory: $ cd ioto $ code . This will open a remote WSL project for the Ioto distribution. ### Building Natively on Windows To build natively on Windows, you will need to install the compiler from the Visual Studio Community Edition. You can download the installer from the [Visual Studio website](https://visualstudio.microsoft.com/downloads/). You will also need to install `vcpkg` to manage the dependencies and install the required SSL libraries. Newer versions of Visual Studio include Vcpkg. You can check if you have Vcpkg installed by running: ```bash > vcpkg --version ``` If installed, you can skip these steps. If you do not have Vcpkg installed, you can install it by running: ```bash > git clone https://github.com/microsoft/vcpkg.git > cd vcpkg > .\bootstrap-vcpkg.bat > .\vcpkg integrate install ``` Once installed, you can install the required Ioto dependencies: ```bash $ vcpkg install ``` OpenSSL will be installed to: * -I\installed\x64-windows\include * -L\installed\x64-windows\lib Vcpkg is automatically configured for building with Visual Studio. For `nmake` you will need to set the ME_COM_OPENSSL_PATH environment variable to the path to the OpenSSL installation. ### Building with Windows Visual Studio To build natively with Visual Studio, open the Ioto solution file: projects/ioto-windows-default/ioto.sln For debug, set the "Debug" configuration and build the project. Then select `ioto` as the startup project. Edit the `ioto` properties and set the working directory to the `${ProjectDir}\..\..` which is the Ioto root directory. You can change the included Ioto demo application by editing the `APP` property for the `app` project. It is set to `demo` by default. After changing, do a clean rebuild of the project. ### Building with Nmake and Windows Command Prompt You can build natively on Windows from the command line. First set the environment variables for the Visual Studio version you are using: ```bash c:\Program Files\Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat ``` Next, install the Vcpkg and OpenSSL dependencies as described above in the [Building Natively](#building-natively) section. Once the dependencies are installed, define the path to the OpenSSL installation so the build can find the headers and libraries by setting the `ME_COM_OPENSSL_PATH` environment variable. Then build the Ioto project with `make`. This will run the `make.bat` script which will invoke `nmake` to build the Ioto project. For example: ```bash SET ME_COM_OPENSSL_PATH=C:\vcpkg\installed\x64-windows make ``` ## Running the Ioto Command To run Ioto, type: $ make run or add the directory **build/bin** to your PATH environment variable and invoke directly. export PATH=`make path` $ ioto -v on Windows: ```bash SET PATH=%PATH%;%CD%\build\bin ioto -v ``` If your selected app enables the web server, Ioto will listen for connections on ports 80 for HTTP and 443 for HTTPS and serve documents from the **site** directory when run with the **dev** profile. When run with the **prod** profile, it will serve documents from **/var/www/ioto**. You can change the listening ports in **web.json5**. ## Running the Web Server If you only require local management and do not need cloud-based management or the embedded database, you can run the web server directly by running the **web** program instead of the **ioto** program. For example: $ web This will start the web server listening on ports 80 for HTTP and 443 for HTTPS and serve documents from the **site** directory. You can change the listening ports in **web.json5**. ## Changing the TLS Stack Ioto includes support for two TLS stacks: OpenSSL and MbedTLS. Ioto is built with OpenSSL by default. OpenSSL is a leading open source TLS stack that is faster, but bigger. MbedTLS is a compact TLS implementation. When built for ESP32, the supplied ESP32 MbedTLS stack will be used. To build with MbedTLS, install MbedTLS version 3 or later using your O/S package manager. For example on Mac OS: $ brew install mbedtls Then build with MbedTLS: $ make ME_COM_MBEDTLS=1 ME_COM_OPENSSL=0 ## Embedding Ioto If you wish to embed the Ioto library in your main program, such as you will do with FreeRTOS, you will need to include the **ioto.h** header in your source and call Ioto APIs to initialize and run. ### Including Ioto In your main program, use: ```c #include "ioto.h" int main() { // If FreeRTOS, you need to call vTaskStartScheduler() before ioRun // Start the Ioto runtime ioStartRuntime(1); // Run Ioto services until instructed to exit ioRun(ioStart); ioStopRuntime(); } int ioStart() { // This is invoked by ioRun when Ioto is ready // Put your user code here } void ioStop() { // This is invoked by ioRun when Ioto is shutting down } ``` ### Linking with the Ioto Library To compile, reference the Ioto include directory. For example: $ gcc -I/path/to/ioto/build/inc To link, reference the Ioto library. For example: $ cc -o prog -I .../ioto/build/inc -L .../ioto/build/bin main.c -lioto -lssl -lcrypto If you are building with OpenSSL or MbedTLS, you will probably need to add those libraries to the link path. For example with OpenSSL: $ gcc -lcrypto -lssl ### Fiber Stacks Ioto uses [fiber coroutines](https://www.embedthis.com/agent/doc/dev/fiber/) for parallelism instead of threads or callbacks. This results in a faster and simpler codebase. Each fiber has a stack. On Linux, MacOS and Windows, the stacks are grown automatically as required from an initial stack size of 32K (64K on Windows). On other platforms such as FreeRTOS or systems without an MMU, the stack size is fixed. On such platforms, it is recommended that you limit the use of large stack-based allocations and use heap allocations instead. It is also advised to limit the use of recursive algorithms. The initial size of a fiber stack is defined via the **limits.fiberStack** property (previously `limits.stack`) in the **ioto.json5** configuration file. For Linux, MacOS and Windows, you can configure the maximum stack size and the stack growth increment via the properties: **limits.fiberStackMax** and **limits.fiberStackGrow**. If a fiber is reused from the pool, the stack size can be reset to the initial size if the stack is larger than the initial size via the **limits.fiberStackReset** property. ```json5 limits: { fiberStack: '32k', fiberStackMax: '256k', fiberStackGrow: '16k', fiberStackReset: '64k' } ``` ## Build Profiles You can change Ioto's build and execution **profile** by editing the **ioto.json5** configuration file. Two build profiles are supported: - dev - prod The **dev** profile will configure Ioto suitable for development. It will use local directories for state, web site and config files. It will also define the "optimize" property to be "debug" which will build Ioto with debug symbols. The **prod** profile will build Ioto suitable for production deployment. It will define system standard directories for state, web site and config files. It will also define the "optimize" property to be set to "release" which will build Ioto optimized without debug symbols. The **ioto.json5** configuration file has some conditional properties that are applied depending on the selected **profile**. These properties are nested under the **conditional** property and the relevant set are copied to overwrite properties of the same name at the top level. This allows a single configuration file to apply different settings based on the current value of the profile property. You can override the **"optimize"** property by building with an "OPTIMIZE=release" or "OPTIMIZE=debug" make environment variable. ## Tests The test suite is located in the `test/` directory and uses the [TestMe](https://www.embedthis.com/testme/) framework. The test suite requires the following prerequisites: - **Bun**: v1.2.23 or later - **TestMe**: Test runner (installed globally) Install Bun by following the instructions at: https://bun.com/docs/installation Install TestMe globally with: bun install -g --trust @embedthis/testme Run the tests with: make test or manually via the `tm` command. tm To run a specific test or group of tests, use the `tm` command with the test name. tm basic/ ### Other Test Suites The distribution includes test suites for: tracking memory leaks, fuzz testing and performance benchmarking. * [Memory Leak Testing](test/web/leak/) * [Fuzz Testing](test/web/fuzz/) * [Performance Benchmarking](test/web/benchmark/) ## Directories | Directory | Purpose | | :------------ | :----------------------------------------------------------------------- | | apps | Directory of application examples | | build | Build output objects and executables | | cmds | Main programs for Ioto and tools | | lib | Source code to build the Ioto library | | projects | Generated Makefiles and IDE projects | | scripts | Device management scripts including OTA script | | state | Runtime Ioto state | | state/certs | Test certificates | | state/config | Ioto configuration files for device registration, testing and web server | | state/site | Web documents for embedded web server | | test | Test suites | | tools | Build tools | ## Key Files Some of these files may not be present unless required by the built app. | File | Purpose | | :----------------| :------------------------------------------------------| | LICENSE.md | License information | | device.json5 | Device registration file | | display.json5 | UI display configuration for management apps | | ioto.json5 | Primary Ioto configuration file | | signature.json5 | Web server REST API signatures | | web.json5 | Embedded web server configuration | | schema.json5 | Database schema | ## Resources ### Online Documentation - [EmbedThis web site](http://www.embedthis.com/) - [EmbedThis Ioto Documentation](https://www.embedthis.com/doc/) - [EmbedThis Ioto Documentation GitHub repository](https://github.com/embedthis/ioto-doc) ### Project Documentation - [AI/designs/DESIGN.md](AI/designs/DESIGN.md) - Architecture and design overview - [AI/context/CONTEXT.md](AI/context/CONTEXT.md) - Module documentation index - [AI/references/REFERENCES.md](AI/references/REFERENCES.md) - External references and links - [AI/plans/PLAN.md](AI/plans/PLAN.md) - Development plans ### Module Documentation Detailed documentation for each module is available in [AI/context/](AI/context/): - [crypt.md](AI/context/crypt.md) - Cryptographic functions - [db.md](AI/context/db.md) - Embedded database - [json.md](AI/context/json.md) - JSON5/JSON6 parser - [mqtt.md](AI/context/mqtt.md) - MQTT client - [openai.md](AI/context/openai.md) - OpenAI integration - [osdep.md](AI/context/osdep.md) - OS abstraction - [r.md](AI/context/r.md) - Safe Runtime foundation - [uctx.md](AI/context/uctx.md) - User context/fibers - [url.md](AI/context/url.md) - HTTP client - [web.md](AI/context/web.md) - Web server - [websock.md](AI/context/websock.md) - WebSocket support