1. Введение
OpenThread , выпущенный Google, представляет собой реализацию сетевого протокола Thread® с открытым исходным кодом. Компания Google Nest выпустила OpenThread, чтобы сделать технологию, используемую в продуктах Nest, общедоступной для разработчиков и ускорить разработку продуктов для умного дома.
Спецификация Thread определяет надежный, безопасный и энергоэффективный протокол беспроводной связи между устройствами на базе IPv6 для домашних приложений. OpenThread реализует все сетевые уровни Thread, включая IPv6, 6LoWPAN, IEEE 802.15.4 с безопасностью MAC, установлением связей Mesh и маршрутизацией Mesh.
В этой лабораторной работе вы будете программировать OpenThread на реальном оборудовании, создавать и управлять сетью Thread, а также передавать сообщения между узлами.
Чему вы научитесь
- Сборка и прошивка двоичных файлов OpenThread CLI на платы разработки
- Создание RCP, состоящего из машины Linux и платы разработки
- Взаимодействие с RCP с использованием OpenThread Daemon и
ot-ctl
- Ручное управление узлами Thread с помощью GNU Screen и OpenThread CLI
- Безопасный ввод в эксплуатацию устройств в сети Thread
- Как работает многоадресная рассылка IPv6
- Передача сообщений между узлами потока с помощью UDP
Что вам понадобится
Аппаратное обеспечение:
- 3 платы разработки Nordic Semiconductor nRF52840
- 3 кабеля USB-Micro-USB для соединения плат
- Машина с Linux и как минимум 3 портами USB
Программное обеспечение:
- GNU Toolchain
- Инструменты командной строки Nordic nRF5x
- Программное обеспечение Segger J-Link
- OpenThread
- Гит
2. Начало работы
Моделирование OpenThread
Прежде чем начать, вам, возможно, захочется ознакомиться с лабораторией моделирования OpenThread , чтобы ознакомиться с основными концепциями потоков и интерфейсом командной строки OpenThread.
Терминалы последовательного порта
Вы должны уметь подключаться к последовательному порту через терминал. В этой лабораторной работе используется GNU Screen и представлен обзор, но можно использовать и любое другое терминальное программное обеспечение.
Linux-машина
Эта лабораторная работа была разработана для использования машины Linux на базе i386 или x86 в качестве хоста для устройства сопроцессора (RCP) Thread и для прошивки всех плат Thread. Все этапы были протестированы в Ubuntu 14.04.5 LTS (Trusty Tahr).
Платы Nordic Semiconductor nRF52840
В этой лабораторной работе используются три платы nRF52840 PDK .
Установить SEGGER J-Link
Мы используем SEGGER J-Link для программирования плат nRF52840, оснащенных встроенными модулями JTAG. Установите его на свой компьютер с Linux.
Загрузите подходящий для вашего компьютера пакет и установите его в нужное место. В Linux это /opt/SEGGER/JLink
.
Установить инструменты командной строки nRF5x
Инструменты командной строки nRF5x позволяют прошивать двоичные файлы OpenThread на платы nRF52840. Установите соответствующую сборку nRF5x-Command-Line-Tools-<OS> на свой компьютер с Linux.
Поместите извлеченный пакет в корневую папку ~/
Установить ARM GNU Toolchain
Для сборки используется ARM GNU Toolchain.
Мы рекомендуем поместить распакованный архив в папку /opt/gnu-mcu-eclipse/arm-none-eabi-gcc/
на вашем компьютере с Linux. Инструкции по установке см. в файле readme.txt
архива.
Установка экрана (опционально)
Screen — это простой инструмент для доступа к устройствам, подключенным через последовательный порт. В этой лабораторной работе используется Screen, но вы можете использовать любое другое приложение-терминал последовательного порта.
$ sudo apt-get install screen
3. Клонирование репозиториев
OpenThread
Клонируйте и установите OpenThread. Команды script/bootstrap
гарантируют установку набора инструментов и правильную настройку среды:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
Сборка демона OpenThread:
$ script/cmake-build posix -DOT_DAEMON=ON
Теперь вы готовы к сборке и прошивке OpenThread на платах nRF52840.
4. Настройте RCP Joiner
Сборка и прошивка
Создайте пример OpenThread nRF52840 с Joiner и встроенной функциональностью USB. Устройство использует роль Joiner для безопасной аутентификации и подключения к сети Thread. Встроенная поддержка USB позволяет использовать USB CDC ACM в качестве последовательного порта между nRF52840 и хостом.
Всегда сначала очищайте репозиторий предыдущих сборок, выполнив rm -rf build
.
$ cd ~/src $ git clone --recursive https://github.com/openthread/ot-nrf528xx.git $ cd ot-nrf528xx $ script/build nrf52840 USB_trans
Перейдите в каталог с двоичным файлом OpenThread RCP и преобразуйте его в шестнадцатеричный формат:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-rcp ot-rcp.hex
Подключите USB-кабель к отладочному порту Micro-USB рядом с контактом внешнего питания на плате nRF52840, а затем подключите его к компьютеру с Linux. Установите переключатель питания nRF на плате nRF52840 в положение VDD . При правильном подключении загорится светодиод LED5 .
Если это первая плата, подключенная к машине Linux, она отображается как последовательный порт /dev/ttyACM0
(все платы nRF52840 используют ttyACM
для идентификатора последовательного порта).
$ ls /dev/ttyACM* /dev/ttyACM0
Обратите внимание на серийный номер платы nRF52840, используемой для RCP:
Перейдите к папке с инструментами командной строки nRFx и прошейте шестнадцатеричный RCP-файл OpenThread на плату nRF52840, используя её серийный номер. Обратите внимание: если вы не укажете флаг --verify
, вы увидите предупреждение о том, что процесс прошивки может завершиться ошибкой.
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-rcp.hex --reset
В случае успешного выполнения генерируется следующий вывод:
Parsing hex file. Erasing user available code and UICR flash areas. Applying system reset. Checking that the area to write is not protected. Programing device. Applying system reset. Run.
Обозначьте доску как «RCP», чтобы в дальнейшем не путать роли на доске.
Подключиться к родному USB
Поскольку сборка OpenThread RCP позволяет использовать собственный USB CDC ACM в качестве последовательного транспорта, для связи с хостом RCP (машиной Linux) необходимо использовать порт USB nRF на плате nRF52840.
Отсоедините конец кабеля Micro-USB USB от отладочного порта платы nRF52840 с прошитой прошивкой, затем снова подключите его к порту Micro-USB nRF USB рядом с кнопкой RESET . Установите переключатель питания nRF в положение USB .
Запустить демон OpenThread
В проекте RCP используйте OpenThread Daemon для взаимодействия с устройством Thread и управления им. Запустите ot-daemon
с флагом -v
verbose, чтобы увидеть вывод журнала и убедиться, что он запущен:
$ cd ~/src/openthread $ sudo ./build/posix/src/posix/ot-daemon -v \ 'spinel+hdlc+uart:///dev/ttyACM0?uart-baudrate=460800'
В случае успеха ot-daemon
в подробном режиме генерирует вывод, аналогичный следующему:
ot-daemon[12463]: Running OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; POSIX; Aug 30 2022 10:55:05 ot-daemon[12463]: Thread version: 4 ot-daemon[12463]: Thread interface: wpan0 ot-daemon[12463]: RCP version: OPENTHREAD/thread-reference-20200818-1938-g0f10480ed; SIMULATION; Aug 30 2022 10:54:10
Оставьте это окно терминала открытым, чтобы можно было просматривать журналы ot-daemon
.
Используйте ot-ctl
для взаимодействия с узлом RCP. ot-ctl
использует тот же интерфейс командной строки, что и приложение OpenThread CLI. Таким образом, вы можете управлять узлами ot-daemon
так же, как и другими имитируемыми устройствами Thread.
Во втором окне терминала запустите ot-ctl
:
$ sudo ./build/posix/src/posix/ot-ctl >
Проверьте state
узла 2 (узел RCP), который вы запустили с помощью ot-daemon
:
> state disabled Done
5. Настройте FTD
Два других узла Thread, используемых в этой практической работе, представляют собой полнопоточные устройства (FTD) на базе стандартной системы-на-кристалле (SoC). Одно устройство выполняет функции комиссара, обеспечивая безопасную аутентификацию и подключение устройств к сети. Другое устройство выполняет функции присоединителя, который комиссар может аутентифицировать в сети Thread.
Сборка и прошивка
Создайте пример OpenThread FTD для платформы nRF52840 с включенными ролями «Комиссар» и «Присоединяющийся»:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON
Перейдите в каталог с двоичным файлом OpenThread Full Thread Device (FTD) CLI и преобразуйте его в шестнадцатеричный формат:
$ cd ~/src/ot-nrf528xx/build/bin $ arm-none-eabi-objcopy -O ihex ot-cli-ftd ot-cli-ftd.hex
Подключите USB-кабель к порту Micro-USB рядом с контактом внешнего питания на плате nRF52840, а затем подключите его к машине с Linux. Если RCP всё ещё подключена к машине с Linux, новая плата должна отображаться как последовательный порт /dev/ttyACM1
(все платы nRF52840 используют ttyACM
для идентификатора последовательного порта).
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1
Как и прежде, обратите внимание на серийный номер платы nRF52840, используемой для FTD:
Перейдите к местоположению инструментов командной строки nRFx и прошейте шестнадцатеричный файл OpenThread CLI FTD на плату nRF52840, используя серийный номер платы:
$ cd ~/nrfjprog/ $ ./nrfjprog -f nrf52 -s 683704924 --verify --chiperase --program \ ~/src/ot-nrf528xx/build/bin/ot-cli-ftd.hex --reset
Назовите доску «Комиссар».
Подключиться к родному USB
Поскольку сборка OpenThread FTD позволяет использовать собственный USB CDC ACM в качестве последовательного транспорта, для связи с хостом RCP (машиной Linux) необходимо использовать порт USB nRF на плате nRF52840.
Отсоедините конец кабеля Micro-USB USB от отладочного порта платы nRF52840 с прошитой прошивкой, затем снова подключите его к порту Micro-USB nRF USB рядом с кнопкой RESET . Установите переключатель питания nRF в положение USB .
Проверить сборку
Проверьте успешность сборки, открыв интерфейс командной строки OpenThread с помощью GNU Screen из окна терминала.
$ screen /dev/ttyACM1
В новом окне нажмите клавишу Enter на клавиатуре несколько раз, чтобы открыть командную строку OpenThread >
. Откройте интерфейс IPv6 и проверьте адреса:
> ifconfig up Done > ipaddr fe80:0:0:0:1cd6:87a9:cb9d:4b1d Done
Используйте Ctrl+a →
d
, чтобы отключиться от экрана командной строки FTD Commissioner и вернуться в терминал Linux для прошивки следующей платы. Чтобы снова войти в интерфейс командной строки, используйте screen -r
в командной строке. Чтобы просмотреть список доступных экранов, используйте команду screen -ls
:
$ screen -ls There is a screen on: 74182.ttys000.mylinuxmachine (Detached) 1 Socket in /tmp/uscreens/S-username.
Настройка FTD Joiner
Повторите описанную выше процедуру для прошивки третьей платы nRF52840, используя существующую сборку ot-cli-ftd.hex
. После этого обязательно подключите плату к ПК через USB-порт nRF и установите переключатель питания nRF в положение VDD .
Если два других узла подключены к машине Linux при подключении этой третьей платы, она должна отображаться как последовательный порт /dev/ttyACM2
:
$ ls /dev/ttyACM* /dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
Напишите на доске «Столяр».
При проверке с помощью Screen вместо создания нового экземпляра Screen из командной строки повторно подключитесь к существующему и создайте в нем новое окно (которое вы использовали для FTD Commissioner):
$ screen -r
Создайте новое окно в Screen с помощью Ctrl+a → c
.
Появится новое приглашение командной строки. Откройте интерфейс командной строки OpenThread для FTD Joiner:
$ screen /dev/ttyACM2
В этом новом окне нажмите клавишу Enter на клавиатуре несколько раз, чтобы открыть командную строку OpenThread >
. Откройте интерфейс IPv6 и проверьте адреса:
> ifconfig up Done > ipaddr fe80:0:0:0:6c1e:87a2:df05:c240 Done
Теперь, когда FTD Joiner CLI находится в том же экземпляре Screen, что и FTD Commissioner, вы можете переключаться между ними с помощью сочетания клавиш Ctrl+a → n
.
Используйте Ctrl+a →
d
в любое время, чтобы выйти из экрана.
6. Настройка окна терминала
В дальнейшем вам придётся часто переключаться между устройствами Thread, поэтому убедитесь, что все они активны и легко доступны. До сих пор мы использовали Screen для доступа к двум FTD, и этот инструмент также позволяет разделить экран в одном окне терминала. Используйте это, чтобы увидеть, как один узел реагирует на команды, выполняемые на другом.
В идеале у вас должно быть четыре легкодоступных окна:
- служба
ot-daemon
/ логи - RCP Joiner через
ot-ctl
- FTD Commissioner через OpenThread CLI
- FTD Joiner через OpenThread CLI
Если вы хотите использовать собственную конфигурацию терминала/последовательного порта или инструмент, переходите к следующему шагу. Настройте окна терминала для всех устройств наиболее удобным для вас способом.
Использование экрана
Для удобства использования запустите только один сеанс Screen. Один сеанс должен быть у вас уже при настройке обоих FTD.
Все команды в Screen начинаются с Ctrl+a.
Основные экранные команды:
Повторно подключитесь к сеансу Screen (из командной строки) | |
Покинуть сеанс Screen | Ctrl+a → |
Создать новое окно в сеансе Screen | Ctrl+a → |
Переключение между окнами в одном сеансе Screen | Ctrl+a → |
Закрыть текущее окно в сеансе Screen | Ctrl+a → |
Разделенный экран
С помощью Screen вы можете разделить терминал на несколько окон:
Доступ к командам на screen
осуществляется с помощью сочетания клавиш Ctrl+a. Каждая команда должна начинаться с этой комбинации клавиш.
Если вы точно следовали инструкциям Codelab, у вас должно быть два окна (FTD Commissioner и FTD Joiner) на одном экземпляре экрана. Чтобы разделить экран между ними, сначала войдите в существующий сеанс Screen:
$ screen -r
Вы должны использовать одно из устройств FTD. Выполните следующие действия на экране:
- Ctrl+a →
S
— разделить окно по горизонтали - Ctrl+a →
Tab
для перемещения курсора в новое пустое окно - Ctrl+a →
n
— переключить новое окно на следующее - Если оно такое же, как в верхнем окне, нажмите Ctrl+a →
n
еще раз, чтобы просмотреть другое устройство FTD.
Теперь они оба видны. Переключайтесь между ними, используя сочетание клавиш Ctrl+a → Tab
. Рекомендуется переименовать каждое окно, используя сочетание клавиш Ctrl+a → A
чтобы избежать путаницы.
Расширенное использование
Для дальнейшего разделения экрана на квадранты и просмотра журналов ot-daemon
и RCP Joiner ot-ctl
эти службы должны быть запущены в том же экземпляре Screen. Для этого остановите ot-daemon
и выйдите из ot-ctl
, а затем перезапустите их в новых окнах Screen (Ctrl+a → c
).
Эта настройка не является обязательной и оставлена в качестве упражнения для пользователя.
Для разделения и перемещения между окнами используйте следующие команды:
Создать новое окно | Ctrl+a → |
Разделить окно по вертикали | Ctrl+a → |
Разделить окно по горизонтали | Ctrl+a → |
Перейти к следующему отображаемому окну | Ctrl+a → |
Переключить отображаемое окно вперед или назад | Ctrl+a → |
Переименовать текущее окно | Ctrl+a → |
Выйти из Screen можно в любое время с помощью сочетания клавиш Ctrl+a → d
, а повторно подключиться с помощью команды screen -r
из командной строки.
Более подробную информацию об Screen см. в кратком справочнике GNU Screen .
7. Создайте сеть Thread.
Теперь, когда все окна и экраны терминала настроены, давайте создадим сеть потоков. В FTD Commissioner создайте новый набор данных Operational Dataset и сделайте его активным. Набор данных Operational Dataset — это конфигурация создаваемой сети потоков.
## FTD Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 11 Channel Mask: 07fff800 Ext PAN ID: c0de7ab5c0de7ab5 Mesh Local Prefix: fdc0:de7a:b5c0/64 Network Key: 1234c0de7ab51234c0de7ab51234c0de Network Name: OpenThread-c0de PAN ID: 0xc0de PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Запишите сетевой ключ 1234c0de7ab51234c0de7ab51234c0de
, который будет использоваться позже.
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Откройте интерфейс IPv6:
> ifconfig up Done
Запуск операции протокола потока:
> thread start Done
Через мгновение проверьте состояние устройства. Оно должно быть «Лидером». Также получите RLOC16 для справки.
## FTD Commissioner ## ---------------------- > state leader Done > rloc16 0c00 Done
Проверьте IPv6-адреса устройства:
## FTD Commissioner ## ---------------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:c00 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:6394:5a75:a1ad:e5a # Mesh-Local EID (ML-EID) fe80:0:0:0:1cd6:87a9:cb9d:4b1d # Link-Local Address (LLA)
Сеть «codelab» теперь видна при сканировании с других устройств Thread.
Из ot-ctl
на RCP Joiner :
## RCP Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -36 | 232 |
Из OpenThread CLI на FTD Joiner :
## FTD Joiner ## ---------------- > scan | PAN | MAC Address | Ch | dBm | LQI | +------+------------------+----+-----+-----+ | c0de | 1ed687a9cb9d4b1d | 11 | -38 | 229 |
Если сеть «codelab» не отображается в списке, попробуйте выполнить сканирование еще раз.
8. Добавьте RCP Joiner
Ввод потоков в эксплуатацию в сети не активен, а это значит, что нам потребуется добавить RCP Joiner в сеть потоков, которую мы только что создали, с помощью процесса ввода потоков в эксплуатацию по внешнему каналу.
На устройстве FTD Commissioner мы записали сетевой ключ, например, 1234c0de7ab51234c0de7ab51234c0de
. Если вам потребуется снова найти сетевой ключ, выполните следующую команду на устройстве FTD Commissioner :
## FTD Commissioner ## > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done
Затем на RCP Joiner установите сетевой ключ активного набора данных на сетевой ключ FTD Commissioner:
## RCP Joiner ## ---------------- > dataset networkkey 1234c0de7ab51234c0de7ab51234c0de Done > dataset commit active Done
Проверьте набор данных, чтобы убедиться, что он настроен правильно.
## RCP Joiner ## ---------------- > dataset Network Key: 1234c0de7ab51234c0de7ab51234c0de
Откройте Thread, чтобы RCP Joiner присоединился к сети «codelab». Подождите несколько секунд, проверьте состояние, RLOC16 и его IPv6-адреса:
## RCP Joiner ## ---------------- > ifconfig up Done > thread start Done > state child Done > rloc16 0c01 Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:0c01 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f # Mesh-Local EID (ML-EID) fe80:0:0:0:18e5:29b3:a638:943b # Link-Local Address (LLA) Done
Запишите адрес Mesh-Local IPv6 (в данном fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f
), он вам понадобится позже.
Вернитесь к FTD Commissioner и проверьте таблицы маршрутизаторов и дочерних устройств, чтобы убедиться, что оба устройства принадлежат одной сети. Используйте RLOC16 для определения RCP Joiner.
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 35 | 1ed687a9cb9d4b1d | Done > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|VER| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+---+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1| 2| 1ae529b3a638943b | Done
Проверьте связь с помощью ping-запроса на локальный адрес сети RCP Joiner (локальный адрес сети, полученный из выходных данных ipaddr
RCP Joiner):
## FTD Commissioner ## ---------------------- > ping fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f > 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=1 hlim=64 time=40ms
Теперь у нас есть сеть Thread, состоящая из двух узлов, что иллюстрируется следующей топологической схемой:
Топологические диаграммы
По мере выполнения оставшейся части лабораторной работы мы будем показывать новую диаграмму топологии потоков при каждом изменении состояния сети. Роли узлов обозначаются следующим образом:
Маршрутизаторы всегда имеют форму пятиугольника, а конечные устройства — круга. Цифры на каждом узле соответствуют идентификатору маршрутизатора или дочернего устройства, отображаемому в выходных данных CLI, в зависимости от текущей роли и состояния каждого узла в данный момент.
9. Закажите столяра FTD
Теперь добавим третье устройство Thread к сети «codelab». На этот раз мы воспользуемся более безопасным процессом внутриполосной настройки и разрешим подключение только устройству FTD Joiner.
На FTD Joiner получите eui64
, чтобы FTD Commissioner мог его идентифицировать:
## FTD Joiner ## ---------------- > eui64 2f57d222545271f1 Done
В FTD Commissioner запустите его и укажите eui64
устройства, которое может присоединиться, а также учётные данные Joiner, например, J01NME
. Учётные данные Joiner — это специфичная для устройства строка, состоящая из заглавных букв и цифр (0–9 и AY, за исключением I, O, Q и Z для удобства чтения), длиной от 6 до 32 символов.
## FTD Commissioner ## ---------------------- > commissioner start Done > commissioner joiner add 2f57d222545271f1 J01NME Done
Переключитесь на роль FTD Joiner . Начните роль Joiner, используя учетные данные Joiner, которые вы только что настроили на FTD Commissioner:
## FTD Joiner ## ---------------- > ifconfig up Done > joiner start J01NME Done
Примерно через минуту вы получите подтверждение об успешной аутентификации:
## FTD Joiner ## ---------------- > Join success
Откройте Thread, чтобы FTD Joiner присоединился к сети «codelab», и немедленно проверьте состояние и RLOC16:
## FTD Joiner ## ---------------- > thread start Done > state child Done > rloc16 0c02 Done
Проверьте IPv6-адреса устройства. Обратите внимание, что ALOC отсутствует. Это связано с тем, что устройство не является лидером и не выполняет роль Anycast, требующую ALOC.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:c02 # Routing Locator (RLOC) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA)
Немедленно переключитесь на FTD Commissioner и проверьте таблицы маршрутизатора и дочерних устройств, чтобы убедиться, что в сети «codelab» присутствуют три устройства:
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 25 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | | 2 | 0x0c02 | 240 | 15 | 3 | 44 |1|1|1|1| e6cdd2d93249a243 | Done
На основе RLOC16 устройство FTD Joiner подключилось к сети как конечное устройство (дочернее). Вот наша обновлённая топология:
10. Нить в действии
Устройства Thread в этой практической работе представляют собой особый тип полнопоточных устройств (FTD), называемых конечными устройствами с возможностью маршрутизатора (REED). Это означает, что они могут функционировать как маршрутизаторы или конечные устройства, а также могут преобразовываться из конечных устройств в маршрутизаторы.
Поток может поддерживать до 32 маршрутизаторов, но старается поддерживать количество маршрутизаторов в диапазоне от 16 до 23. Если REED подключается как конечное устройство (дочернее устройство), а количество маршрутизаторов меньше 16, то по истечении случайного периода времени в течение двух минут он автоматически повышает себя до маршрутизатора.
Если после добавления FTD Joiner в вашей сети Thread оказалось два дочерних элемента, подождите не менее двух минут, а затем перепроверьте таблицы маршрутизатора и дочерних элементов на FTD Commissioner :
## FTD Commissioner ## ---------------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 3 | 0 | 0 | 0 | 50 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 63 | 0 | 3 | 3 | 1 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0x0c01 | 240 | 61 | 3 | 89 |1|1|1|1| 1ae529b3a638943b | Done
FTD-присоединяющийся (Extended MAC = e6cdd2d93249a243
) повысил свой статус до маршрутизатора. Обратите внимание, что RLOC16 отличается ( b800
вместо 0c02
). Это связано с тем, что RLOC16 основан на идентификаторе маршрутизатора и дочернем идентификаторе устройства. При переходе с конечного устройства на маршрутизатор значения его идентификатора маршрутизатора и дочернего идентификатора изменяются, как и RLOC16.
Подтвердите новое состояние и RLOC16 на FTD Joiner :
## FTD Joiner ## ---------------- > state router Done > rloc16 b800 Done
Понижение версии FTD Joiner
Вы можете проверить это поведение, вручную понизив статус FTD Joiner с маршрутизатора обратно до конечного устройства. Измените состояние на дочернее и проверьте RLOC16:
## FTD Joiner ## ---------------- > state child Done > rloc16 0c03 Done
Возвращаясь к 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
.
Удалить лидера
Лидер избирается самостоятельно среди всех маршрутизаторов потоков. Это означает, что если текущий лидер удаляется из сети потоков, один из других маршрутизаторов становится новым лидером.
На FTD Commissioner завершите работу Thread, чтобы удалить его из сети Thread:
## FTD Commissioner ## ---------------------- > thread stop Done > ifconfig down Done
В течение двух минут участник FTD становится новым лидером потока. Проверьте состояние и IPv6-адрес участника FTD, чтобы убедиться:
## FTD Joiner ## ---------------- > state leader Done > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Now it has the Leader ALOC! fdc0:de7a:b5c0:0:0:ff:fe00:b800 fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd fe80:0:0:0:e4cd:d2d9:3249:a243 Done
Проверьте дочернюю таблицу. Обратите внимание на новый RLOC16. Это RCP Joiner, на что указывают его идентификатор и расширенный MAC-адрес. Чтобы сохранить целостность сети Thread, родительские маршрутизаторы были переключены с FTD Commissioner на FTD Joiner. В результате для RCP Joiner появился новый RLOC16 (поскольку его идентификатор маршрутизатора изменился с 3 на 46).
## FTD Joiner ## ---------------- > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 27 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
Возможно, вам придётся подождать несколько минут, пока RCP Joiner подключится к FTD Joiner в качестве дочернего элемента. Проверьте состояние и RLOC16, чтобы убедиться, что:
## RCP Joiner ## -------------- > state child > rloc16 b801
Повторное присоединение комиссара FTD
Сеть Thread с двумя узлами — это не очень-то весело. Давайте вернём FTD Commissioner в строй.
На FTD Commissioner перезапустите ветку:
## FTD Commissioner ## ---------------------- > ifconfig up Done > thread start Done
В течение двух минут он автоматически подключается к сети «codelab» как конечное устройство, а затем повышает себя до маршрутизатора.
## FTD Commissioner ## ---------------------- > state router Done
Проверьте таблицы маршрутизатора и дочерние таблицы на устройстве FTD Joiner, чтобы убедиться:
## FTD Joiner ## ---------------- > router table | ID | RLOC16 | Next Hop | Path Cost | LQ In | LQ Out | Age | Extended MAC | +----+--------+----------+-----------+-------+--------+-----+------------------+ | 3 | 0x0c00 | 63 | 0 | 3 | 3 | 0 | 1ed687a9cb9d4b1d | | 46 | 0xb800 | 46 | 0 | 0 | 0 | 15 | e6cdd2d93249a243 | > child table | ID | RLOC16 | Timeout | Age | LQ In | C_VN |R|S|D|N| Extended MAC | +-----+--------+------------+------------+-------+------+-+-+-+-+------------------+ | 1 | 0xb801 | 240 | 184 | 3 | 145 |1|1|1|1| 1ae529b3a638943b | Done
Наша сеть Thread снова состоит из трех узлов.
11. Устранение неполадок
Управление сетью Thread с несколькими устройствами на разных терминалах или в разных окнах Screen может быть сложным. Воспользуйтесь этими советами, чтобы «сбросить» состояние сети или рабочего пространства при возникновении проблем.
Экран
Если вы запутались в настройках (слишком много окон Screen или экранов внутри Screen), продолжайте закрывать окна Screen сочетанием клавиш Ctrl+a → k, пока не останется ни одного, а screen -ls
в командной строке не выведет сообщение No Sockets found
. Затем заново создайте окна Screen для каждого устройства. Состояния устройств сохраняются даже при закрытии Screen.
Узлы потока
Если топология сети Thread не соответствует описанию в этой лабораторной работе или узлы по какой-то причине отключаются (возможно, из-за того, что машина Linux, на которой они работают, перешла в спящий режим), лучше всего остановить Thread, очистить сетевые учетные данные и начать заново с шага создания сети Thread .
Чтобы сбросить FTD:
## FTD Commissioner or FTD Joiner ## ------------------------------------ > thread stop Done > ifconfig down Done > factoryreset Done
Сбросить RCP можно таким же образом через ot-ctl
:
## RCP Joiner ## ---------------- > thread stop Done > ifconfig down Done > factoryreset Done
12. Использование многоадресной рассылки
Многоадресная рассылка используется для одновременной передачи информации группе устройств. В сети Thread определённые адреса резервируются для многоадресной рассылки с различными группами устройств в зависимости от области действия.
IPv6-адрес | Объем | Доставлено в |
| Link-Local | Все FTD и MED |
| Link-Local | Все FTD и пограничные маршрутизаторы |
| Mesh-Local | Все FTD и MED |
| Mesh-Local | Все FTD и пограничные маршрутизаторы |
Поскольку в этой лабораторной работе мы не используем пограничный маршрутизатор, давайте сосредоточимся на двух многоадресных адресах FTD и MED.
Link-Local
Область действия Link-Local охватывает все интерфейсы Thread, доступные посредством одной радиопередачи или одного «перехода». Топология сети определяет, какие устройства отвечают на пинг по адресу многоадресной рассылки ff02::1
.
Пинг ff02::1
от комиссара FTD :
## FTD Commissioner ## ---------------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:e4cd:d2d9:3249:a243: icmp_seq=2 hlim=64 time=9ms
В сети есть ещё два устройства (FTD Joiner и RCP Joiner), но FTD Commissioner получил только один ответ с локального адреса (LLA) FTD Joiner. Это означает, что FTD Joiner — единственное устройство, к которому FTD Commissioner может подключиться за один транзитный участок.
Теперь выполните ping ff02::1
с FTD Joiner :
## FTD Joiner ## ---------------- > ping ff02::1 > 8 bytes from fe80:0:0:0:1cd6:87a9:cb9d:4b1d: icmp_seq=1 hlim=64 time=11ms 8 bytes from fe80:0:0:0:18e5:29b3:a638:943b: icmp_seq=1 hlim=64 time=24ms
Два ответа! Проверяя IPv6-адреса других устройств, мы видим, что первый (заканчивающийся на 4b1d
) — это LLA комиссара FTD, а второй (заканчивающийся на 943b
) — LLA члена RCP.
Это означает, что FTD Joiner напрямую подключен как к FTD Commissioner, так и к RCP Joiner, что подтверждает нашу топологию.
Mesh-Local
Область Mesh-Local охватывает все интерфейсы Thread, доступные в пределах одной сети Thread. Давайте посмотрим на ответы на пинг по мультикаст-адресу ff03::1
.
Пинг ff03::1
от комиссара FTD :
## FTD Commissioner ## ---------------------- > ping ff03::1 > 8 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:b800: icmp_seq=3 hlim=64 time=9ms 8 bytes from fdc0:de7a:b5c0:0:66bf:99b9:24c0:d55f: icmp_seq=3 hlim=64 time=68ms
На этот раз комиссар FTD получил два ответа: один от локатора маршрутизации FTD Joiner (RLOC, оканчивающегося на b800
) и один от локального идентификатора сети (EID) RCP Joiner (ML-EID, оканчивающегося на d55f
). Это связано с тем, что область действия локальной сети охватывает всю сеть Thread. Независимо от того, где в сети находится устройство, оно будет подписано на адрес ff03::1
.
Выполните 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
Обратите внимание на время отклика RCP Joiner в обоих ping-запросах. RCP Joiner потребовалось гораздо больше времени, чтобы добраться до FTD Commissioner (68 мс), чем до FTD Joiner (23 мс). Это связано с тем, что ему приходится совершать два перехода, чтобы добраться до FTD Commissioner, по сравнению с одним переходом для FTD Joiner.
Вы, возможно, также заметили, что многоадресный пинг по ячеистой сети дал ответ RLOC только для двух FTD, а не для RCP-присоединителя. Это связано с тем, что FTD являются маршрутизаторами внутри сети, а RCP — конечным устройством.
Проверьте состояние RCP Joiner , чтобы подтвердить:
## RCP Joiner ## ---------------- > state child
13. Отправка сообщений по протоколу UDP
Одним из сервисов приложений, предоставляемых OpenThread, является протокол UDP (User Datagram Protocol), протокол транспортного уровня. Приложение, созданное на основе OpenThread, может использовать API UDP для передачи сообщений между узлами в сети Thread или другим устройствам во внешней сети (например, в Интернете, если в сети Thread используется граничный маршрутизатор).
UDP-сокеты доступны через интерфейс командной строки OpenThread. Давайте используем его для передачи сообщений между двумя FTD.
Получите адрес Mesh-Local EID для FTD Joiner . Мы используем этот адрес, поскольку он доступен из любой точки сети Thread.
## FTD Joiner ## ---------------- > ipaddr fdc0:de7a:b5c0:0:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fdc0:de7a:b5c0:0:0:ff:fe00:b800 # Routing Locator (RLOC) fe80:0:0:0:e4cd:d2d9:3249:a243 # Link-Local Address (LLA) fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd # Mesh-Local EID (ML-EID) Done
Запустите UDP и привяжите его к сокету для любого адреса IPv6:
## FTD Joiner ## ---------------- > udp open Done > udp bind :: 1212
Переключитесь на FTD Commissioner , запустите UDP и подключитесь к сокету, который вы настроили на FTD Joiner, используя его ML-EID:
## FTD Commissioner ## ---------------------- > udp open Done > udp connect fdc0:de7a:b5c0:0:3e2e:66e:9d41:ebcd 1212 Done
UDP-соединение между двумя узлами должно быть активным. Отправьте сообщение от имени комиссара FTD:
## FTD Commissioner ## ---------------------- > udp send hellothere Done
На FTD Joiner получено UDP-сообщение!
## FTD Joiner ## ---------------- > 10 bytes from fdc0:de7a:b5c0:0:0:ff:fe00:c00 49153 hellothere
14. Поздравляем!
Вы создали физическую сеть Thread!
Теперь вы знаете:
- разница между типами устройств Thread, ролями и областями действия
- как потоковые устройства управляют своими состояниями в сети
- как передавать простые сообщения между узлами с использованием UDP
Следующие шаги
Используя эту лабораторную работу, попробуйте выполнить следующие упражнения:
- Перепрошить плату FTD Joiner как MTD с помощью двоичного файла
ot-cli-mtd
и наблюдать, что она никогда не обновляется до маршрутизатора и не пытается стать лидером. - Добавьте больше устройств (попробуйте другую платформу!) в сеть и набросайте топологию, используя таблицы маршрутизаторов и дочерних устройств, а также пинги на адреса многоадресной рассылки.
- Используйте писпинель для контроля НКП
- Преобразуйте NCP в пограничный маршрутизатор с помощью OpenThread Border Router и подключите свою сеть Thread к Интернету.
Дальнейшее чтение
Посетите openthread.io и GitHub для получения разнообразных ресурсов OpenThread, включая:
- Поддерживаемые платформы — откройте для себя все платформы, поддерживающие OpenThread.
- Сборка OpenThread — дополнительные сведения о сборке и настройке OpenThread
- Thread Primer — охватывает все концепции Thread, представленные в этой практической работе.
Ссылка: