Hi all,
I’m trying to run an OpenThread Border Router (OTBR) in Docker using a ConBee II stick flashed with OpenThread RCP firmware from this repo:
https://github.com/dresden-elektronik/openthread-r21
My setup
- Host: Linux (Docker)
- Device: ConBee II on
/dev/ttyACM0 - Firmware: Built and flashed from
openthread-r21(RCP) - OTBR image:
openthread/border-router:latest(Docker Hub) - Docker command I’m using:
docker rm -f otbr
docker run -d \
--name otbr \
--network host \
--privileged \
--device=/dev/ttyACM0 \
-e OTBR_RADIO_URL=spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200 \
openthread/border-router:latest
I’m also trying other baudrates (1000000, 2000000), but OTBR never stays up.
Logs from OTBR
docker run -d \
--name otbr \
--network host \
--privileged \
--device=/dev/ttyACM0 \
-e OTBR_RADIO_URL=spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=115200 \
openthread/border-router:latest
Error response from daemon: No such container: otbr
96ede88346c419ee83391ce5a15de51cd7ffa279a9b7cea5e29b0f8d39489f30
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service otbr-agent: starting
Configuring OpenThread firewall...
Configuring OpenThread NAT64...
Starting otbr-agent...
[NOTE]-AGENT---: Running 0.3.0-924d48f
[NOTE]-AGENT---: Thread version: 1.4.0
[NOTE]-AGENT---: Thread interface: wpan0
[NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=1000000
[NOTE]-AGENT---: Radio URL: trel://wlan0
[NOTE]-ILS-----: Infra link selected: wlan0
[INFO]-RCP_HOS-: OpenThread log level changed to 5
49d.18:11:25.524 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:0, cmd:RESET
49d.18:11:25.524 [D] P-SpinelDrive-: Waiting response: key=0
49d.18:11:27.526 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:27.526 [I] P-SpinelDrive-: co-processor self reset successfully
49d.18:11:27.526 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:27.526 [D] P-SpinelDrive-: Waiting response: key=1
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service otbr-agent: starting
Configuring OpenThread firewall...
Configuring OpenThread NAT64...
Starting otbr-agent...
[NOTE]-AGENT---: Running 0.3.0-924d48f
[NOTE]-AGENT---: Thread version: 1.4.0
[NOTE]-AGENT---: Thread interface: wpan0
[NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=1000000
[NOTE]-AGENT---: Radio URL: trel://wlan0
[NOTE]-ILS-----: Infra link selected: wlan0
[INFO]-RCP_HOS-: OpenThread log level changed to 5
49d.18:11:25.524 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:0, cmd:RESET
49d.18:11:25.524 [D] P-SpinelDrive-: Waiting response: key=0
49d.18:11:27.526 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:27.526 [I] P-SpinelDrive-: co-processor self reset successfully
49d.18:11:27.526 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:27.526 [D] P-SpinelDrive-: Waiting response: key=1
49d.18:11:29.528 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:29.528 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:29.528 [D] P-SpinelDrive-: Waiting response: key=1
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service otbr-agent: starting
Configuring OpenThread firewall...
Configuring OpenThread NAT64...
Starting otbr-agent...
[NOTE]-AGENT---: Running 0.3.0-924d48f
[NOTE]-AGENT---: Thread version: 1.4.0
[NOTE]-AGENT---: Thread interface: wpan0
[NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=1000000
[NOTE]-AGENT---: Radio URL: trel://wlan0
[NOTE]-ILS-----: Infra link selected: wlan0
[INFO]-RCP_HOS-: OpenThread log level changed to 5
49d.18:11:25.524 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:0, cmd:RESET
49d.18:11:25.524 [D] P-SpinelDrive-: Waiting response: key=0
49d.18:11:27.526 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:27.526 [I] P-SpinelDrive-: co-processor self reset successfully
49d.18:11:27.526 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:27.526 [D] P-SpinelDrive-: Waiting response: key=1
49d.18:11:29.528 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:29.528 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:29.528 [D] P-SpinelDrive-: Waiting response: key=1
49d.18:11:31.530 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:31.530 [C] Platform------: Init() at spinel_driver.cpp:87: Failure
49d.18:11:31.530 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:31.530 [D] P-SpinelDrive-: Waiting response: key=1
root@MICHAEL-YOGA:~/gcfflasher/build# docker logs otbr
s6-rc: info: service s6rc-oneshot-runner: starting
s6-rc: info: service s6rc-oneshot-runner successfully started
s6-rc: info: service fix-attrs: starting
s6-rc: info: service fix-attrs successfully started
s6-rc: info: service legacy-cont-init: starting
s6-rc: info: service legacy-cont-init successfully started
s6-rc: info: service otbr-agent: starting
Configuring OpenThread firewall...
Configuring OpenThread NAT64...
Starting otbr-agent...
[NOTE]-AGENT---: Running 0.3.0-924d48f
[NOTE]-AGENT---: Thread version: 1.4.0
[NOTE]-AGENT---: Thread interface: wpan0
[NOTE]-AGENT---: Radio URL: spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=1000000
[NOTE]-AGENT---: Radio URL: trel://wlan0
[NOTE]-ILS-----: Infra link selected: wlan0
[INFO]-RCP_HOS-: OpenThread log level changed to 5
49d.18:11:25.524 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:0, cmd:RESET
49d.18:11:25.524 [D] P-SpinelDrive-: Waiting response: key=0
49d.18:11:27.526 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:27.526 [I] P-SpinelDrive-: co-processor self reset successfully
49d.18:11:27.526 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:27.526 [D] P-SpinelDrive-: Waiting response: key=1
49d.18:11:29.528 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:29.528 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:29.528 [D] P-SpinelDrive-: Waiting response: key=1
49d.18:11:31.530 [W] P-SpinelDrive-: Wait for response timeout
49d.18:11:31.530 [C] Platform------: Init() at spinel_driver.cpp:87: Failure
49d.18:11:31.530 [D] P-SpinelDrive-: Sent spinel frame, flg:0x2, iid:0, tid:1, cmd:PROP_VALUE_GET, key:PROTOCOL_VERSION
49d.18:11:31.530 [D] P-SpinelDrive-: Waiting response: key=1
49d.18:11:33.530 [W] P-SpinelDrive-: Wait for response timeout
otbr-agent exited with code 1 (by signal 0).
Chain OT_FORWARD_INGRESS (0 references)
target prot opt source destination
DROP all -- anywhere anywhere PKTTYPE = unicast
DROP all -- anywhere anywhere match-set otbr-ingress-deny-src src
ACCEPT all -- anywhere anywhere match-set otbr-ingress-allow-dst dst
DROP all -- anywhere anywhere PKTTYPE = unicast
ACCEPT all -- anywhere anywhere
otbr-ingress-deny-src
otbr-ingress-deny-src-swap
otbr-ingress-allow-dst
otbr-ingress-allow-dst-swap
OpenThread firewall rules removed.
s6-svlisten1: fatal: /run/s6-rc/servicedirs/otbr-agent failed permanently or its supervisor died
s6-rc: warning: unable to start service otbr-agent: command exited 1
s6-rc: info: service legacy-cont-init: stopping
s6-rc: info: service legacy-cont-init successfully stopped
s6-rc: info: service fix-attrs: stopping
s6-rc: info: service fix-attrs successfully stopped
s6-rc: info: service s6rc-oneshot-runner: stopping
s6-rc: info: service s6rc-oneshot-runner successfully stopped
The container never settles and eventually exits or keeps timing out.
What I’ve ruled out
Permissions on /dev/ttyACM0 look correct (crw-rw---- root:dialout)
I’ve tried different baud rates
I know ConBee II can be flashed with openthread-r21 but I’m not sure the firmware is running/responding as a proper Spinel RCP
What I need help with
- How can I verify that the ConBee II is actually running a working OpenThread RCP firmware?
- Is there a specific recommended baud rate for openthread‑r21 on ConBee II?
- Are there any known issues with this hardware + OTBR Docker image?
- Are there config changes I’m missing (Docker ENV / host setup / network permissions)?
Happy to share more logs / firmware build output if needed.
Thanks in advance!