Создайте сеть потоков с помощью ESP32H2 и платы пограничного маршрутизатора потоков ESP.

1. Введение

26b7f4f6b3ea0700.png

OpenThread , выпущенный командой Google Nest, — это реализация сетевого протокола Thread® с открытым исходным кодом, разработанная для ускорения разработки продуктов для «умного дома». Спецификация Thread определяет надежный, безопасный и энергоэффективный протокол беспроводной связи между устройствами на основе IPv6 для применения в жилых и коммерческих зданиях.

Компания Espressif портировала стек OpenThread на основе FreeRTOS и LwIP, что позволяет разработчикам быстро создавать сети на базе Thread. Соответствующий исходный код можно получить на GitHub . Одновременно Espressif также реализовала маршрутизатор граничных узлов Thread на основе RTOS.

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

Espressif_hardware_setup.jpg

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

  • Сборка и прошивка бинарных файлов 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.

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

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

  1. Установка ESP-IDF.

Для установки среды разработки программного обеспечения следуйте руководству по программирования ESP-IDF .

  1. Клонируйте 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
> 

esp_ot_tp_LR.jpg

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 с топологией, показанной ниже:

esp_ot_tp_LRR.jpg

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!

esp_ot_final_topology.jpg

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

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

Дополнительная информация

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

Ссылка: