1. Введение
OpenThread , выпущенный Google, представляет собой реализацию сетевого протокола Thread с открытым исходным кодом. Google Nest выпустила OpenThread, чтобы сделать технологию, используемую в продуктах Nest, широко доступной для разработчиков и ускорить разработку продуктов для подключенного дома.
Спецификация Thread определяет надежный, безопасный и маломощный протокол беспроводной связи между устройствами на основе IPv6 для домашних приложений. OpenThread реализует все сетевые уровни Thread, включая IPv6, 6LoWPAN, IEEE 802.15.4 с безопасностью MAC, созданием Mesh Link и Mesh Routing.
В этой Codelab вы узнаете, как смоделировать сеть Thread на смоделированных устройствах.
Что вы узнаете
- Как настроить набор инструментов сборки OpenThread
- Как смоделировать сеть потоков
- Как аутентифицировать узлы потоков
- Как управлять сетью потоков с помощью OpenThread Daemon
Что вам понадобится
- мерзавец
- Базовые знания Linux, сетевая маршрутизация.
2. Настройте систему сборки
Гит
Для завершения этой Codelab требуется Git. Загрузите и установите его, прежде чем продолжить.
После установки следуйте инструкциям для вашей конкретной ОС, чтобы загрузить и собрать OpenThread.
XCode для Mac OS X
XCode необходим для установки и сборки OpenThread в Mac OS X.
После установки XCode установите инструменты командной строки XCode:
$ xcode-select --install
Создан на Linux/Mac OS X.
Эти инструкции по установке были протестированы на Ubuntu Server 14.04 LTS и Mac OS X Sierra 10.12.6.
Установите ОпенТред. Команды 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. Для этой Codelab мы используем пример моделирования.
$ cd ~/src/openthread $ ./script/cmake-build simulation
Теперь создайте демон OpenThread:
$ ./script/cmake-build posix -DOT_DAEMON=ON
4. Имитация сети потоков
Пример приложения, которое вы будете использовать для этого Codelab, демонстрирует минимальное приложение OpenThread, которое предоставляет интерфейсы настройки и управления OpenThread через базовый интерфейс командной строки (CLI).
В этом упражнении вы выполните минимальные шаги, необходимые для проверки связи одного имитируемого устройства Thread с другим имитируемым устройством Thread.
На рисунке ниже описана базовая топология сети потоков. В этом упражнении мы смоделируем два узла внутри зеленого круга: лидер потока и маршрутизатор потока с одним соединением между ними.
Пинг узла
1. Запустите узел 1.
Перейдите в каталог openthread
и запустите процесс CLI для имитируемого устройства 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 в этой Codelab будет использовать другой дескриптор файла.
Примечание. При создании процесса для моделируемого устройства используйте только файловые дескрипторы 1
или выше, как указано в этой Codelab. Дескриптор файла 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, назначенные интерфейсу потока узла 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
Типы Mesh-локальных адресов классифицируются дополнительно:
- Содержит
ff:fe00
= локатор маршрутизатора (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. Пинг узла 1 с узла 2.
Проверьте соединение между двумя имитируемыми устройствами 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
, чтобы вернуться к приглашению >
CLI.
Проверьте сеть
Теперь, когда вы можете успешно выполнить проверку связи между двумя имитируемыми устройствами Thread, протестируйте ячеистую сеть, отключив один узел.
Вернитесь к узлу 1 и остановите поток:
> thread stop Done
Переключитесь на узел 2 и проверьте состояние. В течение двух минут Узел 2 обнаруживает, что лидер (Узел 1) находится в автономном режиме, и вы должны увидеть, как Узел 2 становится leader
сети:
> state router Done ... > state leader Done
После подтверждения остановите поток и выполните сброс настроек узла 2 перед выходом. Сброс к заводским настройкам выполняется для того, чтобы гарантировать, что учетные данные сети Thread, которые мы использовали в этом упражнении, не будут перенесены в следующее упражнение.
> thread stop Done > factoryreset > > exit
Также сброс настроек к заводским настройкам и выход из узла 1:
> factoryreset > > exit
См. Справочник по OpenThread CLI , чтобы изучить все доступные команды CLI.
5. Аутентификация узлов при вводе в эксплуатацию
В предыдущем упражнении вы настроили сеть Thread с двумя смоделированными устройствами и проверенным подключением. Однако это позволяет передавать между устройствами только неаутентифицированный локальный трафик IPv6. Чтобы маршрутизировать глобальный трафик IPv6 между ними (и Интернетом через пограничный маршрутизатор Thread), узлы должны пройти аутентификацию.
Для аутентификации одно устройство должно выступать в роли комиссара. Комиссар является выбранным в настоящее время сервером аутентификации для новых устройств Thread и авторизатором предоставления сетевых учетных данных, необходимых для подключения устройств к сети.
В этом упражнении мы будем использовать ту же двухузловую топологию, что и раньше. Для аутентификации лидер потока будет выступать в роли комиссара, а маршрутизатор потока — в качестве объединителя.
1. Создайте сеть
Если продолжить предыдущее упражнение, у вас уже должно быть открыто два окна терминала. Если нет, убедитесь, что два из них открыты и готовы к использованию. Один будет служить узлом 1, другой — узлом 2.
В узле 1 создайте процесс CLI:
$ 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
Разрешите любому участнику (с помощью подстановочного знака *
) с учетными данными участника J01NME
присоединиться к сети. Столяр — это устройство, которое добавляется администратором в введенную в эксплуатацию сеть потоков.
> commissioner joiner add * J01NME Done
3. Запустите роль Столяра
Во втором окне терминала создайте новый процесс CLI. Это узел 2.
$ cd ~/src/openthread $ ./build/simulation/examples/apps/cli/ot-cli-ftd 2
На узле 2 включите роль присоединения, используя учетные данные присоединения J01NME
.
> ifconfig up Done > joiner start J01NME Done
...подождите несколько секунд для подтверждения...
Join success
В качестве участника устройство (узел 2) успешно прошло аутентификацию у комиссара (узел 1) и получило учетные данные сети потоков.
Теперь, когда узел 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 Daemon.
В этом упражнении мы собираемся смоделировать один экземпляр CLI (одно встроенное устройство SoC Thread) и один экземпляр радиосопроцессора (RCP).
ot-daemon
— это режим приложения OpenThread Posix, который использует сокет UNIX в качестве ввода и вывода, поэтому ядро OpenThread может работать как служба. Клиент может взаимодействовать с этой службой, подключаясь к сокету, используя OpenThread CLI в качестве протокола.
ot-ctl
— это интерфейс командной строки, предоставляемый ot-daemon
для управления и настройки RCP. Используя это, мы подключим RCP к сети, созданной устройством Thread.
Используйте ot-daemon
В этом упражнении будут использоваться три окна терминала, соответствующие следующему:
- Экземпляр CLI моделируемого устройства Thread (узел 1)
- процесс
ot-daemon
- экземпляр CLI
ot-ctl
Если продолжить предыдущее упражнение, у вас уже должно быть открыто два окна терминала. Откройте третье, чтобы убедиться, что для этого упражнения у вас есть три окна терминала.
1. Запустите узел 1.
В первом окне терминала запустите процесс CLI для вашего имитируемого устройства 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, назначенные интерфейсу потока узла 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, который мы назовем узлом 2. Используйте подробный флаг -v
, чтобы вы могли увидеть выходные данные журнала и подтвердить, что он работает, и обязательно используйте 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
узла 2, чтобы ограничить присоединение к конкретному Joiner:
> 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) и получил учетные данные сети потоков.
Теперь присоедините Node 2 к сети Thread:
> thread start Done
4. Проверка сетевой аутентификации.
Проверьте state
узла 2, чтобы убедиться, что он теперь подключен к сети. В течение двух минут Узел 2 переходит из child
в router
:
> state child Done ... > state router Done
5. Проверка подключения
Выйдите ot-ctl
используя Ctrl+D или команду exit
, и в командной строке вашего хост-компьютера выполните ping Node 1, используя его EID с командой ping6
. Если экземпляр 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. Потрясающий!
В этой Codelab вы узнали, как:
- Настройте цепочку инструментов сборки OpenThread.
- Имитировать сеть потоков
- Аутентификация узлов потока
- Управление сетью потоков с помощью OpenThread Daemon
Если вы хотите узнать больше, изучите эти ссылки: