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

1. Введение

26b7f4f6b3ea0700.png

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

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

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

Espressif_hardware_setup.jpg

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

  • Сборка и прошивка двоичных файлов OpenThread CLI на платы ESP.
  • Сборка и прошивка пограничного маршрутизатора на плате ESP Thread Border Router.
  • Ручное управление узлами потоков с помощью ESP Monitor и OpenThread CLI.
  • Формирование сети потоков на пограничном маршрутизаторе потоков.
  • Обеспечение ввода устройств в сеть Thread.
  • Пинг IPv6-адреса между узлами потоков.
  • Передача сообщений между узлами потоков с помощью 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 Border Router. Он поддерживает все основные сетевые функции для создания граничного маршрутизатора потоков и объединяет богатые функции уровня продукта для быстрого создания продукта.

$ cd <your-local-workspace>
$ git clone --recursive https://github.com/espressif/esp-thread-br.git

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

Для сборки и прошивки двоичного файла ot-cli-ftd на платах ESP с модулями IEEE 802.15.4 вы можете обратиться к примеру ESP-IDF ot_cli для получения более подробной информации:

$ cd <your-idf-path>/examples/openthread/ot_cli
$ idf.py set-target <your-board-type>

Включите функцию объединения через меню конфигурации:

$ idf.py menuconfig

Конфигурация компонента > OpenThread > Включить Joiner, затем выполните сборку и прошивку.

$ idf.py -p <your-local-port> build flash monitor

Для создания и прошивки двоичного файла ot-br на плате ESP Thread Border Router вам необходимо сначала создать двоичный файл RCP. Этот двоичный файл RCP не нужно явно прошивать на устройство на плате ESP Thread Border Router. Он будет включен в двоичный файл 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

Включите функцию комиссара через меню конфигурации:

$ 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 и панид у комиссара БР:

## 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 устройства, которое может присоединиться, вместе с Joiner Credential, например 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 Joiner . Начните роль участника с учетными данными участника, которые вы только что настроили в BR Commissioner:

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

Теперь вы получаете сеть потоков с топологией, показанной ниже:

esp_ot_tp_LRR.jpg

7. Пинг IPv6-адреса между узлами потоков.

Вы можете использовать команду ping для связи между любыми двумя платами. Используйте команду ipaddr , чтобы распечатать IPv6-адрес каждой платы:

## 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. Передача сообщений между узлами потоков с помощью UDP

На этом занятии вы узнаете, как отправлять сообщение между двумя устройствами Thread. Например, откройте udp и привяжите его к порту 20617 и слушайте все адреса в BR:

## BR Commissioner ##
----------------------
> udp open
Done
> udp bind :: 20617
I (1298739) OPENTHREAD: Platform UDP bound to port 20617
Done

Затем отправьте сообщение с Board1 на адрес MLE-ID BR и порт 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.
  • Пинг IPv6-адреса между узлами потоков.
  • Передача сообщений между узлами потоков с помощью UDP.

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

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

Ссылка: