802.15.4 OpenThread¶
VAR-SOM-MX93 OpenThread Overview¶
VAR-SOM-MX93 SoMs ordered with the WBE option feature an IW612 based tri-radio module that supports Wi-Fi 6, Bluetooth/Bluetooth Low Energy 5.2, and 802.15.4.
The 802.15.4 radio coprocessor is managed by OpenThread. Thread is an IPv6-based networking protocol designed for low-power Internet of Things devices in an IEEE802.15.4-2015 wireless mesh network. OpenThread released by Google is an open-source implementation of Thread.
The OpenThread core runs on the host processor (mx93) and communicates with the 802.15.4 coprocessor via OpenThread Daemon (ot-daemon) using SPI. Clients can connect to the ot-daemon UNIX socket and communicate using OpenThread CLI as a protocol.
Configuring ot-daemon¶
ot-daemon is started with the following command:
ot-daemon "spinel+spi:///dev/spidev1.0?gpio-int-device=4&gpio-int-line=29&gpio-reset-device=4_&gpio-reset-line=4_&spi-mode=0&spi-speed=1000000&spi-reset-delay=500" &
This is done automatically on boot by Variscite's ot-service and the scripts in /etc/openthread on boot. The service can be managed using systemd:
For example, you can stop and disable the service:
Managing OpenThread using ot-ctl¶
ot-ctl uses the ot-daemon UNIX socket and can be used to manage OpenThread. It requires that ot-daemon is first running. As a reminder, the variscite-ot service starts this by default.
For example, you can read the extended MAC address of your device:
The following sections demonstrate how to create a network on imx93-var-som-a and connect to the network on imx93-var-som-b.
Create OpenThread network using ot-ctl¶
Reset to factory settings:
Set Channel to 26:
Set PAN ID to 0x1234:
Set Extended PAN ID:
Generate a new networkkey (this will change everytime):
Set Network Name to "ThreadTest":
Enable Network Interface:
Start Thread:
Print the State:
root@imx93-var-som-a:~# ot-ctl state
detached
...wait a few seconds...
root@imx93-var-som-a:~# ot-ctl state
leader
Variscite provides an example script in /etc/openthread/variscite-ot-server to create an OpenThread network. It is only meant to be an example to accelerate the development process. For example:
root@# /etc/openthread/variscite-ot-server start
State is detached, waiting for state=leader
State is detached, waiting for state=leader
State is detached, waiting for state=leader
State is leader
Network key c9ca829c5a194f86e141a8721f1f38aa saved to /tmp/ot-wpan0.key
Connect to OpenThread network using ot-ctl¶
Reset to factory defaults:
Set Channel to 26:
Set PAN ID to 0x1234:
Set Extended PAN ID:
Use the Network Key printed by the server:
Set Network Name to "ThreadTest":
Enable Network Interface:
Start Thread:
Set Client Mode to "Router Eligible" (rn):
Scan for available networks:
root@imx93-var-som-b:~# ot-ctl scan
| PAN | MAC Address | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| 1234 | 12c8abdf0f9fe7ee | 26 | -45 | 137 |
Done
Print the State:
root@imx93-var-som-a:~# ot-ctl state
detached
...wait a few seconds...
root@imx93-var-som-a:~# ot-ctl state
child
Variscite provides an example script in /etc/openthread/variscite-ot-client to connect to an OpenThread network. It is only meant to be an example to accelerate the development process. For example:
root@imx93-var-som-b:~# /etc/openthread/variscite-ot-client start c9ca829c5a194f86e141a8721f1f38aa
Scanning for available networks:
| PAN | MAC Address | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| 1234 | 962ba3d53bbc9bb6 | 26 | -46 | 133 |
Done
State is detached, waiting to connect to the network
State is detached, waiting to connect to the network
State is detached, waiting to connect to the network
State is child, connected to the network
Verify to OpenThread connection¶
Print neighbor and child tables¶
Once connected, you can see imx93-var-som-b in imx93-var-som-a's neighbor table:
Print imx93-var-som-b's Extended MAC Address:
Print imx93-var-som-a's neighbor table:
root@imx93-var-som-a:~# ot-ctl neighbor table
| Role | RLOC16 | Age | Avg RSSI | Last RSSI |R|D|N| Extended MAC | Version |
+------+--------+-----+----------+-----------+-+-+-+------------------+---------+
| C | 0x8401 | 0 | -22 | 0 |1|0|1| 56c65fbdfa6e4a80 | 3 |
Print imx93-var-som-a's child table:
root@imx93-var-som-a:~# ot-ctl child table
| ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|D|N|Ver|CSL|QMsgCnt| Extended MAC |
+-----+--------+------------+------------+-------+------+-+-+-+---+---+-------+------------------+
| 3 | 0x8403 | 240 | 186 | 3 | 15 |1|0|1| 3| 0 | 0 | 56c65fbdfa6e4a80 |
Ping imx93-var-som-a from imx93-var-som-b¶
First, print the IP Addresses of imx93-var-som-a and imx93-var-som-b.
imx93-var-som-a:
root@imx93-var-som-a:~# ot-ctl ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00 # Leader's Anycast Locator (ALOC)
fdde:ad00:beef:0:0:ff:fe00:0 # Routing Locator (RLOC)
fdde:ad00:beef:0:f5f2:aaeb:8a8c:a9fc # Mesh-Local EID (ML-EID)
fe80:0:0:0:1442:b824:c762:fa70 # Link-Local Address (LLA)
imx93-var-som-b:
root@imx93-var-som-a:~# ot-ctl ipaddr
fdde:ad00:beef:0:0:ff:fe00:1 # Routing Locator (RLOC)
fdde:ad00:beef:0:c177:ef1:a128:7d09 # Mesh-Local EID (ML-EID)
fe80:0:0:0:54c6:5fbd:fa6e:4a80 # Link-Local Address (LLA)
Then, ping imx93-var-som-a (Leader) from imx93-var-som-b (Child) using the mesh-local address: