1. Введение
OpenThread , выпущенный Google, представляет собой реализацию сетевого протокола Thread® с открытым исходным кодом. Google Nest выпустил OpenThread, чтобы сделать технологию, используемую в продуктах Nest, широко доступной для разработчиков, чтобы ускорить разработку продуктов для подключенного дома.
Спецификация Thread определяет надежный, безопасный и маломощный протокол беспроводной связи между устройствами на основе IPv6 для домашних приложений. OpenThread реализует все сетевые уровни потоков, включая IPv6, 6LoWPAN, IEEE 802.15.4 с безопасностью MAC, установлением Mesh Link и маршрутизацией Mesh.
В этой Codelab вы будете программировать OpenThread на реальном оборудовании, создавать и управлять сетью потоков, а также передавать сообщения между узлами.
Что вы узнаете
- Создание и прошивка двоичных файлов 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 .
Установите 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
Для сборки используется 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 горит .
Если это первая плата, подключенная к машине Linux, она отображается как последовательный порт /dev/ttyACM0
(все платы nRF52840 используют ttyACM
в качестве идентификатора последовательного порта).
$ ls /dev/ttyACM* /dev/ttyACM0
Обратите внимание на серийный номер платы nRF52840, используемой для RCP:
Перейдите к расположению инструментов командной строки 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 .
Запустите демон 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
Два других узла Thread, используемые в этой лаборатории Codelab, представляют собой полнопоточные устройства (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:
Перейдите к расположению инструментов командной строки 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 .
Проверить сборку
Проверьте успешную сборку, войдя в интерфейс командной строки 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, и этот инструмент также позволяет разделить экран в одном и том же окне терминала. Используйте это, чтобы увидеть, как один узел реагирует на команды, отправленные другим.
В идеале у вас должно быть четыре доступных окна:
- служба
ot-daemon
/ журналы - Объединение RCP через
ot-ctl
- Комиссар FTD через интерфейс командной строки OpenThread
- FTD Joiner через OpenThread CLI
Если вы хотите использовать собственную конфигурацию терминала/последовательного порта или инструмент, не стесняйтесь переходить к следующему шагу. Настройте окна терминала для всех устройств так, как вам удобно.
Использование экрана
Для простоты использования запустите только один сеанс Screen. У вас уже должен быть один, когда вы настроили оба FTD.
Все команды на экране начинаются с сочетания клавиш Ctrl+a.
Основные экранные команды:
Повторно подключиться к сеансу Screen (из командной строки) | |
Выйти из сеанса экрана | Ctrl+а → |
Создать новое окно в сеансе Screen | Ctrl+а → |
Переключение между окнами в одном и том же сеансе экрана | Ctrl+a → |
Убить текущее окно в сеансе Screen | Ctrl+а → |
Разделенный экран
С помощью 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
эти службы должны быть запущены в этом же экземпляре экрана. Для этого остановите ot-daemon
и выйдите из ot-ctl
и перезапустите их в новых окнах экрана (Ctrl+a → c
).
Эта настройка не требуется и оставлена пользователю в качестве упражнения.
Разделяйте и перемещайтесь между окнами с помощью следующих команд:
Создать новое окно | Ctrl+а → |
Разделить окно по вертикали | Ctrl+а → |
Разделить окно по горизонтали | Ctrl+а → |
Перейти к следующему отображаемому окну | Ctrl+a → |
Переключить отображаемое окно вперед или назад | Ctrl+a → |
Переименовать текущее окно | Ctrl+а → |
Выйдите из экрана в любое время с помощью 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-Local, полученный из выходных данных 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, состоящая из двух узлов, показанная на этой диаграмме топологии:
Схемы топологии
По мере того, как вы будете работать с остальной частью Codelab, мы будем показывать новую диаграмму топологии потоков всякий раз, когда изменяется состояние сети. Роли узла обозначаются следующим образом:
Маршрутизаторы всегда пятиугольники, а конечные устройства всегда круги. Числа на каждом узле представляют идентификатор маршрутизатора или дочерний идентификатор, отображаемый в выходных данных 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
Поднимите 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. Нить в действии
Устройства потока в этой лаборатории 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.
Подтвердите новое состояние и 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 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
Проверьте дочернюю таблицу. Обратите внимание, что появился новый 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
Наша сеть 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-адрес | Сфера | Доставлен в |
| Link-Local | Все FTD и MED |
| Link-Local | Все FTD и пограничные маршрутизаторы |
| Mesh-Local | Все FTD и MED |
| Mesh-Local | Все FTD и пограничные маршрутизаторы |
Поскольку в этой лаборатории мы не используем пограничный маршрутизатор, давайте сосредоточимся на двух многоадресных адресах FTD и MED.
Link-Local
Область 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 может подключиться за один переход.
Теперь 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
) и один от RCP Joiner's Mesh-Local EID (ML-EID, оканчивающийся на d55f
). Это связано с тем, что локальная область сетки включает в себя всю сеть потоков. Независимо от того, где в сети находится устройство, оно будет подписано на адрес ff03::1
.
Отправьте эхо- 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 потребовалось гораздо больше времени, чтобы добраться до комиссара 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. Поздравляем!
Вы создали физическую сеть потоков!
Теперь вы знаете:
- разница между типами устройств Thread, ролями и областями
- как устройства Thread управляют своим состоянием в сети
- как передавать простые сообщения между узлами с помощью UDP
Следующие шаги
Основываясь на этой Codelab, попробуйте выполнить следующие упражнения:
- Перепрошейте плату FTD Joiner как MTD, используя двоичный файл
ot-cli-mtd
, и обратите внимание, что она никогда не обновляется до Router и не пытается стать лидером. - Добавьте в сеть больше устройств (попробуйте другую платформу!) и набросайте топологию с помощью маршрутизатора и дочерних таблиц, а также эхо-запросов на многоадресные адреса.
- Используйте pyspinel для управления NCP
- Преобразуйте NCP в пограничный маршрутизатор с помощью пограничного маршрутизатора OpenThread и подключите свою сеть потоков к Интернету.
дальнейшее чтение
Посетите openthread.io и GitHub , чтобы найти различные ресурсы OpenThread, в том числе:
- Поддерживаемые платформы — узнайте обо всех платформах, поддерживающих OpenThread.
- Сборка OpenThread — дополнительные сведения о сборке и настройке OpenThread.
- Thread Primer — охватывает все концепции Thread, представленные в этой Codelab.
Ссылка: