OpenThread: Difference between revisions
No edit summary |
No edit summary |
||
(21 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
<!-- Set release according to "release" parameter in URL and use mx93-yocto-langdale-6.1.1_1.0.1-v1. | <!-- Set release according to "release" parameter in URL and use mx93-yocto-langdale-6.1.1_1.0.1-v1.2 as default | ||
--> {{INIT_RELEASE_PARAM|mx93-yocto-langdale-6.1.1_1.0.1-v1. | --> {{INIT_RELEASE_PARAM|mx93-yocto-langdale-6.1.1_1.0.1-v1.2}}<!-- | ||
--> {{#lst:Yocto_Platform_Customization|{{#var:RELEASE_PARAM}}}} <!-- | --> {{#lst:Yocto_Platform_Customization|{{#var:RELEASE_PARAM}}}} <!-- | ||
--> {{#lst:Debian_Platform_Customization|{{#var:RELEASE_PARAM}}}} <!-- | --> {{#lst:Debian_Platform_Customization|{{#var:RELEASE_PARAM}}}} <!-- | ||
Line 12: | Line 12: | ||
{{#vardefine:SPIDEV|/dev/spidev1.0}} | {{#vardefine:SPIDEV|/dev/spidev1.0}} | ||
}} <!-- | }} <!-- | ||
--> {{#vardefine:EVKA|{{#var:MACHINE_NAME}}-a}} <!-- | |||
--> {{#vardefine:EVKB|{{#var:MACHINE_NAME}}-b}} <!-- | |||
-->{{DocImage|category1=Yocto|category2=Debian}}[[Category:VAR-SOM-MX93]] __toc__ | -->{{DocImage|category1=Yocto|category2=Debian}}[[Category:VAR-SOM-MX93]] __toc__ | ||
Line 23: | Line 23: | ||
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 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 ({{#var:SOC}}) and communicates with the 802.15.4 coprocessor via OpenThread Daemon (ot-daemon) | The OpenThread core runs on the host processor ({{#var:SOC}}) 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 = | = Configuring ot-daemon = | ||
Line 56: | Line 56: | ||
== Create OpenThread network using ot-ctl == | == Create OpenThread network using ot-ctl == | ||
Reset to factory settings: | |||
root@{{#var:EVKA}}:~# ot-ctl factoryreset && sleep 2 | |||
Set Channel to 26: | |||
root@{{#var:EVKA}}:~# ot-ctl channel 26 | |||
Done | |||
Set PAN ID to 0x1234: | |||
root@{{#var:EVKA}}:~# ot-ctl panid 0x1234 | |||
Done | |||
Set Extended PAN ID: | |||
root@{{#var:EVKA}}:~# ot-ctl extpanid dead00beef00cafe | |||
Done | |||
Generate a new networkkey (this will change everytime): | |||
root@{{#var:EVKA}}:~# ot-ctl networkkey | |||
c9ca829c5a194f86e141a8721f1f38aa | |||
Done | |||
Set Network Name to "ThreadTest": | |||
root@{{#var:EVKA}}:~# ot-ctl networkname ThreadTest | |||
Done | |||
Enable Network Interface: | |||
root@{{#var:EVKA}}:~# ot-ctl ifconfig up | |||
Done | |||
Start Thread: | |||
root@{{#var:EVKA}}:~# ot-ctl thread start | |||
Done | |||
Print the State: | |||
root@{{#var:EVKA}}:~# ot-ctl state | |||
detached | |||
...wait a few seconds... | |||
root@{{#var:EVKA}}:~# 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: | 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: | ||
Line 67: | Line 106: | ||
== Connect to OpenThread network using ot-ctl == | == Connect to OpenThread network using ot-ctl == | ||
Reset to factory defaults: | |||
root@{{#var:EVKB}}:~# ot-ctl factoryreset && sleep 2 | |||
Set Channel to 26: | |||
root@{{#var:EVKB}}:~# ot-ctl channel 26 | |||
Done | |||
Set PAN ID to 0x1234: | |||
root@{{#var:EVKB}}:~# ot-ctl panid 0x1234 | |||
Done | |||
Set Extended PAN ID: | |||
root@{{#var:EVKB}}:~# ot-ctl extpanid dead00beef00cafe | |||
Done | |||
Use the Network Key printed by the server: | |||
root@{{#var:EVKB}}:~# ot-ctl networkkey c9ca829c5a194f86e141a8721f1f38aa | |||
Done | |||
Set Network Name to "ThreadTest": | |||
root@{{#var:EVKB}}:~# ot-ctl networkname ThreadTest | |||
Done | |||
Enable Network Interface: | |||
root@{{#var:EVKB}}:~# ot-ctl ifconfig up | |||
Done | |||
Start Thread: | |||
root@{{#var:EVKB}}:~# ot-ctl thread start | |||
Done | |||
Set Client Mode to "Router Eligible" (rn): | |||
root@{{#var:EVKB}}:~# ot-ctl mode rn | |||
Scan for available networks: | |||
root@{{#var:EVKB}}:~# ot-ctl scan | |||
| PAN | MAC Address | Ch | dBm | LQI | | |||
+------+------------------+----+-----+-----+ | |||
| 1234 | 12c8abdf0f9fe7ee | 26 | -45 | 137 | | |||
Done | |||
Print the State: | |||
root@{{#var:EVKA}}:~# ot-ctl state | |||
detached | |||
...wait a few seconds... | |||
root@{{#var:EVKA}}:~# 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: | 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@{{#var:EVKB}}# /etc/openthread/variscite-ot-client start c9ca829c5a194f86e141a8721f1f38aa | root@{{#var:EVKB}}:~# /etc/openthread/variscite-ot-client start c9ca829c5a194f86e141a8721f1f38aa | ||
Scanning for available networks: | Scanning for available networks: | ||
| PAN | MAC Address | Ch | dBm | LQI | | | PAN | MAC Address | Ch | dBm | LQI | | ||
+------+------------------+----+-----+-----+ | +------+------------------+----+-----+-----+ | ||
| 1234 | 962ba3d53bbc9bb6 | 26 | -46 | 133 | | | 1234 | 962ba3d53bbc9bb6 | 26 | -46 | 133 | | ||
Done | 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 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 | State is child, connected to the network | ||
Once connected, you can | == Verify to OpenThread connection == | ||
=== Print neighbor and child tables === | |||
Once connected, you can see '''{{#var:EVKB}}''' in '''{{#var:EVKA}}'s''' neighbor table: | |||
Print '''{{#var:EVKB}}'s''' Extended MAC Address: | |||
root@{{#var:EVKB}}:~# ot-ctl eui64 | |||
5affa2feffef2650 | |||
Done | |||
Print '''{{#var:EVKA}}'s''' neighbor table: | |||
root@{{#var:EVKA}}:~# 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 | | |||
Done | |||
Print '''{{#var:EVKA}}'s''' child table: | |||
root@{{#var:EVKA}}:~# 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 | | |||
Done | |||
=== Ping {{#var:EVKA}} from {{#var:EVKB}} === | |||
First, print the IP Addresses of '''{{#var:EVKA}}''' and '''{{#var:EVKB}}'''. | |||
'''{{#var:EVKA}}''': | |||
root@{{#var:EVKA}}:~# 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) | |||
'''{{#var:EVKB}}''': | |||
root@{{#var:EVKA}}:~# 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 '''{{#var:EVKA}}''' (Leader) from '''{{#var:EVKB}}''' (Child) using the mesh-local address: | |||
root@{{#var:EVKB}}:~# ot-ctl ping fdde:ad00:beef:0:0:ff:fe00:0 | |||
16 bytes from fdde:ad00:beef:0:0:ff:fe00:0: icmp_seq=8 hlim=64 time=17ms | |||
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 17/17.0/17 ms. | |||
Done | |||
<!-- | |||
=== Run throughput test using iPerf tool === | |||
Start iPerf server at {{#var:EVKA}}: | |||
root@{{#var:EVKA}}:~# iperf -s -u -i 1 -w 400k -p5005 -V -B <mesh-local address of {{#var:EVKA}}> | |||
e.g. | |||
root@{{#var:EVKA}}:~# iperf -s -u -i 1 -w 400k -p5005 -V -B fdde:ad00:beef:0:0:ff:fe00:0 | |||
------------------------------------------------------------ | |||
Server listening on UDP port 5005 | |||
Binding to local address fdde:ad00:beef:0:0:ff:fe00:0 | |||
Receiving 1470 byte datagrams | |||
UDP buffer size: 781 KByte (WARNING: requested 391 KByte) | |||
------------------------------------------------------------ | |||
Start iPerf client at {{#var:EVKB}}: | |||
root@{{#var:EVKB}}:~# iperf -c <{{#var:EVKA}}> -B <mesh-local address of {{#var:EVKB}}> -u -b 250k -l500 -V -i1 -t 20 -p5005 | |||
e.g. | |||
root@{{#var:EVKB}}:~# iperf -c fdde:ad00:beef:0:f5f2:aaeb:8a8c:a9fc -B fdde:ad00:beef:0:c177:ef1:a128:7d09 -u -b 250k -l500 -V -i1 -t 20 -p5005 | |||
------------------------------------------------------------ | |||
Client connecting to fdde:ad00:beef:0:f5f2:aaeb:8a8c:a9fc, UDP port 5005 | |||
Binding to local address fdde:ad00:beef:0:c177:ef1:a128:7d09 | |||
Sending 500 byte datagrams, IPG target: 16000.00 us (kalman adjust) | |||
UDP buffer size: 12.0 MByte (default) | |||
------------------------------------------------------------ | |||
[ 3] local fdde:ad00:beef:0:c177:ef1:a128:7d09 port 33804 connected with | |||
fdde:ad00:beef:0:f5f2:aaeb:8a8c:a9fc port 5005 | |||
[ ID] Interval Transfer Bandwidth | |||
[ 3] 0.0- 1.0 sec 31.2 KBytes 256 Kbits/sec | |||
[ 3] 1.0- 2.0 sec 30.3 KBytes 248 Kbits/sec | |||
... | |||
[ 3] 18.0-19.0 sec 30.8 KBytes 252 Kbits/sec | |||
[ 3] 19.0-20.0 sec 30.3 KBytes 248 Kbits/sec | |||
[ 3] WARNING: did not receive ack of last datagram after 10 tries. | |||
[ 3] 0.0-20.0 sec 611 KBytes 250 Kbits/sec | |||
[ 3] Sent 1251 datagrams | |||
--> |
Latest revision as of 14:57, 4 December 2023
This page is using the default release mx93-yocto-langdale-6.1.1_1.0.1-v1.2.
To view this page for a specific Variscite SoM and software release, please follow these steps:
- Visit variwiki.com
- Select your SoM
- Select the software release
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:
systemctl <start|stop|restart|enable|disable> variscite-ot.service
For example, you can stop and disable the service:
# Stop the service systemctl stop variscite-ot # Start the service systemctl disable variscite-ot
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:
# ot-ctl extaddr 52fc4e6d3cd98e30 Done
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:
root@imx93-var-som-a:~# ot-ctl factoryreset && sleep 2
Set Channel to 26:
root@imx93-var-som-a:~# ot-ctl channel 26 Done
Set PAN ID to 0x1234:
root@imx93-var-som-a:~# ot-ctl panid 0x1234 Done
Set Extended PAN ID:
root@imx93-var-som-a:~# ot-ctl extpanid dead00beef00cafe Done
Generate a new networkkey (this will change everytime):
root@imx93-var-som-a:~# ot-ctl networkkey c9ca829c5a194f86e141a8721f1f38aa Done
Set Network Name to "ThreadTest":
root@imx93-var-som-a:~# ot-ctl networkname ThreadTest Done
Enable Network Interface:
root@imx93-var-som-a:~# ot-ctl ifconfig up Done
Start Thread:
root@imx93-var-som-a:~# ot-ctl thread start 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 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:
root@imx93-var-som-b:~# ot-ctl factoryreset && sleep 2
Set Channel to 26:
root@imx93-var-som-b:~# ot-ctl channel 26 Done
Set PAN ID to 0x1234:
root@imx93-var-som-b:~# ot-ctl panid 0x1234 Done
Set Extended PAN ID:
root@imx93-var-som-b:~# ot-ctl extpanid dead00beef00cafe Done
Use the Network Key printed by the server:
root@imx93-var-som-b:~# ot-ctl networkkey c9ca829c5a194f86e141a8721f1f38aa Done
Set Network Name to "ThreadTest":
root@imx93-var-som-b:~# ot-ctl networkname ThreadTest Done
Enable Network Interface:
root@imx93-var-som-b:~# ot-ctl ifconfig up Done
Start Thread:
root@imx93-var-som-b:~# ot-ctl thread start Done
Set Client Mode to "Router Eligible" (rn):
root@imx93-var-som-b:~# ot-ctl mode 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:
root@imx93-var-som-b:~# ot-ctl eui64 5affa2feffef2650 Done
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 |
Done
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 |
Done
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:
root@imx93-var-som-b:~# ot-ctl ping fdde:ad00:beef:0:0:ff:fe00:0 16 bytes from fdde:ad00:beef:0:0:ff:fe00:0: icmp_seq=8 hlim=64 time=17ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 17/17.0/17 ms. Done