1. Введение
Что такое Thread и OTNS
Thread — это маломощный беспроводной сетчатый протокол на основе IP, обеспечивающий безопасную связь между устройствами и между устройствами и облаком. Сети Thread могут адаптироваться к изменениям топологии, чтобы избежать единой точки отказа.
OpenThread, выпущенный Google, представляет собой реализацию Thread с открытым исходным кодом. Несмотря на небольшой размер кода и занимаемую память, OpenThread поддерживает все функции, определённые в спецификации Thread .
OpenThread Network Simulator (OTNS) можно использовать для моделирования сетей Thread, запуская моделируемые узлы OpenThread на платформах POSIX. OTNS предоставляет простой в использовании веб-интерфейс (OTNS-Web) для визуализации и управления моделируемыми сетями Thread. Также возможно моделирование с помощью скриптов (на Python).
Чему вы научитесь
- Установить OTNS и его зависимости
- Познакомьтесь с основами OTNS-CLI
- Как добавлять/перемещать/удалять узлы OpenThread в OTNS-Web
- Используйте другие полезные функции OTNS-Web для управления моделированием сети.
- Проверьте отсутствие единой точки отказа OpenThread
- Просмотр трафика данных между узлами OpenThread в Wireshark
В этой лабораторной работе основное внимание уделено интерактивному использованию OTNS-CLI и OTNS-Web. Другие функции OTNS, такие как написание скриптов на Python, не рассматриваются.
Что вам понадобится
- Учебник по Thread Primer . Вам необходимо знать основные понятия Thread, чтобы понять материал этой практической работы.
- Предпочтительно Linux x86_64 или Mac OS с Homebrew . Ubuntu версии 24 или выше в Windows WSL2 также должна работать, но может потребоваться ручная настройка.
- Гит .
- Веб-браузер. OTNS-Web использует веб-браузер для отображения результатов моделирования.
- Анализатор сетевых протоколов Wireshark (опционально).
- Go версии 1.23 или выше.
- Скрипт установки проверит установленную версию Go.
- Если Go не установлен, будет установлена версия >= 1.23, если она доступна в менеджере пакетов.
- Если пакет недоступен в менеджере пакетов, потребуется ручная установка.
- Обратите внимание, что Ubuntu 24.04 и более ранние версии не поддерживают Go 1.23 автоматически. Подробности см. на странице «Доступные версии Golang» в документации Ubuntu. Возможна ручная установка с помощью
snap
или другими способами.
- Python версии 3.9 или выше.
- Скрипт установки проверит установленную версию Python.
- Если Python 3 еще не установлен, будет установлена версия >= 3.9, если она доступна в менеджере пакетов.
- Если пакет недоступен в менеджере пакетов, потребуется ручная установка.
Терминология
Термин «маршрутизатор» используется в качестве технического обозначения для устройства Thread Mesh Extender, которое изначально называлось Thread Router. «Узел» относится к любому моделируемому устройству OpenThread в симуляции OTNS.
2. Установка
Получить код OTNS
$ git clone https://github.com/openthread/ot-ns.git ./otns $ cd otns
Все последующие консольные команды в этой лабораторной работе запускаются из каталога otns
.
Загрузка и установка
Скрипт bootstrap
установит зависимости (включая Python 3 и Go/Golang, если необходимо), а также установит OTNS. Обратите внимание, что скрипт может остановиться, если не сможет автоматически установить некоторые зависимости, например, Python версии >= 3.9 или Go версии >= 1.23. Для автоматической установки необходимо, чтобы пакеты были найдены в настроенном репозитории пакетов операционной системы.
Скрипт также создаёт различные типы узлов OT, которые можно использовать непосредственно в симуляции, и выполняет некоторые базовые тесты. Из-за сборки этих узлов процесс может занять несколько минут.
$ ./script/bootstrap .... .... OTNS installed - use 'otns' to start it. $
Во время выполнения скрипта вас могут попросить ввести пароль для sudo
.
Если otns
установлен неправильно
Скрипт может сообщить об ошибке следующего вида:
.... OTNS installed - please add ~/go/bin to your PATH variable first, to use it. $
В этом случае вам необходимо добавить $(go env GOPATH)/bin
в переменную $PATH
.
В случае возникновения других ошибок можно создать задачу на GitHub .
3. Запустите OTNS в первый раз
Запустить otns
:
$ otns >_ ← OTNS-CLI prompt
При успешном запуске OTNS войдет в консоль CLI ( OTNS-CLI
) и запустит веб-браузер для визуализации и управления сетью ( OTNS-Web
):
Если вы видите только пустую страницу OTNS-Web, вероятно, в вашем браузере не включён WebGL. Подробнее о том, как включить WebGL, читайте на странице https://superuser.com/a/836833 .
В следующих разделах вы научитесь управлять моделированием OTNS с помощью OTNS-CLI
и OTNS-Web
.
4. Знакомство с OTNS-CLI и OTNS-Web
OTNS-CLI
OTNS-CLI
— это интерфейс командной строки (CLI) для управления моделированием OTNS.
$ otns >_ ← OTNS-CLI prompt
Вы можете вводить команды через OTNS-CLI
. Полный список команд см. в справочнике по OTNS CLI . Не волнуйтесь, в этой лабораторной работе вы будете использовать лишь некоторые из них.
Введите команду help
, чтобы получить обзор команд CLI. Этот список идентичен справочнику по CLI.
> help add Add a node to the simulation and get the node ID. .... .... Done >
Чтобы получить дополнительную справку по конкретной команде, используйте ее имя, например:
> help add add Add a node to the simulation and get the node ID. Definition: .... .... >
OTNS-Web
OTNS-Web
— это инструмент визуализации и управления сетью OTNS. Он обеспечивает визуальное представление узлов, сообщений и связей моделируемой сети Thread. Обратите внимание на различные элементы OTNS-Web
:
5. Добавить узлы
Добавить узлы через OTNS-CLI
Добавьте Thread Router в симуляцию:
> add router 1 Done
Вы увидите созданный узел в OTNS-Web
. Узел запускается как маршрутизатор и через несколько секунд становится лидером:
Чтобы упростить интерактивный запуск моделирования, каждый новый узел OpenThread по умолчанию снабжается стандартным набором сетевых параметров.
Добавьте больше узлов через OTNS-CLI
Теперь добавим несколько узлов разных типов.
> add fed 2 Done > add med 3 Done > add sed 4 Done
Подождите несколько секунд, пока узлы объединятся в один раздел. Вы должны увидеть узлы в OTNS-Web
:
Также в OTNS-Web
можно выбрать любой узел, чтобы открыть панель с дополнительной информацией о нём. Например, на рисунке ниже выбран узел 1. Запись «Роль» на панели подтверждает, что это Лидер.
Добавить узлы через OTNS-Web
Вы также можете добавлять узлы через OTNS-Web
. Нажмите кнопку New Router
на Action Bar
. Справа от выбранного узла должен появиться узел, создаваемый в процессе. Новый маршрутизатор должен присоединиться к существующему разделу потоков:
Также нажмите кнопки FED, MED, SSED и BR на панели действий, чтобы создать эти другие типы узлов. Теперь должно быть 9 узлов. При желании перетащите некоторые узлы в другие места, чтобы создать другую топологию физической сети.
Итак, вы создали сеть потоков, состоящую из одного раздела и множества узлов. В следующем разделе мы настроим скорость симуляции, чтобы ускорить её выполнение.
6. Отрегулируйте скорость
В настоящее время симуляция должна выполняться на скорости 1X
, что означает, что время симуляции, прошедшее на данный момент, совпадает с фактическим временем с момента создания первого узла.
Регулировка скорости через OTNS-CLI
Скорость симуляции можно настроить через OTNS-CLI
.
Установите скорость симуляции на 100X
> speed 100 Done
Вы должны увидеть, что узлы отправляют сообщения гораздо чаще, чем раньше.
Установите скорость симуляции на MAX
> speed max Done
Сейчас OTNS старается выполнять моделирование как можно быстрее, поэтому вы должны увидеть, как узлы отправляют большое количество сообщений.
Пауза симуляции
> speed 0 Done
Установка скорости симуляции на 0
приостанавливает симуляцию.
Восстановить симуляцию на нормальной скорости
> speed 1 Done
Установка скорости симуляции на значение больше 0
возобновляет симуляцию.
Отрегулируйте скорость через OTNS-Web
Кнопки управления скоростью
Найдите кнопки управления скоростью на
Action Bar
. Кнопки показывают текущую скорость симуляции и могут использоваться для регулировки скорости симуляции, а также для приостановки/возобновления симуляции.
Ускорить моделирование
Вы можете ускорить симуляцию, нажав кнопку кнопку, пока скорость не достигнет
MAX
.: .
Замедлить симуляцию
Вы можете замедлить симуляцию, нажав кнопку кнопка.
Пауза симуляции
Нажмите на Кнопка, чтобы приостановить симуляцию во время её выполнения. Кнопка изменится на
.
Моделирование резюме
Нажмите на Кнопка для возобновления симуляции после паузы. Кнопка изменится на
.
Установите скорость симуляции на 10X
Чтобы сэкономить время, используйте
OTNS-CLI
для настройки скорости моделирования
10X
, чтобы мы могли гораздо быстрее наблюдать изменения топологии в сети.
> speed 10 Done
7. Включение/выключение радио
Теперь симуляция должна содержать не менее 2 маршрутизаторов (шестиугольной формы), возможно, граничный маршрутизатор (квадратной формы) и много дочерних элементов и работать на скорости 10X.
Найдите текущего лидера (красная рамка) из двух маршрутизаторов, щелкните его один раз, чтобы выбрать:
Выключить радио
Нажмите на Кнопка на панели действий позволяет отключить радиосвязь узла «Лидер». При выключенной радиосвязи «Лидер» не сможет отправлять и получать сообщения.
Подождите около 12 секунд (120 секунд при моделировании), пока другой маршрутизатор или пограничный маршрутизатор станет новым лидером:
Сеть потоков автоматически восстанавливается после сбоя лидера, формируя новый раздел с новым лидером. Новый раздел также имеет новый цвет.
Включи радио
Выберите лидера, у которого было выключено радио. Нажмите кнопку кнопка на
Action Bar
для восстановления радиосвязи:
После восстановления радиосвязи «Лидер» должен повторно подключиться к сети.
8. Перемещение узлов
OTNS позволяет пользователям легко перемещать узлы через OTNS-CLI
или OTNS-Web
.
Переместить узел через OTNS-CLI
Переместите узел Border Router 9 в новое место:
> move 9 50 50 Done
Переместить узел через OTNS-Web
Переместите узел 5 в самый нижний правый угол, перетаскивая его. Поскольку узел 5 теперь находится вне зоны действия радиосвязи других маршрутизаторов, он формирует свой собственный раздел с новым идентификатором раздела. Идентификаторы разделов можно проверить на панели информации об узле, щелкнув по ним.
Обратите внимание, что между узлами 5 и 9 всё ещё отображается одна зелёная линия. Часто это связано с устаревшей информацией о дочернем узле, которая всё ещё хранится в таблице дочерних узлов бывшего родителя. Или это может быть устаревшая информация о бывшем межмаршрутизаторном соединении между узлами 9 и 5. (Или, возможно, в данном случае, это даже ошибка рендеринга.) В конечном итоге устаревшая информация на узлах удаляется по истечении соответствующего времени ожидания.
9. Удалить узлы
Удаление узлов через OTNS-CLI
Удалить узел 5:
> del 5 Done
Узел 5 должен исчезнуть из симуляции:
Удаление узлов через OTNS-Web
Выберите узел Border Router 9 и щелкните кнопка на
Action Bar
для удаления узла 9:
Node 1
должен стать лидером нового раздела, а все оставшиеся узлы будут присоединены как дочерние к узлу 1.
10. Контекст узла OTNS-CLI
OTNS-CLI
предоставляет режим контекста узла для удобного взаимодействия с узлами, помогая разработчикам диагностировать их состояние. Кроме того, из этого режима можно инициировать действия с узлами.
Войти в режим контекста узла
Введите контекст узла 1:
> node 1 Done node 1>
Приглашение CLI изменилось на node 1>
, что указывает на текущий контекст узла. Вы можете вводить команды OpenThread CLI для выполнения на узле, как будто взаимодействуете с ним напрямую.
Выполнение команд в контексте узла
node 1> state leader Done node 1> channel 11 Done node 1> panid 0xface Done node 1> networkname otns Done node 1> ipaddr fdde:ad00:beef:0:0:ff:fe00:fc00 fdde:ad00:beef:0:0:ff:fe00:b400 fd00:f00d:cafe:0:2505:8719:3685:ebfb fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb fe80:0:0:0:e86a:e07:ec97:777 Done
Переключиться на другой контекст узла
node 1> node 2 Done node 2>
Контекст выходного узла
node 1> exit Done >
Альтернативным способом выхода из контекста узла является команда node 0
.
11. Просмотр журналов узлов и захватов пакетов
Журналы узлов OpenThread
По умолчанию OTNS создаёт подробные файлы журнала для всех симулированных узлов OpenThread. Их можно просмотреть в каталоге ./tmp
. Имя файла — 0_
. Например, фрагмент файла журнала показан ниже:
7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-: src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6 | ..&..!.eSZCN.Y. |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-: src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-: dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---: 12 0x3000 - me - leader
Абсолютное время моделирования в микросекундах показано слева. Временная метка в формате hh:mm:ss
соответствует временной метке журнала узла OpenThread, которая может отличаться от абсолютного времени моделирования.
Захват пакетов Wireshark
По умолчанию все передаваемые кадры IEEE 802.15.4 сохраняются в PCAP-файле current.pcap
. Wireshark может прочитать этот файл во время или после моделирования. Из-за шифрования Thread на канальном уровне требуется однократная настройка в Wireshark для корректной установки ключа дешифрования для OTNS. По умолчанию используется один известный сетевой ключ, что упрощает дешифрование кадров в Wireshark.
На снимке экрана ниже представлен пример проверки пакетов OpenThread в Wireshark.
Чтобы настроить ключ дешифрования, выберите в меню «Правка» -> «Настройки» . Затем в окне настроек выберите «Протоколы» -> «IEEE 802.15.4» . Нажмите кнопку «Изменить...» рядом с пунктом «Ключи дешифрования». Нажмите «+» , чтобы создать новую запись, и введите ключ 00112233445566778899aabbccddeeff
(32 символа). В поле «Хеш ключа» выберите «Хеш потока». Значение «Индекс ключа дешифрования» можно оставить равным 0
Затем нажмите «ОК » и ещё раз «ОК» . Теперь файл OTNS PCAP должен корректно дешифроваться при загрузке.
Временные метки, отображаемые в столбце «Время» (в секундах), соответствуют абсолютным значениям времени моделирования, отображаемым в журналах узлов OpenThread. Это упрощает сопоставление сообщений журнала с переданными или полученными радиокадрами. Однако эти значения обычно не совпадают с точностью до одной микросекунды: имитируемое радиооборудование IEEE 802.15.4 может вносить дополнительную задержку после того, как стек OpenThread запросит отправку радиокадра.
12. Поздравления
Поздравляем, вы успешно выполнили свою первую симуляцию OTNS!
Вы узнали, как установить OTNS и его зависимости. Вы запустили моделирование OTNS с использованием узлов OpenThread. Вы узнали, как управлять моделированием различными способами через OTNS-CLI
и OTNS-Web
.
Теперь вы знаете, что такое OTNS и как можно использовать OTNS для моделирования сетей OpenThread.
Что дальше?
Ознакомьтесь с некоторыми из этих практикумов...
- Моделирование сети потоков с помощью OpenThread
- Моделирование сети потоков с использованием OpenThread в Docker
- Создание сети Thread с использованием плат nRF52840 и OpenThread