OTBR Docker won’t start with ConBee II flashed with openthread‑r21 — Spinel timeouts / baud rate issues

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

:red_question_mark: 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.

:clipboard: 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.

:magnifying_glass_tilted_left: What I’ve ruled out

:check_mark: Permissions on /dev/ttyACM0 look correct (crw-rw---- root:dialout)
:check_mark: I’ve tried different baud rates
:check_mark: 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

:red_question_mark: What I need help with

  1. How can I verify that the ConBee II is actually running a working OpenThread RCP firmware?
  2. Is there a specific recommended baud rate for openthread‑r21 on ConBee II?
  3. Are there any known issues with this hardware + OTBR Docker image?
  4. 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!