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

1. Введение

26b7f4f6b3ea0700.png

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

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

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

4806d16a8c137c6d.jpeg

Что вы узнаете

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

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

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

  • 3 платы разработки Nordic Semiconductor nRF52840
  • 3 кабеля USB-Micro-USB для подключения плат.
  • Компьютер с Linux как минимум с 3 портами USB.

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

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

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

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

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

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

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

Linux-машина

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

Платы Nordic Semiconductor nRF52840

В этой Codelab используются три платы 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.

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

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

Экран установки (необязательно)

Screen — это простой инструмент для доступа к устройствам, подключенным через последовательный порт. В этой Codelab используется 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 . При правильном подключении светодиод 5 горит.

20a3b4b480356447.png

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

$ ls /dev/ttyACM*
/dev/ttyACM0

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

c00d519ebec7e5f0.jpeg

Перейдите к расположению инструментов командной строки nRFx и запишите шестнадцатеричный файл OpenThread RCP на плату 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 в качестве последовательного транспорта, вам необходимо использовать USB-порт nRF на плате nRF52840 для связи с хостом RCP (машиной Linux).

Отсоедините конец USB-кабеля Micro-USB от порта отладки прошитой платы nRF52840, затем снова подключите его к USB-порту Micro-USB nRF рядом с кнопкой 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=115200'

В случае успеха 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). В производственных настройках можно использовать wpantund , драйвер сетевого интерфейса производственного уровня, для управления экземплярами OpenThread NCP, но в этой кодовой лаборатории мы будем использовать ot-ctl , OpenThread CLI.

Одно устройство выполняет функцию комиссара для безопасной аутентификации и ввода устройств в эту сеть. Другое устройство функционирует как соединитель, который комиссар может аутентифицировать в сети потоков.

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

Создайте пример OpenThread FTD для платформы nRF52840 с включенными ролями Commissioner и Joiner:

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

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

$ 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 в качестве последовательного транспорта, необходимо использовать USB-порт nRF на плате nRF52840 для связи с хостом RCP (компьютером Linux).

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

46e7b670d2464842.png

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

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

$ screen /dev/ttyACM1 115200

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

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

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

d , чтобы отсоединиться от экрана CLI FTD Commissioner и вернуться к терминалу Linux, чтобы можно было прошить следующую плату. Чтобы повторно войти в CLI в любое время, используйте 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):

$ screen -r

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

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

$ screen /dev/ttyACM2 115200

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

screen -r

Выйти из сеанса экрана

Ctrl+а → d

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

Ctrl+а → c

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

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

Убить текущее окно в сеансе Screen

Ctrl+а → 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 и перезапустите их в новых окнах экрана (Ctrl+a → c ).

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

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

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

Ctrl+а → c

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

Ctrl+а →

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

Ctrl+а → S

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

Ctrl+a → Tab

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

Ctrl+a → n или p

Переименуйте текущее окно

Ctrl+а → A

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

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

7. Создайте сеть потоков.

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

## 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 на FTD Joiner :

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

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

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

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

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

На FTD Commissioner мы записали Network Key, например 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

Запишите локальный IPv6-адрес Mesh (здесь 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

Пропингуйте локальный адрес сети 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

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

otcodelab_top01C_2nodes.png

Диаграммы топологии

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

b75a527be4563215.png

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

9. Поручите столяру FTD

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

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

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

> eui64
2f57d222545271f1
Done

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

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

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

Переключитесь на FTD 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. Нить в действии

Потоковые устройства в этой лаборатории кода представляют собой особый вид полнопоточных устройств (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 Joiner (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 Joiner, чтобы убедиться:

## 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 в онлайн.

На 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 с несколькими устройствами в разных окнах терминала или экрана может быть сложным. Используйте эти советы, чтобы «сбросить» состояние сети или вашего рабочего пространства, если у вас возникнут проблемы.

Экран

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

Узлы резьбы

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

Чтобы сбросить 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

Ссылка-локальная

Все FTD и MED

ff02::2

Ссылка-локальная

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

ff03::1

Сетка-локальная

Все FTD и MED

ff03::2

Сетка-локальная

Все 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 получил только один ответ от локального адреса канала (LLA) FTD Joiner. Это означает, что FTD Joiner — единственное устройство, к которому FTD Commissioner может подключиться за один переход.

otcodelab_top02C_02_LL.png

Теперь пропингуйте 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 Joiner.

otcodelab_top02C_02_LL02.png

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

Mesh-Local

Область Mesh-Local включает в себя все интерфейсы потоков, доступные в одной сети потоков. Посмотрим ответы на пинг на многоадресный адрес 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 ) и один от Mesh-Local EID RCP Joiner (ML-EID, заканчивающийся на d55f ). Это связано с тем, что локальная область видимости сетки включает в себя всю сеть потоков. Независимо от того, где в сети находится устройство, оно будет подписано на адрес ff03::1 .

otcodelab_top02C_02_ML.png

Пропингуйте 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 (68 мс), чем для достижения FTD Joiner (23 мс). Это связано с тем, что ему нужно сделать два прыжка, чтобы достичь FTD Commissioner, по сравнению с одним прыжком для FTD Joiner.

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

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

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

> state
child

13. Отправка сообщений с помощью UDP

Одной из служб приложений, предоставляемых OpenThread, является протокол пользовательских датаграмм (UDP), протокол транспортного уровня. Приложение, созданное на основе OpenThread, может использовать UDP API для передачи сообщений между узлами в сети 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 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
  • как устройства Thread управляют своим состоянием в сети
  • как передавать простые сообщения между узлами с помощью UDP

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

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

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

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

Посетите openthread.io и GitHub , чтобы найти различные ресурсы OpenThread, в том числе:

Ссылка: