Создайте сеть потоков с платами nRF52840 и OpenThread

1. Введение

26b7f4f6b3ea0700.png

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

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

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

4806d16a8c137c6d.jpeg

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

  • Создание и прошивка двоичных файлов OpenThread CLI на досках разработки
  • Создание RCP, состоящего из машины Linux и платы разработки
  • Связь с RCP с использованием OpenThread Daemon и ot-ctl
  • Ручное управление узлами потока с помощью GNU Screen и интерфейса командной строки OpenThread
  • Безопасный ввод устройств в эксплуатацию в сети 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 , чтобы ознакомиться с основными понятиями Thread и интерфейсом командной строки OpenThread.

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

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

Linux-машина

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

Платы Nordic Semiconductor nRF52840

В этом Codelab используются три платы PDK nRF52840 .

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 для получения инструкций по установке.

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

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

$ 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 и запустите шестнадцатеричный файл 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, затем снова подключите его к порту Micro-USB nRF USB рядом с кнопкой RESET . Установите переключатель источника питания nRF в положение USB .

46e7b670d2464842.png

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

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

$ 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

Два других узла потока, используемые в этой лаборатории, представляют собой полнопоточные устройства (FTD) в стандартной конструкции System-on-Chip (SoC). В рабочей среде можно использовать wpantund , драйвер сетевого интерфейса производственного уровня, для управления экземплярами OpenThread NCP, но в этой лаборатории кода мы будем использовать ot-ctl , интерфейс командной строки OpenThread.

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

Построить и прошить

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

$ 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, затем снова подключите его к порту Micro-USB nRF USB рядом с кнопкой RESET . Установите переключатель источника питания nRF в положение USB .

46e7b670d2464842.png

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

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

$ screen /dev/ttyACM1 115200

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

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

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

d , чтобы отсоединиться от экрана интерфейса командной строки 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 Commissioner):

$ screen -r

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

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

$ screen /dev/ttyACM2 115200

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

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

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

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

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

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

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

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

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

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

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

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

Все команды на экране начинаются с сочетания клавиш 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 эти службы должны быть запущены в этом же экземпляре экрана. Для этого остановите ot-daemon и выйдите из ot-ctl и перезапустите их в новых окнах экрана (Ctrl+a → c ).

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

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

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

Ctrl+а → c

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

Ctrl+а →

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

Ctrl+а → S

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

Ctrl+a → Tab

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

Ctrl+a → n или p

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

Ctrl+а → A

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

Для получения дополнительной информации об экране см. краткий справочник по экрану GNU .

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

Теперь, когда у вас настроены все окна и экраны терминала, давайте создадим нашу сеть потоков. В FTD Commissioner создайте новый 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:

> 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

Поднимите поток, чтобы 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

Отправьте эхо-запрос на локальный адрес сетки RCP Joiner (локальный адрес Mesh, полученный из выходных данных 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

Схемы топологии

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

b75a527be4563215.png

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

9. Закажите FTD Joiner

Теперь давайте добавим третье устройство 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

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

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

Если у вас было два дочерних элемента в вашей сети Thread после добавления FTD Joiner, подождите не менее двух минут, а затем перепроверьте маршрутизатор и дочерние таблицы на 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 (расширенный 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 Joiner становится новым лидером потока. Проверьте состояние и 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. Это приводит к новому RLOC16 для RCP Joiner (поскольку его идентификатор маршрутизатора изменился с 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 перезапустите Thread:

## 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. Устранение неполадок

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

Экран

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

Узлы потока

Если топология сети Thread отличается от описанной в этой Codelab, или узлы по какой-то причине отключились (возможно, из-за того, что машина Linux, питающая их, перешла в спящий режим), лучше отключить Thread, очистить сетевые учетные данные и начать заново с Create . Шаг сети 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 включает в себя все интерфейсы потоков, достижимые с помощью одной радиопередачи или одного «прыжка». Топология сети определяет, какие устройства отвечают на эхо-запрос на многоадресный адрес 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 и соединитель RCP), но уполномоченный FTD получил только один ответ от локального адреса соединения (LLA) соединения FTD. Это означает, что 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 включает в себя все интерфейсы 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 ) и один от RCP Joiner's Mesh-Local EID (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 потребовалось гораздо больше времени, чтобы добраться до комиссара FTD (68 мс), чем для соединения соединителя FTD (23 мс). Это связано с тем, что для достижения комиссара FTD требуется два перехода по сравнению с одним переходом для соединения FTD.

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

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

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

> state
child

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

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

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

Получите адрес EID Mesh-Local для 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. Поздравляем!

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

b915c433e7027cc7.png

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

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

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

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

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

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

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

Ссылка: