131 lines
4.9 KiB
Markdown
131 lines
4.9 KiB
Markdown
|
|
# OpenThread CLI onReceive Callback Example
|
||
|
|
|
||
|
|
This example demonstrates how to use the OpenThread CLI callback mechanism to capture and process CLI responses asynchronously.\
|
||
|
|
The application shows how to set up a callback function that processes CLI responses line by line, allowing non-blocking CLI interaction.
|
||
|
|
|
||
|
|
## Supported Targets
|
||
|
|
|
||
|
|
| SoC | Thread | Status |
|
||
|
|
| --- | ------ | ------ |
|
||
|
|
| ESP32-H2 | ✅ | Fully supported |
|
||
|
|
| ESP32-C6 | ✅ | Fully supported |
|
||
|
|
| ESP32-C5 | ✅ | Fully supported |
|
||
|
|
|
||
|
|
### Note on Thread Support:
|
||
|
|
|
||
|
|
- Thread support must be enabled in the ESP-IDF configuration (`CONFIG_OPENTHREAD_ENABLED`). This is done automatically when using the ESP32 Arduino OpenThread library.
|
||
|
|
- This example uses `OpenThread.begin()` which automatically starts a Thread network with default settings.
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- CLI response callback using `OpenThreadCLI.onReceive()`
|
||
|
|
- Asynchronous CLI response processing
|
||
|
|
- Non-blocking CLI command execution
|
||
|
|
- Demonstrates callback-based CLI interaction pattern
|
||
|
|
- Automatic Thread network startup with default settings
|
||
|
|
- Device role monitoring via CLI
|
||
|
|
|
||
|
|
## Hardware Requirements
|
||
|
|
|
||
|
|
- ESP32 compatible development board with Thread support (ESP32-H2, ESP32-C6, or ESP32-C5)
|
||
|
|
- USB cable for Serial communication
|
||
|
|
|
||
|
|
## Software Setup
|
||
|
|
|
||
|
|
### Prerequisites
|
||
|
|
|
||
|
|
1. Install the Arduino IDE (2.0 or newer recommended)
|
||
|
|
2. Install ESP32 Arduino Core with OpenThread support
|
||
|
|
3. ESP32 Arduino libraries:
|
||
|
|
- `OpenThread`
|
||
|
|
|
||
|
|
### Configuration
|
||
|
|
|
||
|
|
No configuration is required before uploading the sketch. The example automatically starts a Thread network with default settings.
|
||
|
|
|
||
|
|
## Building and Flashing
|
||
|
|
|
||
|
|
1. Open the `onReceive.ino` sketch in the Arduino IDE.
|
||
|
|
2. Select your ESP32 board from the **Tools > Board** menu (ESP32-H2, ESP32-C6, or ESP32-C5).
|
||
|
|
3. Connect your ESP32 board to your computer via USB.
|
||
|
|
4. Click the **Upload** button to compile and flash the sketch.
|
||
|
|
|
||
|
|
## Expected Output
|
||
|
|
|
||
|
|
Once the sketch is running, open the Serial Monitor at a baud rate of **115200**. You should see output similar to the following:
|
||
|
|
|
||
|
|
```
|
||
|
|
OpenThread CLI RESP===> disabled
|
||
|
|
OpenThread CLI RESP===> disabled
|
||
|
|
OpenThread CLI RESP===> detached
|
||
|
|
OpenThread CLI RESP===> child
|
||
|
|
OpenThread CLI RESP===> router
|
||
|
|
OpenThread CLI RESP===> router
|
||
|
|
...
|
||
|
|
```
|
||
|
|
|
||
|
|
The callback function processes each line of CLI response, showing the device state transitions from "disabled" to "detached" to "child" to "router" (or "leader").
|
||
|
|
|
||
|
|
## Using the Device
|
||
|
|
|
||
|
|
### Callback Mechanism
|
||
|
|
|
||
|
|
The example demonstrates the callback-based CLI interaction pattern:
|
||
|
|
|
||
|
|
1. **Callback Registration**: `OThreadCLI.onReceive(otReceivedLine)` registers a callback function
|
||
|
|
2. **Command Execution**: `OThreadCLI.println("state")` sends CLI commands
|
||
|
|
3. **Response Processing**: The callback function `otReceivedLine()` processes responses asynchronously
|
||
|
|
4. **Non-blocking**: The main loop continues while CLI responses are processed in the callback
|
||
|
|
|
||
|
|
### Device State Monitoring
|
||
|
|
|
||
|
|
The example continuously monitors the device state:
|
||
|
|
- Sends "state" command every second
|
||
|
|
- Callback processes the response
|
||
|
|
- Shows state transitions as the device joins the Thread network
|
||
|
|
|
||
|
|
### Customizing the Callback
|
||
|
|
|
||
|
|
You can modify the `otReceivedLine()` function to:
|
||
|
|
- Parse specific CLI responses
|
||
|
|
- Extract data from CLI output
|
||
|
|
- Trigger actions based on CLI responses
|
||
|
|
- Filter or process specific response patterns
|
||
|
|
|
||
|
|
## Code Structure
|
||
|
|
|
||
|
|
The onReceive example consists of the following main components:
|
||
|
|
|
||
|
|
1. **`otReceivedLine()` callback function**:
|
||
|
|
- Reads all available data from OpenThread CLI
|
||
|
|
- Filters out empty lines (EOL sequences)
|
||
|
|
- Prints non-empty lines with a prefix
|
||
|
|
|
||
|
|
2. **`setup()`**:
|
||
|
|
- Initializes Serial communication
|
||
|
|
- Starts OpenThread stack with `OpenThread.begin()` (auto-start)
|
||
|
|
- Initializes OpenThread CLI
|
||
|
|
- Registers the callback function using `OThreadCLI.onReceive(otReceivedLine)`
|
||
|
|
|
||
|
|
3. **`loop()`**:
|
||
|
|
- Sends "state" CLI command every second using `OThreadCLI.println("state")`
|
||
|
|
- The callback function processes the response asynchronously
|
||
|
|
- Non-blocking operation allows other tasks to run
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
- **No callback responses**: Ensure the callback is registered in setup. Check that OpenThread CLI is initialized.
|
||
|
|
- **Empty lines in output**: The callback filters empty lines, which is normal behavior
|
||
|
|
- **State not changing**: Wait for the device to join the Thread network. First device becomes Leader, subsequent devices become Router or Child.
|
||
|
|
- **No serial output**: Check baudrate (115200) and USB connection
|
||
|
|
|
||
|
|
## Related Documentation
|
||
|
|
|
||
|
|
- [OpenThread CLI Helper Functions API](https://docs.espressif.com/projects/arduino-esp32/en/latest/openthread/openthread_cli.html)
|
||
|
|
- [OpenThread Core API](https://docs.espressif.com/projects/arduino-esp32/en/latest/openthread/openthread_core.html)
|
||
|
|
- [OpenThread Overview](https://docs.espressif.com/projects/arduino-esp32/en/latest/openthread/openthread.html)
|
||
|
|
|
||
|
|
## License
|
||
|
|
|
||
|
|
This example is licensed under the Apache License, Version 2.0.
|