1. Введение
OpenThread , выпущенный командой Google Nest, представляет собой реализацию сетевого протокола Thread® с открытым исходным кодом, предназначенную для ускорения разработки продуктов для подключенного дома. Спецификация Thread определяет надежный, безопасный и маломощный протокол беспроводной связи между устройствами на основе IPv6 для домашних и коммерческих зданий.
Espressif портировала стек OpenThread на основе FreeRTOS и LwIP, что позволяет разработчикам быстро создавать сети Thread. Соответствующий исходный код можно получить на GitHub . В то же время Espressif также внедрила Thread Border Router на основе RTOS.
В этой лаборатории кода вы будете программировать OpenThread на реальном оборудовании, создавать сеть потоков и управлять ею, а также передавать сообщения между узлами.
Что вы узнаете
- Сборка и прошивка двоичных файлов OpenThread CLI на платы ESP.
- Сборка и прошивка пограничного маршрутизатора на плате ESP Thread Border Router.
- Ручное управление узлами потоков с помощью ESP Monitor и OpenThread CLI.
- Формирование сети потоков на пограничном маршрутизаторе потоков.
- Обеспечение ввода устройств в сеть Thread.
- Пинг IPv6-адреса между узлами потоков.
- Передача сообщений между узлами потоков с помощью UDP.
Что вам понадобится
Аппаратное обеспечение:
Программное обеспечение:
- ЕСП-ИДФ .
- ESP-РЕЗЬБА-BR .
2. Начало работы
- Установка ESP-IDF.
Пожалуйста, следуйте Руководству по программированию ESP-IDF для установки среды разработки программного обеспечения.
- Клонируйте 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 >
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 >
Теперь вы получаете сеть потоков с топологией, показанной ниже:
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!
Теперь вы знаете:
- Сборка и прошивка двоичных файлов OpenThread CLI на платы ESP.
- Создание мигающего пограничного маршрутизатора на плате ESP Thread Border Router.
- Ручное управление узлами потоков с помощью ESP Monitor и OpenThread CLI.
- Формирование сети потоков на пограничном маршрутизаторе потоков.
- Обеспечение ввода устройств в сеть Thread.
- Пинг IPv6-адреса между узлами потоков.
- Передача сообщений между узлами потоков с помощью UDP.
Дальнейшее чтение
Посетите openthread.io и GitHub , чтобы найти различные ресурсы OpenThread, в том числе:
- Поддерживаемые платформы — узнайте обо всех платформах, поддерживающих OpenThread.
- Сборка OpenThread — дополнительная информация о сборке и настройке OpenThread.
- Thread Primer — охватывает все концепции Thread, представленные в этой Codelab.
Ссылка: