1. Введение

OpenThread, выпущенный Google, — это реализация сетевого протокола Thread с открытым исходным кодом. Google Nest выпустил OpenThread, чтобы сделать технологию, используемую в продуктах Nest, широко доступной для разработчиков и ускорить разработку продуктов для «умного дома».
Спецификация Thread определяет надежный, безопасный и энергоэффективный протокол беспроводной связи между устройствами на основе IPv6 для домашних приложений. OpenThread реализует все сетевые уровни Thread, включая IPv6, 6LoWPAN, IEEE 802.15.4 с защитой MAC, установление соединения в ячеистой сети и маршрутизацию в ячеистой сети.
В этом практическом занятии вы узнаете, как смоделировать сеть Thread на имитируемых устройствах.
Что вы узнаете
- Как настроить цепочку инструментов сборки OpenThread
- Как смоделировать сеть Thread
- Как аутентифицировать узлы Thread
- Как управлять сетью потоков с помощью демона OpenThread
Что вам понадобится
- git
- Базовые знания Linux, сетевой маршрутизации.
2. Настройка системы сборки
Гит
Для выполнения этого задания необходимо использовать Git. Загрузите и установите его, прежде чем продолжить.
После установки следуйте инструкциям для вашей операционной системы, чтобы загрузить и собрать OpenThread.
Xcode для Mac OS X
Для установки и сборки OpenThread на Mac OS X требуется Xcode.
После установки Xcode установите инструменты командной строки Xcode:
$ xcode-select --install
Сборка на Linux / Mac OS X
Данные инструкции по установке были протестированы на Ubuntu Server 14.04 LTS и Mac OS X Sierra 10.12.6.
Установите OpenThread. Команды bootstrap гарантируют установку набора инструментов и правильную настройку среды:
$ mkdir -p ~/src $ cd ~/src $ git clone --recursive https://github.com/openthread/openthread.git $ cd openthread $ ./script/bootstrap
Используя Windows
Если вы предпочитаете Windows, мы рекомендуем попробовать версию этого Codelab в Docker.
3. Соберите приложения OpenThread.
После завершения установки соберите пример приложения OpenThread. Для этого практического занятия мы используем пример симуляции.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Теперь соберите демон OpenThread:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Смоделируйте сеть потоков.
В этом практическом занятии вы будете использовать пример приложения, демонстрирующий минимальное приложение OpenThread, которое предоставляет доступ к интерфейсам конфигурации и управления OpenThread через базовый интерфейс командной строки (CLI).
В этом упражнении описаны минимальные шаги, необходимые для отправки пинга с одного имитированного устройства Thread на другое имитированное устройство Thread.
На рисунке ниже представлена базовая топология сети Thread. В этом упражнении мы смоделируем два узла внутри зеленого круга: лидера потока и маршрутизатора потока с одним соединением между ними.

Пинг узла
1. Запустите узел 1.
Перейдите в каталог openthread и запустите процесс командной строки для имитируемого устройства Thread, используя исполняемый файл ot-cli-ftd .
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Примечание: Если после выполнения этой команды вы не видите приглашение > , нажмите enter .
Этот исполняемый файл реализует устройство OpenThread, смоделированное на основе POSIX. Драйвер радиомодуля IEEE 802.15.4 реализован поверх UDP (кадры IEEE 802.15.4 передаются в составе UDP-пакетов).
Аргумент 1 представляет собой дескриптор файла, отображающий младшие биты "заводского" стандарта IEEE EUI-64 для моделируемого устройства. Это значение также используется при привязке к UDP-порту для эмуляции радиосвязи IEEE 802.15.4 (порт = 9000 + дескриптор файла). Каждый экземпляр моделируемого устройства Thread в этом примере будет использовать свой собственный дескриптор файла.
Примечание: При запуске процесса для имитируемого устройства используйте только файловые дескрипторы с номерами 1 или больше, как указано в этом руководстве. Файловый дескриптор с номером 0 зарезервирован для других целей.
Создайте новый оперативный набор данных и зафиксируйте его как активный. Операционный набор данных — это конфигурация для создаваемой вами сети потоков.
> dataset init new Done > dataset Active Timestamp: 1 Channel: 20 Channel Mask: 07fff800 Ext PAN ID: d6263b6d857647da Mesh Local Prefix: fd61:2344:9a52:ede0/64 Network Key: e4344ca17d1dca2a33f064992f31f786 Network Name: OpenThread-c169 PAN ID: 0xc169 PSKc: ebb4f2f8a68026fc55bcf3d7be3e6fe4 Security Policy: 0, onrcb Done
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Активируйте интерфейс IPv6:
> ifconfig up Done
Запуск операции протокола потока:
> thread start Done
Подождите несколько секунд и убедитесь, что устройство стало лидером потока. Лидером является устройство, отвечающее за управление назначением идентификаторов маршрутизатора.
> state leader Done
Просмотрите IPv6-адреса, назначенные интерфейсу Thread узла 1 (ваш вывод будет отличаться):
> ipaddr fd61:2344:9a52:ede0:0:ff:fe00:fc00 fd61:2344:9a52:ede0:0:ff:fe00:5000 fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 fe80:0:0:0:94da:92ea:1353:4f3b Done
Обратите внимание на конкретные типы IPv6-адресов:
- Начинается с
fd= mesh-local - Начинается с
fe80= link-local
Локальные типы адресов в сетчатой сети классифицируются далее:
- Содержит
ff:fe00= Router Locator (RLOC) - Не содержит
ff:fe00= Идентификатор конечной точки (EID)
Найдите EID в выводе консоли и запишите его для дальнейшего использования. В приведенном выше примере вывода EID следующий:
fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6
2. Запуск узла 2
Откройте новый терминал, перейдите в каталог openthread и запустите процесс CLI. Это ваше второе симулированное устройство Thread:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
Примечание: Если после выполнения этой команды вы не видите приглашение > , нажмите enter .
Настройте сетевой ключ потока и идентификатор PAN, используя те же значения, что и в операционном наборе данных узла 1:
> dataset networkkey e4344ca17d1dca2a33f064992f31f786 Done > dataset panid 0xc169 Done
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Активируйте интерфейс IPv6:
> ifconfig up Done
Запуск операции протокола потока:
> thread start Done
Устройство инициализируется как дочерний элемент. Дочерний элемент потока эквивалентен конечному устройству, которое представляет собой потоковое устройство, передающее и принимающее одноадресный трафик только с родительским устройством.
> state child Done
В течение 2 минут вы должны увидеть, как состояние изменится с child на router . Маршрутизатор потоков способен маршрутизировать трафик между устройствами потоков. Его также называют родительским устройством.
> state router Done
Проверьте сеть.
Простой способ проверить работоспособность ячеистой сети — посмотреть на таблицу маршрутизации.
1. Проверьте подключение.
На узле 2 получите RLOC16. RLOC16 — это последние 16 бит IPv6-адреса RLOC устройства.
> rloc16 5800 Done
На узле 1 проверьте таблицу маршрутизатора на наличие записи RLOC16 узла 2. Убедитесь, что узел 2 сначала переключился в состояние маршрутизатора.
> router table | ID | RLOC16 | Next Hop | Path Cost | LQI In | LQI Out | Age | Extended MAC | +----+--------+----------+----------+-------+---------+-----+------------------+ | 20 | 0x5000 | 63 | 0 | 0 | 0 | 0 | 96da92ea13534f3b | | 22 | 0x5800 | 63 | 0 | 3 | 3 | 23 | 5a4eb647eb6bc66c |
В таблице обнаружен код RLOC узла 1, равный 0xa800 , что подтверждает его подключение к сети.
2. Проверьте связь с узлом 2, отправив пинг на узел 1.
Проверьте соединение между двумя имитируемыми устройствами Thread. На узле 2 ping для EID, назначенного узлу 1:
> ping fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6 > 16 bytes from fd61:2344:9a52:ede0:d041:c5ba:a7bc:5ce6: icmp_seq=1 hlim=64 time=12ms
Нажмите enter , чтобы вернуться к > строке.
Проверьте сеть
Теперь, когда вы можете успешно обмениваться данными между двумя смоделированными устройствами Thread, протестируйте ячеистую сеть, отключив один узел.
Вернитесь к узлу 1 и остановите поток:
> thread stop Done
Переключитесь на узел 2 и проверьте его состояние. В течение двух минут узел 2 обнаружит, что лидер (узел 1) отключен, и вы должны увидеть, как узел 2 станет leader сети:
> state router Done ... > state leader Done
После подтверждения остановите Thread и выполните сброс настроек Node 2 до заводских, прежде чем выйти. Сброс настроек до заводских выполняется для того, чтобы гарантировать, что сетевые учетные данные Thread, использованные в этом упражнении, не будут перенесены в следующее упражнение.
> thread stop Done > factoryreset > > exit
Также выполните сброс до заводских настроек и завершите работу узла 1:
> factoryreset > > exit
Для ознакомления со всеми доступными командами командной строки обратитесь к справочнику OpenThread CLI .
5. Аутентификация узлов с помощью функции ввода в эксплуатацию.
В предыдущем упражнении вы настроили сеть Thread с двумя имитированными устройствами и проверили их соединение. Однако это позволяет передавать между устройствами только неаутентифицированный локальный трафик IPv6. Для маршрутизации глобального трафика IPv6 между ними (и Интернетом через пограничный маршрутизатор Thread) узлы должны быть аутентифицированы.
Для аутентификации одно из устройств должно выступать в роли Комиссара. Комиссар — это выбранный в данный момент сервер аутентификации для новых устройств Thread, а также лицо, предоставляющее сетевые учетные данные, необходимые для подключения устройств к сети.
В этом упражнении мы будем использовать ту же двухузловую топологию, что и раньше. Для аутентификации лидер потока будет выступать в роли уполномоченного лица, а маршрутизатор потока — в роли присоединившегося.

1. Создайте сеть.
Если вы продолжаете с предыдущего упражнения, у вас уже должны быть открыты два окна терминала. Если нет, убедитесь, что два окна открыты и готовы к использованию. Одно будет служить узлом 1, другое — узлом 2.
На узле 1 запустите процесс командной строки:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Примечание: Если после выполнения этой команды вы не видите приглашение > , нажмите enter .
Создайте новый оперативный набор данных, зафиксируйте его как активный и запустите поток:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 12 Channel Mask: 07fff800 Ext PAN ID: e68d05794bf13052 Mesh Local Prefix: fd7d:ddf7:877b:8756/64 Network Key: a77fe1d03b0e8028a4e13213de38080e Network Name: OpenThread-8f37 PAN ID: 0x8f37 PSKc: f9debbc1532487984b17f92cd55b21fc Security Policy: 0, onrcb Done
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Активируйте интерфейс IPv6:
> ifconfig up Done
Запуск операции протокола потока:
> thread start Done
Подождите несколько секунд и убедитесь, что устройство стало лидером потока:
> state leader Done
2. Начать работу в должности комиссара.
Оставаясь на узле 1, запустите роль комиссара:
> commissioner start Done
Разрешите любому пользователю Joiner (используя символ подстановки * ) с учетными данными Joiner J01NME подключаться к сети. Joiner — это устройство, которое добавляется администратором к уже подключенной сети Thread Network.
> commissioner joiner add * J01NME Done
3. Начните работу в роли "Присоединяющийся"
Во втором окне терминала запустите новый процесс командной строки. Это будет Node 2.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
На узле 2 активируйте роль «Присоединяющийся», используя учетные данные J01NME Joiner Credential.
> ifconfig up Done > joiner start J01NME Done
...подождите несколько секунд для подтверждения...
Join success
В качестве участника, устройство (Узел 2) успешно прошло аутентификацию у Комиссара (Узел 1) и получило учетные данные сети Thread Network.
Теперь, когда узел 2 аутентифицирован, запустите поток:
> thread start Done
4. Проверка сетевой аутентификации
Проверьте state узла 2, чтобы убедиться, что он подключился к сети. В течение двух минут узел 2 переходит из child узла в router :
> state child Done ... > state router Done
5. Сброс конфигурации
Для подготовки к следующему упражнению сбросьте конфигурацию. На каждом узле остановите Thread, выполните сброс до заводских настроек и выйдите из имитируемого устройства Thread:
> thread stop Done > factoryreset > > exit
Возможно, вам придётся несколько раз нажать enter , чтобы после команды factoryreset снова появилось приглашение > .
6. Управление сетью с помощью демона OpenThread.
В рамках этого упражнения мы будем моделировать работу одного экземпляра CLI (одного встроенного устройства SoC Thread) и одного экземпляра радиосопроцессора (RCP).
ot-daemon — это режим приложения OpenThread Posix, использующий UNIX-сокет в качестве входа и выхода, позволяющий ядру OpenThread работать как служба. Клиент может взаимодействовать с этой службой, подключаясь к сокету с помощью протокола OpenThread CLI.
ot-ctl — это интерфейс командной строки, предоставляемый ot-daemon для управления и настройки RCP. С его помощью мы подключим RCP к сети, созданной устройством Thread.
Используйте ot-daemon
В этом упражнении будут использоваться три окна терминала, соответствующие следующим:
- Экземпляр командной строки имитированного устройства Thread (Узел 1)
- процесс
ot-daemon - экземпляр CLI
ot-ctl
Если вы продолжаете с предыдущего упражнения, у вас уже должны быть открыты два окна терминала. Откройте третье, чтобы убедиться, что для этого упражнения у вас есть три доступных окна терминала.
1. Запустите узел 1.
В первом окне терминала запустите процесс командной строки для вашего имитируемого устройства Thread:
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 1
Примечание: Если после выполнения этой команды вы не видите приглашение > , нажмите enter .
Создайте новый оперативный набор данных, зафиксируйте его как активный и запустите поток:
> dataset init new Done > dataset Active Timestamp: 1 Channel: 13 Channel Mask: 07fff800 Ext PAN ID: 97d584bcd493b824 Mesh Local Prefix: fd55:cf34:dea5:7994/64 Network Key: ba6e886c7af50598df1115fa07658a83 Network Name: OpenThread-34e4 PAN ID: 0x34e4 PSKc: 38d6fd32c866927a4dfcc06d79ae1192 Security Policy: 0, onrcb Done
Зафиксируйте этот набор данных как активный:
> dataset commit active Done
Активируйте интерфейс IPv6:
> ifconfig up Done
Запуск операции протокола потока:
> thread start Done
Просмотрите IPv6-адреса, назначенные интерфейсу Thread узла 1:
> ipaddr fd55:cf34:dea5:7994:0:ff:fe00:fc00 fd55:cf34:dea5:7994:0:ff:fe00:d000 fd55:cf34:dea5:7994:460:872c:e807:c4ab fe80:0:0:0:9cd8:aab6:482f:4cdc Done >
Как пояснялось в шаге «Имитация сети потоков» , один адрес является локальным ( fe80 ), а три — локальными ( fd ). EID — это локальный адрес, который не содержит ff:fe00 . В этом примере выходных данных EID равен fd55:cf34:dea5:7994:460:872c:e807:c4ab .
Определите конкретный EID из выходных данных ipaddr , который будет использоваться для связи с узлом.
2. Запустите ot-daemon
Во втором окне терминала перейдите в каталог openthread и запустите ot-daemon для RCP-узла, который мы назовем Node 2. Используйте флаг -v verbose, чтобы видеть вывод логов и убедиться, что он запущен, и обязательно используйте sudo :
$ cd ~/src/openthread
$ sudo ./build/posix/src/posix/ot-daemon -v \
'spinel+hdlc+forkpty://build/simulation/examples/apps/ncp/ot-rcp?forkpty-arg=2'
В случае успеха, 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
Оставьте этот терминал открытым и работающим в фоновом режиме. Вы не будете вводить в него никаких дальнейших команд.
3. Используйте команду ot-ctl для подключения к сети.
Мы еще не подключили узел 2 (RCP-контроллер ot-daemon ) ни к одной сети Thread. Вот тут-то и пригодится ot-ctl . ot-ctl использует тот же интерфейс командной строки, что и приложение OpenThread CLI. Поэтому вы можете управлять узлами ot-daemon так же, как и другими имитируемыми устройствами Thread.
В третьем окне терминала запустите команду ot-ctl :
$ sudo ./build/posix/src/posix/ot-ctl >
Примечание: Если после выполнения этой команды вы не видите приглашение > , нажмите enter .
В третьем окне терминала вы будете использовать ot-ctl для управления узлом 2 (узлом RCP), который вы запустили во втором окне терминала с помощью ot-daemon . Проверьте state узла 2:
> state disabled Done
Используйте eui64 из Node 2, чтобы ограничить присоединение только определенным участником:
> eui64 18b4300000000001 Done
На узле 1 (первое окно терминала) запустите Commissioner и ограничьте возможность подключения только для этого eui64:
> commissioner start Done > commissioner joiner add 18b4300000000001 J01NME Done
На узле 2 (третье окно терминала) откройте сетевой интерфейс и подключитесь к сети:
> ifconfig up Done > joiner start J01NME Done
...подождите несколько секунд для подтверждения...
Join success
В качестве участника, RCP (Узел 2) успешно прошел аутентификацию у Комиссара (Узел 1) и получил учетные данные сети Thread Network.
Теперь подключите узел 2 к сети Thread:
> thread start Done
4. Проверка сетевой аутентификации
Проверьте state узла 2, чтобы убедиться, что он подключился к сети. В течение двух минут узел 2 переходит из child узла в router :
> state child Done ... > state router Done
5. Проверьте подключение.
Завершите работу ot-ctl , используя Ctrl+D или команду exit , и в командной строке вашей хост-машины выполните команду ping6 , используя его EID. Если экземпляр RCP ot-daemon успешно подключен к сети Thread и взаимодействует с ней, пинг будет успешным:
$ ping6 -c 4 fd55:cf34:dea5:7994:460:872c:e807:c4ab PING fd55:cf34:dea5:7994:460:872c:e807:c4ab (fd55:cf34:dea5:7994:460:872c:e807:c4ab): 56 data bytes 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=0 ttl=64 time=4.568 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=1 ttl=64 time=6.396 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=2 ttl=64 time=7.594 ms 64 bytes from fd55:cf34:dea5:7994:460:872c:e807:c4ab: icmp_seq=3 ttl=64 time=5.461 ms --- fd55:cf34:dea5:7994:460:872c:e807:c4ab ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 4.568/6.005/7.594/1.122 ms
7. Поздравляем!
Вы успешно смоделировали свою первую нейронную сеть Thread с использованием OpenThread. Отлично!
В этом практическом занятии вы научились:
- Настройте цепочку инструментов сборки OpenThread.
- Имитация сети потоков
- Аутентификация узлов потоков
- Управление сетью потоков с помощью демона OpenThread
Если вы хотите узнать больше, ознакомьтесь с этими источниками: