Создайте сеть потоков с платами 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 Routing.

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

4806d16a8c137c6d.jpeg

Что ты узнаешь

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

Что тебе понадобится

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

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

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

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

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

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

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

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

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

Машина Linux

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

Платы Nordic Semiconductor nRF52840

Это Codelab использует три nRF52840 PDK доски .

a6693da3ce213856.png

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

Загрузить пакет программного обеспечения и документации J-Link

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

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

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

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

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

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

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

Скачать переносимый архив 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 Daemon:

$ script/cmake-build posix -DOT_DAEMON=ON

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

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

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

Соберите пример OpenThread nRF52840 с соединителем и встроенными функциями USB. Устройство использует роль присоединения для безопасной аутентификации и ввода в эксплуатацию в сети 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. Установите переключатель источника питания СИФ на плате nRF52840 к VDD. При правильном соединении LED5 включен.

20a3b4b480356447.png

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

$ ls /dev/ttyACM*
/dev/ttyACM0

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

c00d519ebec7e5f0.jpeg

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

$ cd ~/nrfjprog/
$ ./nrfjprog -f nrf52 -s 683704924 --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 - порт СИФ на плате nRF52840 общаться с RCP хоста (Linux машины).

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

46e7b670d2464842.png

Запустить OpenThread Daemon

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

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

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

ot-daemon[228024]: Running OPENTHREAD/20191113-00831-gfb399104; POSIX; Jun  7 2020 18:05:15
ot-daemon[228024]: Thread version: 2
ot-daemon[228024]: RCP version: OPENTHREAD/20191113-00831-gfb399104; SIMULATION; Jun  7 2020 18:06:08

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

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

Во втором окне терминала, начать ot-ctl :

$ ./output/posix/bin/ot-ctl
>

Проверьте state узла , 2 (RCP узел) вы начали с ot-daemon :

> state
disabled
Done

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

Два других узла Thread, используемые в этой Codelab, представляют собой полнопоточные устройства (FTD) в стандартной архитектуре System-on-Chip (SoC). Они не используют wpantund , и пользователь вручную управляет ими с OpenThread CLI.

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

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

Создайте пример 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) и преобразуйте его в шестнадцатеричный формат:

$ 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 --chiperase --program \
       ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset

Обозначьте доску «Комиссар».

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

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

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

46e7b670d2464842.png

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

Проверьте успешность сборки, обратившись к OpenThread CLI с помощью 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 + a →

d отделяться от экрана FTD комиссара CLI и возврата к разъему , чтобы 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 сборки.

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

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

Обозначьте доску «Столяр».

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

$ screen -r

Создайте новое окно на экране с помощью 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 Столяр CLI в одном экземпляре экрана в качестве комиссара FTD, вы можете переключаться между ними с помощью Ctrl + A → n .

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

d в любое время для выхода из окна.

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

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

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

  1. ot-daemon услуг / журналы
  2. RCP Столяр с помощью ot-ctl
  3. FTD Уполномоченный по OpenThread CLI
  4. FTD Столяр через OpenThread CLI

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

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

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

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

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

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

screen -r

Выйти из сеанса Screen

CTRL + A → d

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

Ctrl + A → c

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

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

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

Ctrl + A → k

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

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

f1cbf1258cf0a5a.png

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

Если вы в точности следите за Codelab, у вас должно быть два окна (FTD Commissioner, FTD Joiner) на одном и том же экземпляре Screen. Чтобы разделить экран между двумя, сначала войдите в существующий сеанс 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 Столяр ot-ctl , эти услуги должны быть запущены в течение этого же экземпляра экрана. Чтобы сделать это, остановка ot-daemon и выхода ot-ctl , и перезапустить их в новых окнах экрана (Ctrl + A → c ).

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

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

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

Ctrl + A → c

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

Ctrl + A →

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

Ctrl + A → S

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

Ctrl + A → Tab

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

Ctrl + A → n или p

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

Ctrl + A → A

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

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

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

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

Обратите внимание на сеть Key 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
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |

Из OpenThread CLI на FTD Joiner:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

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

Можно заметить , что в обеих сканирование, сеть , как представляется, не соединимые (J колонки на RCP Столяре и FTD Столяре). Это только означает, что ввод в эксплуатацию потока не активен в сети. К нему по-прежнему можно подключиться по внеполосному каналу, введя сетевой ключ на присоединяемом устройстве вручную.

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

Давайте добавим RCP Joiner в только что созданную сеть Thread, используя внеполосный процесс. Сканирование сетей на RCP Joiner:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |

Чтобы присоединиться, установите сетевой ключ (мы только что получили от комиссара FTD) на RCP Joiner в его активном наборе данных.

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

> dataset networkkey 1234c0de7ab51234c0de7ab51234c0de
Done
> dataset commit active
Done

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

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

> dataset
Network Key: 1234c0de7ab51234c0de7ab51234c0de

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

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

> 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, проверьте маршрутизатор и дочерние таблицы , чтобы подтвердить оба устройства являются частью одной и той же сети. Используйте RLOC16 для идентификации присоединяемого RCP.

## 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 Столяр (сетчатый локального адрес , полученный из РКП столярные ipaddr выхода) для проверки подключения:

## 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 Joiner.

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

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 0 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | f65ae2853ff0c4e4 | 11 | -36 |  57 |

0 в столбце J указывает на то, что ввод в тему не активен на устройстве.

Давайте конкретизируем при вводе в эксплуатацию этого следующего устройства и разрешим присоединение только FTD Joiner. Тем не менее на FTD Столяр, получить eui64 , поэтому FTD комиссар может идентифицировать:

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

> eui64
2f57d222545271f1
Done

Об Уполномоченного FTD, начать комиссар и указать eui64 устройства , которое может присоединиться, вместе с Joiner удостоверением. Учетные данные присоединяемого - это кодовая фраза для конкретного устройства.

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

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

Переключитесь на FTD Столяр и повторное сканирование:

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

> scan
| J | Network Name     | Extended PAN     | PAN  | MAC Address      | Ch | dBm | LQI |
+---+------------------+------------------+------+------------------+----+-----+-----+
| 1 | OpenThread-c0de  | c0de7ab5c0de7ab5 | c0de | 1ed687a9cb9d4b1d | 11 | -45 | 196 |

Как указано в 1 в столбце J, резьба Ввод в настоящее время работает в сети. Начните роль присоединения с учетными данными присоединения, которые вы только что настроили в FTD Commissioner:

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

> ifconfig up
Done
> joiner start J01NME
Done

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

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

>
Join success

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

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

Если у вас двое детей в сети Thread после добавления УТД Столяра, подождите по крайней мере две минуты, а затем повторно проверить маршрутизатор и дочерние таблицы на комиссаре FTD:

## 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

Вы можете проверить это поведение вручную понижая УТД Столяр от заднего маршрутизатора к конечному устройству. Измените состояние на дочерний и проверьте RLOC16:

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

> state child
Done
> rloc16
0c03
Done

otcodelab_top01C_ed02.png

Вернувшись на комиссаре FTD, УТД Столяр должен появиться в детской таблице (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, закрыли тему , чтобы удалить его из сети Тема:

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

> thread stop
Done
> ifconfig down
Done

В течение двух минут, FTD Столяр становится новым лидером Thread. Проверьте состояние и 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. Чтобы сохранить целостность сети потока, он переключил родительские маршрутизаторы с уполномоченного FTD на объединяющего FTD. Это приводит к новому 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 Столяр прикрепить к FTD Столяр , как ребенок. Проверьте состояние и RLOC16, чтобы убедиться, что:

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

> state
child
> rloc16
b801

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

Сеть потоков с двумя узлами - не самое интересное. Давайте вернем комиссара FTD в онлайн.

Об Уполномоченном FTD, перезагружать тему:

## 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

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

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

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

Экран

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

Узлы потока

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

Чтобы сбросить 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 и пограничные маршрутизаторы

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

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

Ping 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. Это означает, что 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 УТД комиссара, а второй (окончание в 943b ) является LLA РКП Столярный.

otcodelab_top02C_02_LL02.png

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

Mesh-Local

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

Ping 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 комиссар получил два ответа, один из УТД столярные маршрутизации Locator (Rloc, оканчивающихся на b800 ) и один из Mesh-Local EID РКПА столярного (ML-Эйда, заканчиваясь в d55f ). Это потому, что локальная сетка охватывает всю сеть потоков. Независимо от того , где в сети устройство, он будет подписан на 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 потребовалось гораздо больше времени, чтобы связаться с Комиссаром FTD (68 мсек), чем соединению FTD (23 мсек). Это потому, что он должен сделать два прыжка, чтобы достичь комиссара FTD, по сравнению с одним прыжком для 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 Столяра. Мы используем этот адрес, потому что он доступен из любой точки сети 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, начать UDP, и подключить к гнезду вы установили на FTD Столяр, используя его 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 Столяр, сообщение UDP было получено!

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

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

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

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

b915c433e7027cc7.png

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

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

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

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

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

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

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

Ссылка: