1. Введение

OpenThread , выпущенный командой Google Nest, — это реализация сетевого протокола Thread® с открытым исходным кодом, разработанная для ускорения разработки продуктов для «умного дома». Спецификация Thread определяет надежный, безопасный и энергоэффективный протокол беспроводной связи между устройствами на основе IPv6 для применения в жилых и коммерческих зданиях.
Компания Espressif портировала стек OpenThread на основе FreeRTOS и LwIP, что позволяет разработчикам быстро создавать сети на базе Thread. Соответствующий исходный код можно получить на GitHub . Одновременно Espressif также реализовала маршрутизатор граничных узлов Thread на основе RTOS.
В этом практическом занятии вы научитесь программировать OpenThread на реальном оборудовании, создавать и управлять сетью Thread, а также передавать сообщения между узлами.

Что вы узнаете
- Сборка и прошивка бинарных файлов OpenThread CLI на платы ESP.
- Сборка и прошивка пограничного маршрутизатора на плату ESP Thread Border Router.
- Управление узлами потоков вручную с помощью ESP Monitor и OpenThread CLI.
- Формирование сети Thread на маршрутизаторе Thread Border Router.
- Обеспечение ввода устройств в эксплуатацию в сети Thread.
- Пинг IPv6-адреса между узлами Thread.
- Передача сообщений между узлами Thread по протоколу UDP.
Что вам понадобится
Аппаратное обеспечение:
- 2 платы ESP с модулями IEEE 802.15.4.
- 1 плата для фрезерования резьбовых кромок ESP.
Программное обеспечение:
- ESP-IDF .
- ESP-THREAD-BR .
2. Начало работы
- Установка ESP-IDF.
Для установки среды разработки программного обеспечения следуйте руководству по программирования ESP-IDF .
- Клонируйте SDK ESP Thread Border Router.
ESP-THREAD-BR — это официальный SDK для маршрутизаторов граничных сетей ESP Thread. Он поддерживает все основные сетевые функции для создания маршрутизатора граничных сетей Thread и интегрирует множество функций на уровне продукта для быстрой реализации.
$ cd <your-local-workspace> $ git clone --recursive https://github.com/espressif/esp-thread-br.git
3. Сборка и прошивка
Для сборки и прошивки бинарного файла ot-cli-ftd на платах ESP с модулями IEEE 802.15.4 вы можете обратиться к примеру ot_cli из ESP-IDF для получения более подробной информации:
$ cd <your-idf-path>/examples/openthread/ot_cli $ idf.py set-target <your-board-type>
Включите функцию присоединения через menuconfig:
$ idf.py menuconfig
Настройка компонентов > OpenThread > Включить Joiner, затем выполнить сборку и прошивку.
$ idf.py -p <your-local-port> build flash monitor
Для сборки и прошивки бинарного файла ot-br на плате ESP Thread Border Router Board необходимо сначала собрать бинарный файл RCP. Этот бинарный файл RCP не нужно явно прошивать в устройство на плате ESP Thread Border Router Board. Он будет включен в бинарный файл Border Router и прошит в чип ESP32-H2 при первой загрузке (или при изменении прошивки RCP). Для получения более подробной информации обратитесь к документации ESP Thread BR :
$ cd <your-idf-path>/examples/openthread/ot_rcp $ idf.py set-target esp32h2 $ idf.py build $ cd <your-esp-thread-br-path>/examples/basic_thread_border_router $ idf.py set-target esp32s3
Включите функцию управления комиссаром через menuconfig:
$ idf.py menuconfig
Настройка компонентов > OpenThread > Включить Commissioner, затем выполнить сборку и прошивку.
$ idf.py -p <your-local-port> build flash monitor
4. Формирование сети потоков на пограничном маршрутизаторе потоков.
Теперь вы можете создать сеть Thread, используя командную строку OpenThread на плате ESP Thread Border Router Board (BR Commissioner):
## BR Commissioner ## ---------------------- > dataset init new Done > dataset Active Timestamp: 1 Channel: 21 Channel Mask: 0x07fff800 Ext PAN ID: 151975d11bea97b5 Mesh Local Prefix: fd6a:b54b:d6a3:b05a::/64 Network Key: 731ab6a60a64a0a0b14b259b86b2be01 Network Name: OpenThread-1444 PAN ID: 0x1444 PSKc: 54e7f18d2575014da94db09df29c5df0 Security Policy: 672 onrc 0 Done
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Активируйте интерфейс IPv6:
> ifconfig up I (59329) OPENTHREAD: Platform UDP bound to port 49153 Done I (59329) OT_STATE: netif up
Запуск операции протокола потока:
> thread start I(61709) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(62469) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(69079) OPENTHREAD:[N] RouterTable---: Allocate router id 11 I(69079) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c00 I(69089) OPENTHREAD:[N] Mle-----------: Role detached -> leader I(69089) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 I (69099) OPENTHREAD: Platform UDP bound to port 49154
Через некоторое время проверьте состояние устройства. Оно должно быть «Лидер».
> state leader Done >
5. Присоединяйтесь к сети Thread с помощью сетевого ключа.
В этом практическом занятии подготовлены две платы ESP с модулями IEEE 802.15.4 для подключения к сети, сформированной по протоколу BR. В этом занятии мы добавим плату Board1 в сеть.
Получите сетевой ключ из BR:
## BR Commissioner ## ---------------------- > networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done >
Установите этот сетевой ключ для одной платы ESP (Board1 Joiner) с модулями IEEE 802.15.4:
## Board1 Joiner ## ---------------------- > dataset networkkey 731ab6a60a64a0a0b14b259b86b2be01 Done
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Активируйте интерфейс IPv6:
> ifconfig up Done I (20308) OT_STATE: netif up
Запуск операции протокола потока:
> thread start I(23058) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(23408) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(30028) OPENTHREAD:[N] Mle-----------: Attach attempt 1 unsuccessful, will try again in 0.288 seconds I(30328) OPENTHREAD:[N] Mle-----------: Attach attempt 2, AnyPartition I(33498) OPENTHREAD:[N] Mle-----------: Delay processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Processing Announce - channel 21, panid 0x1444 I(33758) OPENTHREAD:[N] Mle-----------: Role detached -> disabled I(33758) OPENTHREAD:[N] Mle-----------: Role disabled -> detached I(34178) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition I(35068) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2c01 I(35068) OPENTHREAD:[N] Mle-----------: Role detached -> child
Через некоторое время проверьте состояние устройства. Оно должно быть в режиме "Дочернее".
> state child Done
Установите роль «Маршрутизатор».
> state router Done I(51028) OPENTHREAD:[N] Mle-----------: RLOC16 2c01 -> 2800 I(51028) OPENTHREAD:[N] Mle-----------: Role child -> router I(51028) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >

6. Присоединяйтесь к сети Thread посредством безопасной авторизации.
В этом занятии мы добавим Board2 в сеть посредством ввода в эксплуатацию системы безопасности:
Получите PSKc и panid у комиссара BR:
## BR Commissioner ## ---------------------- > pskc 54e7f18d2575014da94db09df29c5df0 Done > panid 0x1444 Done
Настройте сетевую информацию для платы Board2:
## Board2 Joiner ## ---------------------- > dataset pskc 54e7f18d2575014da94db09df29c5df0 Done > dataset panid 0x1444 Done
Зафиксируйте этот набор данных как активный:
## Board2 Joiner ## ---------------------- > dataset commit active Done
Активируйте интерфейс IPv6:
## Board2 Joiner ## ---------------------- > ifconfig up Done I (29146) OT_STATE: netif up
Получите eui64 на Board2:
## Board2 Joiner ## ---------------------- > eui64 4831b7fffec02be1 Done
В BR Commissioner запустите программу и укажите eui64 устройства, которое может подключиться, а также учетные данные участника, например, J01NME . Учетные данные участника представляют собой строку, специфичную для устройства, состоящую из буквенно-цифровых символов верхнего регистра (0-9 и AY, за исключением I, O, Q и Z для удобства чтения), длиной от 6 до 32 символов.
## BR Commissioner ## ---------------------- > commissioner start Commissioner: petitioning Done Commissioner: active > commissioner joiner add 4831b7fffec02be1 J01NME Done
Переключитесь на роль "Присоединяющийся к Board2" . Запустите роль "Присоединяющийся к Board2", используя учетные данные, которые вы только что настроили для "Комиссара BR":
## Board2 Joiner ## ---------------------- > ifconfig up Done > joiner start J01NME Done
Примерно через минуту вы получите подтверждение успешной аутентификации:
## Board2 Joiner ## ---------------------- > Join success
После этого вы можете создать и присоединиться к сети Thread, сформированной комиссаром BR.
Запуск операции протокола потока:
> thread start I(35727) OPENTHREAD:[N] Mle-----------: Role disabled -> detached Done > I(36197) OPENTHREAD:[N] Mle-----------: Attach attempt 1, AnyPartition reattaching with Active Dataset I(37007) OPENTHREAD:[N] Mle-----------: RLOC16 fffe -> 2801 I(37007) OPENTHREAD:[N] Mle-----------: Role detached -> child
Установите роль «Маршрутизатор».
> state router Done I(46057) OPENTHREAD:[N] Mle-----------: RLOC16 2801 -> 4400 I(46057) OPENTHREAD:[N] Mle-----------: Role child -> router I(46057) OPENTHREAD:[N] Mle-----------: Partition ID 0x28b518c6 >
Теперь у вас есть сеть Thread с топологией, показанной ниже:

7. Пингование IPv6-адреса между узлами Thread.
Для связи между любыми двумя платами можно использовать команду ping. Для вывода IPv6-адреса каждой платы используйте команду ipaddr .
## BR Commissioner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:fc00 # Leader Anycast Locator (ALOC) fd6a:b54b:d6a3:b05a:0:ff:fe00:2c00 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 # Mesh-Local EID (ML-EID) fe80:0:0:0:687c:7248:cc14:9c4d # Link-Local Address (LLA) Done >
## Board1 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:2800 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 # Mesh-Local EID (ML-EID) fe80:0:0:0:18ac:df04:4671:6a45 # Link-Local Address (LLA) Done
## Board2 Joiner ## ---------------------- > ipaddr fd6a:b54b:d6a3:b05a:0:ff:fe00:4400 # Routing Locator (RLOC) fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc # Mesh-Local EID (ML-EID) fe80:0:0:0:a8cc:1483:f696:91a2 # Link-Local Address (LLA) Done
Например, чтобы проверить связь с Board2 MLE-ID из BR Commissioner, вы можете выполнить следующую команду в BR Commissioner:
## BR Commissioner ## ---------------------- > ping fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc 16 bytes from fd6a:b54b:d6a3:b05a:d7dc:8e90:9bc9:ecbc: icmp_seq=1 hlim=255 time=123ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 123/123.0/123 ms. Done
8. Передача сообщений между узлами Thread по протоколу UDP.
В этом занятии вы узнаете, как отправлять сообщения между двумя устройствами Thread. Например, откройте UDP-интерфейс, привяжите его к порту 20617 и настройте прослушивание всех адресов на BR:
## BR Commissioner ## ---------------------- > udp open Done > udp bind :: 20617 I (1298739) OPENTHREAD: Platform UDP bound to port 20617 Done
Затем отправьте сообщение с платы Board1 на адрес BR MLE-ID и порт 20617 :
## Board1 Joiner ## ---------------------- > udp open Done > udp send fd6a:b54b:d6a3:b05a:a8df:eb43:63d8:bda0 20617 ESP
Вы можете увидеть полученное сообщение на BR:
## BR Commissioner ## ---------------------- 3 bytes from fd6a:b54b:d6a3:b05a:e461:db08:c833:1248 49154 ESP
9. Поздравляем!
Вы создали физическую сеть Thread с использованием плат ESP!

Теперь вы знаете:
- Сборка и прошивка бинарных файлов OpenThread CLI на платы ESP.
- Создание маршрутизатора граничных узлов для прошивки платы ESP Thread Border Router.
- Управление узлами потоков вручную с помощью ESP Monitor и OpenThread CLI.
- Формирование сети Thread на маршрутизаторе Thread Border Router.
- Обеспечение ввода устройств в эксплуатацию в сети Thread.
- Пинг IPv6-адреса между узлами Thread.
- Передача сообщений между узлами Thread по протоколу UDP.
Дополнительная информация
Посетите openthread.io и GitHub , чтобы найти множество ресурсов по OpenThread, в том числе:
- Поддерживаемые платформы — узнайте обо всех платформах, поддерживающих OpenThread.
- Сборка OpenThread — подробная информация о сборке и настройке OpenThread.
- Введение в потоки — охватывает все концепции потоков, представленные в этом практическом занятии.
Ссылка: