ESP Thread border router is a FreeRTOS-based implementation running on a combination of Espressif's Wi-Fi and 802.15.4 SoCs.
Hardware requirements:
- An ESP32 series Wi-Fi dev kit. (ESP32, ESP32-C3, ESP32-S2 or ESP32-S3)
- An ESP32-H2 dev kit for running RCP.
Hardware connection
The ESP32-H2 RCP will be connected to the border router via UART.

- Connect the ground PIN of ESP32 and ESP32-H2
- Connect PIN 4 of ESP32 to PIN TX of ESP32-H2
- Connect PIN 5 of ESP32 to PIN RX of ESP32-H2
Set up ESP-IDF
The code for running the ESP Thread border router is shipped with the Espressif development framework, ESP-IDF.
To set up the environment, please follow the official installation guide.
Build and flash the RCP
cd ${IDF_PATH}/examples/openthread/ot_rcp
idf.py --preview set-target esp32h2
idf.py build flash
Configure the Thread and the Wi-Fi network
The border router will automatically join the Wi-Fi network and create a new Thread network if there is not one in its storage. The network parameters can be configured in the config menu:
cd ${IDF_PATH}/examples/openthread/ot_br
idf.py menuconfig
The network configuration items are:
- Wi-Fi SSID and PSK: Example Connection Configuration > connect using Wi-Fi interface
- Thread network parameters: OpenThread network parameters
Build and run the border router
cd ${IDF_PATH}/examples/openthread/ot_br
idf.py build flash monitor
Now you'll see the border router output in the ESP32 monitor. It also provides an interactive OpenThread command line:
state
I(23374) OPENTHREAD:[INFO]-CLI-----: execute command: state
leader
Done
>
Supported features
- Border agent for external commissioners.
- IPv6 bidirectional connectivity.
- SRP service registration and advertising proxy.
- mDNS discovery proxy.
To set up a SRP client on a Thread end device and reach it from the Wi-Fi network, follow the border router codelab from step 4.
Note that all the ot-ctl
commands in the codelab need to be directly entered in the border router's command line.
For instance, for this command:
sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done
You would enter:
dataset active -x
I(13893332) OPENTHREAD:[INFO]-CLI-----: execute command: dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done