Создайте сеть Thread с помощью плат nRF52840 и OpenThread.

О практической работе
schedule88 минут
subjectПоследнее обновление: 15 августа 2025 г.
account_circleАвторы: Jeff Bumgardner

26b7f4f6b3ea0700.png

OpenThread , выпущенный Google, представляет собой реализацию сетевого протокола Thread® с открытым исходным кодом. Компания Google Nest выпустила OpenThread, чтобы сделать технологию, используемую в продуктах Nest, общедоступной для разработчиков и ускорить разработку продуктов для умного дома.

Спецификация Thread определяет надежный, безопасный и энергоэффективный протокол беспроводной связи между устройствами на базе IPv6 для домашних приложений. OpenThread реализует все сетевые уровни Thread, включая IPv6, 6LoWPAN, IEEE 802.15.4 с безопасностью MAC, установлением связей Mesh и маршрутизацией Mesh.

В этой лабораторной работе вы будете программировать OpenThread на реальном оборудовании, создавать и управлять сетью Thread, а также передавать сообщения между узлами.

4806d16a8c137c6d.jpeg

  • Сборка и прошивка двоичных файлов OpenThread CLI на платы разработки
  • Создание RCP, состоящего из машины Linux и платы разработки
  • Взаимодействие с RCP с использованием OpenThread Daemon и ot-ctl
  • Ручное управление узлами Thread с помощью GNU Screen и OpenThread CLI
  • Безопасный ввод в эксплуатацию устройств в сети Thread
  • Как работает многоадресная рассылка IPv6
  • Передача сообщений между узлами потока с помощью UDP

Что вам понадобится

Аппаратное обеспечение:

  • 3 платы разработки Nordic Semiconductor nRF52840
  • 3 кабеля USB-Micro-USB для соединения плат
  • Машина с Linux и как минимум 3 портами USB

Программное обеспечение:

  • GNU Toolchain
  • Инструменты командной строки Nordic nRF5x
  • Программное обеспечение Segger J-Link
  • OpenThread
  • Гит

2. Начало работы

Моделирование OpenThread

Прежде чем начать, вам, возможно, захочется ознакомиться с лабораторией моделирования OpenThread , чтобы ознакомиться с основными концепциями потоков и интерфейсом командной строки OpenThread.

Терминалы последовательного порта

Вы должны уметь подключаться к последовательному порту через терминал. В этой лабораторной работе используется GNU Screen и представлен обзор, но можно использовать и любое другое терминальное программное обеспечение.

Linux-машина

Эта лабораторная работа была разработана для использования машины Linux на базе i386 или x86 в качестве хоста для устройства сопроцессора (RCP) Thread и для прошивки всех плат Thread. Все этапы были протестированы в Ubuntu 14.04.5 LTS (Trusty Tahr).

Платы Nordic Semiconductor nRF52840

В этой лабораторной работе используются три платы nRF52840 PDK .

a6693da3ce213856.png

Мы используем SEGGER J-Link для программирования плат nRF52840, оснащенных встроенными модулями JTAG. Установите его на свой компьютер с Linux.

Загрузите подходящий для вашего компьютера пакет и установите его в нужное место. В Linux это /opt/SEGGER/JLink .

Установить инструменты командной строки nRF5x

Инструменты командной строки nRF5x позволяют прошивать двоичные файлы OpenThread на платы nRF52840. Установите соответствующую сборку nRF5x-Command-Line-Tools-<OS> на свой компьютер с Linux.

Поместите извлеченный пакет в корневую папку ~/

Установить ARM GNU Toolchain

Для сборки используется ARM GNU Toolchain.

Мы рекомендуем поместить распакованный архив в папку /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/ на вашем компьютере с Linux. Инструкции по установке см. в файле readme.txt архива.

Установка экрана (опционально)

Screen — это простой инструмент для доступа к устройствам, подключенным через последовательный порт. В этой лабораторной работе используется Screen, но вы можете использовать любое другое приложение-терминал последовательного порта.

$ sudo apt-get install screen

3. Клонирование репозиториев

OpenThread

Клонируйте и установите OpenThread. Команды script/bootstrap гарантируют установку набора инструментов и правильную настройку среды:

$ mkdir -p ~/src
$ cd ~/src
$ git clone --recursive https://github.com/openthread/openthread.git
$ cd openthread
$ ./script/bootstrap

Сборка демона OpenThread:

$ script/cmake-build posix -DOT_DAEMON=ON

Теперь вы готовы к сборке и прошивке OpenThread на платах nRF52840.

4. Настройте RCP Joiner

Сборка и прошивка

Создайте пример OpenThread nRF52840 с Joiner и встроенной функциональностью USB. Устройство использует роль Joiner для безопасной аутентификации и подключения к сети Thread. Встроенная поддержка USB позволяет использовать USB CDC ACM в качестве последовательного порта между nRF52840 и хостом.

Всегда сначала очищайте репозиторий предыдущих сборок, выполнив rm -rf build .

$ cd ~/src
$ git clone --recursive https://github.com/openthread/ot-nrf528xx.git
$ cd ot-nrf528xx
$ script/build nrf52840 USB_trans

Перейдите в каталог с двоичным файлом OpenThread RCP и преобразуйте его в шестнадцатеричный формат:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex

Подключите USB-кабель к отладочному порту Micro-USB рядом с контактом внешнего питания на плате nRF52840, а затем подключите его к компьютеру с Linux. Установите переключатель питания nRF на плате nRF52840 в положение VDD . При правильном подключении загорится светодиод LED5 .

20a3b4b480356447.png

Если это первая плата, подключенная к машине Linux, она отображается как последовательный порт /dev/ttyACM0 (все платы nRF52840 используют ttyACM для идентификатора последовательного порта).

$ ls /dev/ttyACM*
/dev/ttyACM0

Обратите внимание на серийный номер платы nRF52840, используемой для RCP:

c00d519ebec7e5f0.jpeg

Перейдите к папке с инструментами командной строки nRFx и прошейте шестнадцатеричный RCP-файл OpenThread на плату nRF52840, используя её серийный номер. Обратите внимание: если вы не укажете флаг --verify , вы увидите предупреждение о том, что процесс прошивки может завершиться ошибкой.

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924  --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset

В случае успешного выполнения генерируется следующий вывод:

Parsing hex file.
Erasing user available code and UICR flash areas.
Applying system reset.
Checking that the area to write is not protected.
Programing device.
Applying system reset.
Run.

Обозначьте доску как «RCP», чтобы в дальнейшем не путать роли на доске.

Подключиться к родному USB

Поскольку сборка OpenThread RCP позволяет использовать собственный USB CDC ACM в качестве последовательного транспорта, для связи с хостом RCP (машиной Linux) необходимо использовать порт USB nRF на плате nRF52840.

Отсоедините конец кабеля Micro-USB USB от отладочного порта платы nRF52840 с прошитой прошивкой, затем снова подключите его к порту Micro-USB nRF USB рядом с кнопкой RESET . Установите переключатель питания nRF в положение USB .

46e7b670d2464842.png

Запустить демон OpenThread

В проекте RCP используйте OpenThread Daemon для взаимодействия с устройством Thread и управления им. Запустите ot-daemon с флагом -v verbose, чтобы увидеть вывод журнала и убедиться, что он запущен:

$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
    'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'

В случае успеха ot-daemon в подробном режиме генерирует вывод, аналогичный следующему:

ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05
ot-daemon[12463]: Thread version: 4
ot-daemon[12463]: Thread interface: wpan0
ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10

Оставьте это окно терминала открытым, чтобы можно было просматривать журналы ot-daemon .

Используйте ot-ctl для взаимодействия с узлом RCP. ot-ctl использует тот же интерфейс командной строки, что и приложение OpenThread CLI. Таким образом, вы можете управлять узлами ot-daemon так же, как и другими имитируемыми устройствами Thread.

Во втором окне терминала запустите ot-ctl :

$ sudo ./build/posix/src/posix/ot-ctl
>

Проверьте state узла 2 (узел RCP), который вы запустили с помощью ot-daemon :

> state
disabled
Done

5. Настройте FTD

Два других узла Thread, используемых в этой практической работе, представляют собой полнопоточные устройства (FTD) на базе стандартной системы-на-кристалле (SoC). Одно устройство выполняет функции комиссара, обеспечивая безопасную аутентификацию и подключение устройств к сети. Другое устройство выполняет функции присоединителя, который комиссар может аутентифицировать в сети Thread.

Сборка и прошивка

Создайте пример OpenThread FTD для платформы nRF52840 с включенными ролями «Комиссар» и «Присоединяющийся»:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON

Перейдите в каталог с двоичным файлом OpenThread Full Thread Device (FTD) CLI и преобразуйте его в шестнадцатеричный формат:

$ cd ~/src/ot-nrf528xx/build/bin
$ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex

Подключите USB-кабель к порту Micro-USB рядом с контактом внешнего питания на плате nRF52840, а затем подключите его к машине с Linux. Если RCP всё ещё подключена к машине с Linux, новая плата должна отображаться как последовательный порт /dev/ttyACM1 (все платы nRF52840 используют ttyACM для идентификатора последовательного порта).

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1

Как и прежде, обратите внимание на серийный номер платы nRF52840, используемой для FTD:

c00d519ebec7e5f0.jpeg

Перейдите к местоположению инструментов командной строки nRFx и прошейте шестнадцатеричный файл OpenThread CLI FTD на плату nRF52840, используя серийный номер платы:

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

Назовите доску «Комиссар».

Подключиться к родному USB

Поскольку сборка OpenThread FTD позволяет использовать собственный USB CDC ACM в качестве последовательного транспорта, для связи с хостом RCP (машиной Linux) необходимо использовать порт USB nRF на плате nRF52840.

Отсоедините конец кабеля Micro-USB USB от отладочного порта платы nRF52840 с прошитой прошивкой, затем снова подключите его к порту Micro-USB nRF USB рядом с кнопкой RESET . Установите переключатель питания nRF в положение USB .

46e7b670d2464842.png

Проверить сборку

Проверьте успешность сборки, открыв интерфейс командной строки OpenThread с помощью GNU Screen из окна терминала.

$ screen /dev/ttyACM1

В новом окне нажмите клавишу Enter на клавиатуре несколько раз, чтобы открыть командную строку OpenThread > . Откройте интерфейс IPv6 и проверьте адреса:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:1cd6:87a9:cb9d:4b1d
Done

Используйте Ctrl+a →

d , чтобы отключиться от экрана командной строки FTD Commissioner и вернуться в терминал Linux для прошивки следующей платы. Чтобы снова войти в интерфейс командной строки, используйте screen -r в командной строке. Чтобы просмотреть список доступных экранов, используйте команду screen -ls :

$ screen -ls
There is a screen on:
        74182.ttys000.mylinuxmachine        (Detached)
1 Socket in /tmp/uscreens/S-username.

Настройка FTD Joiner

Повторите описанную выше процедуру для прошивки третьей платы nRF52840, используя существующую сборку ot-cli-ftd.hex . После этого обязательно подключите плату к ПК через USB-порт nRF и установите переключатель питания nRF в положение VDD .

Если два других узла подключены к машине Linux при подключении этой третьей платы, она должна отображаться как последовательный порт /dev/ttyACM2 :

$ ls /dev/ttyACM*
/dev/ttyACM0  /dev/ttyACM1  /dev/ttyACM2

Напишите на доске «Столяр».

При проверке с помощью Screen вместо создания нового экземпляра Screen из командной строки повторно подключитесь к существующему и создайте в нем новое окно (которое вы использовали для FTD Commissioner):

$ screen -r

Создайте новое окно в Screen с помощью Ctrl+a → c .

Появится новое приглашение командной строки. Откройте интерфейс командной строки OpenThread для FTD Joiner:

$ screen /dev/ttyACM2

В этом новом окне нажмите клавишу Enter на клавиатуре несколько раз, чтобы открыть командную строку OpenThread > . Откройте интерфейс IPv6 и проверьте адреса:

> ifconfig up
Done
> ipaddr
fe80:0:0:0:6c1e:87a2:df05:c240
Done

Теперь, когда FTD Joiner CLI находится в том же экземпляре Screen, что и FTD Commissioner, вы можете переключаться между ними с помощью сочетания клавиш Ctrl+a → n .

Используйте Ctrl+a →

d в любое время, чтобы выйти из экрана.

6. Настройка окна терминала

В дальнейшем вам придётся часто переключаться между устройствами Thread, поэтому убедитесь, что все они активны и легко доступны. До сих пор мы использовали Screen для доступа к двум FTD, и этот инструмент также позволяет разделить экран в одном окне терминала. Используйте это, чтобы увидеть, как один узел реагирует на команды, выполняемые на другом.

В идеале у вас должно быть четыре легкодоступных окна:

  1. служба ot-daemon / логи
  2. RCP Joiner через ot-ctl
  3. FTD Commissioner через OpenThread CLI
  4. FTD Joiner через OpenThread CLI

Если вы хотите использовать собственную конфигурацию терминала/последовательного порта или инструмент, переходите к следующему шагу. Настройте окна терминала для всех устройств наиболее удобным для вас способом.

Использование экрана

Для удобства использования запустите только один сеанс Screen. Один сеанс должен быть у вас уже при настройке обоих FTD.

Все команды в Screen начинаются с Ctrl+a.

Основные экранные команды:

Повторно подключитесь к сеансу Screen (из командной строки)

screen -r

Покинуть сеанс Screen

Ctrl+a → d

Создать новое окно в сеансе Screen

Ctrl+a → c

Переключение между окнами в одном сеансе Screen

Ctrl+a → n (вперед)Ctrl+a → p (назад)

Закрыть текущее окно в сеансе Screen

Ctrl+a → k

Разделенный экран

С помощью Screen вы можете разделить терминал на несколько окон:

f1cbf1258cf0a5a.png

Доступ к командам на screen осуществляется с помощью сочетания клавиш Ctrl+a. Каждая команда должна начинаться с этой комбинации клавиш.

Если вы точно следовали инструкциям Codelab, у вас должно быть два окна (FTD Commissioner и FTD Joiner) на одном экземпляре экрана. Чтобы разделить экран между ними, сначала войдите в существующий сеанс Screen:

$ screen -r

Вы должны использовать одно из устройств FTD. Выполните следующие действия на экране:

  1. Ctrl+a → S — разделить окно по горизонтали
  2. Ctrl+a → Tab для перемещения курсора в новое пустое окно
  3. Ctrl+a → n — переключить новое окно на следующее
  4. Если оно такое же, как в верхнем окне, нажмите Ctrl+a → n еще раз, чтобы просмотреть другое устройство FTD.

Теперь они оба видны. Переключайтесь между ними, используя сочетание клавиш Ctrl+a → Tab . Рекомендуется переименовать каждое окно, используя сочетание клавиш Ctrl+a → A чтобы избежать путаницы.

Расширенное использование

Для дальнейшего разделения экрана на квадранты и просмотра журналов ot-daemon и RCP Joiner ot-ctl эти службы должны быть запущены в том же экземпляре Screen. Для этого остановите ot-daemon и выйдите из ot-ctl , а затем перезапустите их в новых окнах Screen (Ctrl+a → c ).

Эта настройка не является обязательной и оставлена в качестве упражнения для пользователя.

Для разделения и перемещения между окнами используйте следующие команды:

Создать новое окно

Ctrl+a → c

Разделить окно по вертикали

Ctrl+a →

Разделить окно по горизонтали

Ctrl+a → S

Перейти к следующему отображаемому окну

Ctrl+a → Tab

Переключить отображаемое окно вперед или назад

Ctrl+a → n или p

Переименовать текущее окно

Ctrl+a → A

Выйти из Screen можно в любое время с помощью сочетания клавиш Ctrl+a → d , а повторно подключиться с помощью команды screen -r из командной строки.

Более подробную информацию об Screen см. в кратком справочнике GNU Screen .

7. Создайте сеть Thread.

Теперь, когда все окна и экраны терминала настроены, давайте создадим сеть потоков. В FTD Commissioner создайте новый набор данных Operational Dataset и сделайте его активным. Набор данных Operational Dataset — это конфигурация создаваемой сети потоков.

## FTD Commissioner ##
----------------------

> dataset init new
Done
> dataset
Active Timestamp: 1
Channel: 11
Channel Mask: 07fff800
Ext PAN ID: c0de7ab5c0de7ab5
Mesh Local Prefix: fdc0:de7a:b5c0/64
Network Key: 1234c0de7ab51234c0de7ab51234c0de
Network Name: OpenThread-c0de
PAN ID: 0xc0de
PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4
Security Policy: 0, onrcb
Done

Запишите сетевой ключ 1234c0de7ab51234c0de7ab51234c0de , который будет использоваться позже.

Зафиксируйте этот набор данных как активный:

> dataset commit active
Done

Откройте интерфейс IPv6:

> ifconfig up
Done

Запуск операции протокола потока:

> thread start
Done

Через мгновение проверьте состояние устройства. Оно должно быть «Лидером». Также получите RLOC16 для справки.

## FTD Commissioner ##
----------------------

> state
leader
Done
> rloc16
0c00
Done

Проверьте IPv6-адреса устройства:

## FTD Commissioner ##
----------------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:c00         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a    # Mesh-Local EID (ML-EID)
fe80:0:0:0:1cd6:87a9:cb9d:4b1d         # Link-Local Address (LLA)

Сеть «codelab» теперь видна при сканировании с других устройств Thread.

Из ot-ctl на RCP Joiner :

## RCP Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

Из OpenThread CLI на FTD Joiner :

## FTD Joiner ##
----------------

> scan
| PAN  | MAC Address      | Ch | dBm | LQI |
+------+------------------+----+-----+-----+
| c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Если сеть «codelab» не отображается в списке, попробуйте выполнить сканирование еще раз.

8. Добавьте RCP Joiner

Ввод потоков в эксплуатацию в сети не активен, а это значит, что нам потребуется добавить RCP Joiner в сеть потоков, которую мы только что создали, с помощью процесса ввода потоков в эксплуатацию по внешнему каналу.

На устройстве FTD Commissioner мы записали сетевой ключ, например, 1234c0de7ab51234c0de7ab51234c0de . Если вам потребуется снова найти сетевой ключ, выполните следующую команду на устройстве FTD Commissioner :

## FTD Commissioner ##

> dataset networkkey
1234c0de7ab51234c0de7ab51234c0de
Done

Затем на RCP Joiner установите сетевой ключ активного набора данных на сетевой ключ FTD Commissioner:

## RCP Joiner ##
----------------

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

Проверьте набор данных, чтобы убедиться, что он настроен правильно.

## RCP Joiner ##
----------------

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

Откройте Thread, чтобы RCP Joiner присоединился к сети «codelab». Подождите несколько секунд, проверьте состояние, RLOC16 и его IPv6-адреса:

## RCP Joiner ##
----------------

> ifconfig up
Done
> thread start
Done
> state
child
Done
> rloc16
0c01
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:0c01         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f    # Mesh-Local EID (ML-EID)
fe80:0:0:0:18e5:29b3:a638:943b          # Link-Local Address (LLA)
Done

Запишите адрес Mesh-Local IPv6 (в данном fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f ), он вам понадобится позже.

Вернитесь к FTD Commissioner и проверьте таблицы маршрутизаторов и дочерних устройств, чтобы убедиться, что оба устройства принадлежат одной сети. Используйте RLOC16 для определения RCP Joiner.

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  35 | 1ed687a9cb9d4b1d |

Done
> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|VER| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+---+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|  2| 1ae529b3a638943b |
Done

Проверьте связь с помощью ping-запроса на локальный адрес сети RCP Joiner (локальный адрес сети, полученный из выходных данных ipaddr RCP Joiner):

## FTD Commissioner ##
----------------------

> ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
> 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms

Теперь у нас есть сеть Thread, состоящая из двух узлов, что иллюстрируется следующей топологической схемой:

otcodelab_top01C_2nodes.png

Топологические диаграммы

По мере выполнения оставшейся части лабораторной работы мы будем показывать новую диаграмму топологии потоков при каждом изменении состояния сети. Роли узлов обозначаются следующим образом:

b75a527be4563215.png

Маршрутизаторы всегда имеют форму пятиугольника, а конечные устройства — круга. Цифры на каждом узле соответствуют идентификатору маршрутизатора или дочернего устройства, отображаемому в выходных данных CLI, в зависимости от текущей роли и состояния каждого узла в данный момент.

9. Закажите столяра FTD

Теперь добавим третье устройство Thread к сети «codelab». На этот раз мы воспользуемся более безопасным процессом внутриполосной настройки и разрешим подключение только устройству FTD Joiner.

На FTD Joiner получите eui64 , чтобы FTD Commissioner мог его идентифицировать:

## FTD Joiner ##
----------------

> eui64
2f57d222545271f1
Done

В FTD Commissioner запустите его и укажите eui64 устройства, которое может присоединиться, а также учётные данные Joiner, например, J01NME . Учётные данные Joiner — это специфичная для устройства строка, состоящая из заглавных букв и цифр (0–9 и AY, за исключением I, O, Q и Z для удобства чтения), длиной от 6 до 32 символов.

## FTD Commissioner ##
----------------------

> commissioner start
Done
> commissioner joiner add 2f57d222545271f1 J01NME
Done

Переключитесь на роль FTD Joiner . Начните роль Joiner, используя учетные данные Joiner, которые вы только что настроили на FTD Commissioner:

## FTD Joiner ##
----------------

> ifconfig up
Done
> joiner start J01NME
Done

Примерно через минуту вы получите подтверждение об успешной аутентификации:

## FTD Joiner ##
----------------

>
Join success

Откройте Thread, чтобы FTD Joiner присоединился к сети «codelab», и немедленно проверьте состояние и RLOC16:

## FTD Joiner ##
----------------

> thread start
Done
> state
child
Done
> rloc16
0c02
Done

Проверьте IPv6-адреса устройства. Обратите внимание, что ALOC отсутствует. Это связано с тем, что устройство не является лидером и не выполняет роль Anycast, требующую ALOC.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:c02         # Routing Locator (RLOC)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)

Немедленно переключитесь на FTD Commissioner и проверьте таблицы маршрутизатора и дочерних устройств, чтобы убедиться, что в сети «codelab» присутствуют три устройства:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         25 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   2 | 0x0c02 |        240 |         15 |     3 |   44 |1|1|1|1| e6cdd2d93249a243 |
Done

На основе RLOC16 устройство FTD Joiner подключилось к сети как конечное устройство (дочернее). Вот наша обновлённая топология:

otcodelab_top01C_ed01.png

10. Нить в действии

Устройства Thread в этой практической работе представляют собой особый тип полнопоточных устройств (FTD), называемых конечными устройствами с возможностью маршрутизатора (REED). Это означает, что они могут функционировать как маршрутизаторы или конечные устройства, а также могут преобразовываться из конечных устройств в маршрутизаторы.

Поток может поддерживать до 32 маршрутизаторов, но старается поддерживать количество маршрутизаторов в диапазоне от 16 до 23. Если REED подключается как конечное устройство (дочернее устройство), а количество маршрутизаторов меньше 16, то по истечении случайного периода времени в течение двух минут он автоматически повышает себя до маршрутизатора.

Если после добавления FTD Joiner в вашей сети Thread оказалось два дочерних элемента, подождите не менее двух минут, а затем перепроверьте таблицы маршрутизатора и дочерних элементов на FTD Commissioner :

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
Done

FTD-присоединяющийся (Extended MAC = e6cdd2d93249a243 ) повысил свой статус до маршрутизатора. Обратите внимание, что RLOC16 отличается ( b800 вместо 0c02 ). Это связано с тем, что RLOC16 основан на идентификаторе маршрутизатора и дочернем идентификаторе устройства. При переходе с конечного устройства на маршрутизатор значения его идентификатора маршрутизатора и дочернего идентификатора изменяются, как и RLOC16.

otcodelab_top01C.png

Подтвердите новое состояние и RLOC16 на FTD Joiner :

## FTD Joiner ##
----------------

> state
router
Done
> rloc16
b800
Done

Понижение версии FTD Joiner

Вы можете проверить это поведение, вручную понизив статус FTD Joiner с маршрутизатора обратно до конечного устройства. Измените состояние на дочернее и проверьте RLOC16:

## FTD Joiner ##
----------------

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Возвращаясь к FTD Commissioner , FTD Joiner теперь должен появиться в дочерней таблице (ID = 3). Он может даже появиться в обеих таблицах во время перехода:

## FTD Commissioner ##
----------------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |        3 |         0 |     0 |      0 |  50 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       63 |         0 |     3 |      3 |   1 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0x0c01 |        240 |         61 |     3 |   89 |1|1|1|1| 1ae529b3a638943b |
|   3 | 0x0c03 |        240 |         16 |     3 |   94 |1|1|1|1| e6cdd2d93249a243 |
Done

Через некоторое время он снова переключится на маршрутизатор с RLOC b800 .

otcodelab_top01C.png

Удалить лидера

Лидер избирается самостоятельно среди всех маршрутизаторов потоков. Это означает, что если текущий лидер удаляется из сети потоков, один из других маршрутизаторов становится новым лидером.

На FTD Commissioner завершите работу Thread, чтобы удалить его из сети Thread:

## FTD Commissioner ##
----------------------

> thread stop
Done
> ifconfig down
Done

В течение двух минут участник FTD становится новым лидером потока. Проверьте состояние и IPv6-адрес участника FTD, чтобы убедиться:

## FTD Joiner ##
----------------

> state
leader
Done
> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00       # Now it has the Leader ALOC!
fdc0:de7a:b5c0:0:0:ff:fe00:b800
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd
fe80:0:0:0:e4cd:d2d9:3249:a243
Done

otcodelab_top02C_01.png

Проверьте дочернюю таблицу. Обратите внимание на новый RLOC16. Это RCP Joiner, на что указывают его идентификатор и расширенный MAC-адрес. Чтобы сохранить целостность сети Thread, родительские маршрутизаторы были переключены с FTD Commissioner на FTD Joiner. В результате для RCP Joiner появился новый RLOC16 (поскольку его идентификатор маршрутизатора изменился с 3 на 46).

## FTD Joiner ##
----------------

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |         27 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

Возможно, вам придётся подождать несколько минут, пока RCP Joiner подключится к FTD Joiner в качестве дочернего элемента. Проверьте состояние и RLOC16, чтобы убедиться, что:

## RCP Joiner ##
--------------

> state
child
> rloc16
b801

Повторное присоединение комиссара FTD

Сеть Thread с двумя узлами — это не очень-то весело. Давайте вернём FTD Commissioner в строй.

На FTD Commissioner перезапустите ветку:

## FTD Commissioner ##
----------------------

> ifconfig up
Done
> thread start
Done

В течение двух минут он автоматически подключается к сети «codelab» как конечное устройство, а затем повышает себя до маршрутизатора.

## FTD Commissioner ##
----------------------

> state
router
Done

Проверьте таблицы маршрутизатора и дочерние таблицы на устройстве FTD Joiner, чтобы убедиться:

## FTD Joiner ##
----------------

> router table
| ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC     |
+----+--------+----------+-----------+-------+--------+-----+------------------+
|  3 | 0x0c00 |       63 |         0 |     3 |      3 |   0 | 1ed687a9cb9d4b1d |
| 46 | 0xb800 |       46 |         0 |     0 |      0 |  15 | e6cdd2d93249a243 |

> child table
| ID  | RLOC16 | Timeout    | Age        | LQ In | C_VN |R|S|D|N| Extended MAC     |
+-----+--------+------------+------------+-------+------+-+-+-+-+------------------+
|   1 | 0xb801 |        240 |        184 |     3 |  145 |1|1|1|1| 1ae529b3a638943b |
Done

otcodelab_top02C_02.png

Наша сеть Thread снова состоит из трех узлов.

11. Устранение неполадок

Управление сетью Thread с несколькими устройствами на разных терминалах или в разных окнах Screen может быть сложным. Воспользуйтесь этими советами, чтобы «сбросить» состояние сети или рабочего пространства при возникновении проблем.

Экран

Если вы запутались в настройках (слишком много окон Screen или экранов внутри Screen), продолжайте закрывать окна Screen сочетанием клавиш Ctrl+a → k, пока не останется ни одного, а screen -ls в командной строке не выведет сообщение No Sockets found . Затем заново создайте окна Screen для каждого устройства. Состояния устройств сохраняются даже при закрытии Screen.

Узлы потока

Если топология сети Thread не соответствует описанию в этой лабораторной работе или узлы по какой-то причине отключаются (возможно, из-за того, что машина Linux, на которой они работают, перешла в спящий режим), лучше всего остановить Thread, очистить сетевые учетные данные и начать заново с шага создания сети Thread .

Чтобы сбросить FTD:

## FTD Commissioner or FTD Joiner ##
------------------------------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

Сбросить RCP можно таким же образом через ot-ctl :

## RCP Joiner ##
----------------

> thread stop
Done
> ifconfig down
Done
> factoryreset
Done

12. Использование многоадресной рассылки

Многоадресная рассылка используется для одновременной передачи информации группе устройств. В сети Thread определённые адреса резервируются для многоадресной рассылки с различными группами устройств в зависимости от области действия.

IPv6-адрес

Объем

Доставлено в

ff02::1

Link-Local

Все FTD и MED

ff02::2

Link-Local

Все FTD и пограничные маршрутизаторы

ff03::1

Mesh-Local

Все FTD и MED

ff03::2

Mesh-Local

Все FTD и пограничные маршрутизаторы

Поскольку в этой лабораторной работе мы не используем пограничный маршрутизатор, давайте сосредоточимся на двух многоадресных адресах FTD и MED.

Область действия Link-Local охватывает все интерфейсы Thread, доступные посредством одной радиопередачи или одного «перехода». Топология сети определяет, какие устройства отвечают на пинг по адресу многоадресной рассылки ff02::1 .

Пинг ff02::1 от комиссара FTD :

## FTD Commissioner ##
----------------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms

В сети есть ещё два устройства (FTD Joiner и RCP Joiner), но FTD Commissioner получил только один ответ с локального адреса (LLA) FTD Joiner. Это означает, что FTD Joiner — единственное устройство, к которому FTD Commissioner может подключиться за один транзитный участок.

otcodelab_top02C_02_LL.png

Теперь выполните ping ff02::1 с FTD Joiner :

## FTD Joiner ##
----------------

> ping ff02::1
> 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms
8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms

Два ответа! Проверяя IPv6-адреса других устройств, мы видим, что первый (заканчивающийся на 4b1d ) — это LLA комиссара FTD, а второй (заканчивающийся на 943b ) — LLA члена RCP.

otcodelab_top02C_02_LL02.png

Это означает, что FTD Joiner напрямую подключен как к FTD Commissioner, так и к RCP Joiner, что подтверждает нашу топологию.

Mesh-Local

Область Mesh-Local охватывает все интерфейсы Thread, доступные в пределах одной сети Thread. Давайте посмотрим на ответы на пинг по мультикаст-адресу ff03::1 .

Пинг ff03::1 от комиссара FTD :

## FTD Commissioner ##
----------------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms

На этот раз комиссар FTD получил два ответа: один от локатора маршрутизации FTD Joiner (RLOC, оканчивающегося на b800 ) и один от локального идентификатора сети (EID) RCP Joiner (ML-EID, оканчивающегося на d55f ). Это связано с тем, что область действия локальной сети охватывает всю сеть Thread. Независимо от того, где в сети находится устройство, оно будет подписано на адрес ff03::1 .

otcodelab_top02C_02_ML.png

Выполните ping ff03::1 с FTD Joiner, чтобы подтвердить то же самое поведение:

## FTD Joiner ##
----------------

> ping ff03::1
> 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00: icmp_seq=2 hlim=64 time=11ms
8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=2 hlim=64 time=23ms

otcodelab_top02C_02_LL02.png

Обратите внимание на время отклика RCP Joiner в обоих ping-запросах. RCP Joiner потребовалось гораздо больше времени, чтобы добраться до FTD Commissioner (68 мс), чем до FTD Joiner (23 мс). Это связано с тем, что ему приходится совершать два перехода, чтобы добраться до FTD Commissioner, по сравнению с одним переходом для FTD Joiner.

Вы, возможно, также заметили, что многоадресный пинг по ячеистой сети дал ответ RLOC только для двух FTD, а не для RCP-присоединителя. Это связано с тем, что FTD являются маршрутизаторами внутри сети, а RCP — конечным устройством.

Проверьте состояние RCP Joiner , чтобы подтвердить:

## RCP Joiner ##
----------------

> state
child

13. Отправка сообщений по протоколу UDP

Одним из сервисов приложений, предоставляемых OpenThread, является протокол UDP (User Datagram Protocol), протокол транспортного уровня. Приложение, созданное на основе OpenThread, может использовать API UDP для передачи сообщений между узлами в сети Thread или другим устройствам во внешней сети (например, в Интернете, если в сети Thread используется граничный маршрутизатор).

UDP-сокеты доступны через интерфейс командной строки OpenThread. Давайте используем его для передачи сообщений между двумя FTD.

Получите адрес Mesh-Local EID для FTD Joiner . Мы используем этот адрес, поскольку он доступен из любой точки сети Thread.

## FTD Joiner ##
----------------

> ipaddr
fdc0:de7a:b5c0:0:0:ff:fe00:fc00        # Leader Anycast Locator (ALOC)
fdc0:de7a:b5c0:0:0:ff:fe00:b800        # Routing Locator (RLOC)
fe80:0:0:0:e4cd:d2d9:3249:a243         # Link-Local Address (LLA)
fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd    # Mesh-Local EID (ML-EID)
Done

Запустите UDP и привяжите его к сокету для любого адреса IPv6:

## FTD Joiner ##
----------------

> udp open
Done
> udp bind :: 1212

Переключитесь на FTD Commissioner , запустите UDP и подключитесь к сокету, который вы настроили на FTD Joiner, используя его ML-EID:

## FTD Commissioner ##
----------------------

> udp open
Done
> udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212
Done

UDP-соединение между двумя узлами должно быть активным. Отправьте сообщение от имени комиссара FTD:

## FTD Commissioner ##
----------------------

> udp send hellothere
Done

На FTD Joiner получено UDP-сообщение!

## FTD Joiner ##
----------------

> 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere

14. Поздравляем!

Вы создали физическую сеть Thread!

b915c433e7027cc7.png

Теперь вы знаете:

  • разница между типами устройств Thread, ролями и областями действия
  • как потоковые устройства управляют своими состояниями в сети
  • как передавать простые сообщения между узлами с использованием UDP

Следующие шаги

Используя эту лабораторную работу, попробуйте выполнить следующие упражнения:

  • Перепрошить плату FTD Joiner как MTD с помощью двоичного файла ot-cli-mtd и наблюдать, что она никогда не обновляется до маршрутизатора и не пытается стать лидером.
  • Добавьте больше устройств (попробуйте другую платформу!) в сеть и набросайте топологию, используя таблицы маршрутизаторов и дочерних устройств, а также пинги на адреса многоадресной рассылки.
  • Используйте писпинель для контроля НКП
  • Преобразуйте NCP в пограничный маршрутизатор с помощью OpenThread Border Router и подключите свою сеть Thread к Интернету.

Дальнейшее чтение

Посетите openthread.io и GitHub для получения разнообразных ресурсов OpenThread, включая:

  • Поддерживаемые платформы — откройте для себя все платформы, поддерживающие OpenThread.
  • Сборка OpenThread — дополнительные сведения о сборке и настройке OpenThread
  • Thread Primer — охватывает все концепции Thread, представленные в этой практической работе.

Ссылка: