1. Введение

Что такое нить и 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, в данном курсе не рассматриваются.
Что вам понадобится
- Введение в потоки . Для понимания материала, изучаемого в этом практическом занятии, вам необходимо знать основные понятия потоков.
- Предпочтительно использовать Linux x86_64 или Mac OS с Homebrew . Ubuntu версии 24 или выше в Windows WSL2 также должна работать, но может потребоваться некоторая ручная настройка параметров.
- Git .
- Веб-браузер. OTNS-Web использует веб-браузер для отображения результатов моделирования.
- Анализатор сетевых протоколов Wireshark (опционально).
- Перейдите на версию 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 перейдет в консоль командной строки ( 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 — это интерфейс командной строки (CLI) для управления моделированием OTNS.
$ otns >_ ← OTNS-CLI prompt
Вы можете вводить команды через OTNS-CLI . Полный список команд см. в справочнике OTNS CLI . Не волнуйтесь, в этом практическом занятии вы будете использовать лишь некоторые из этих команд.
Для обзора команд командной строки введите команду help . Этот список идентичен справочнику командной строки.
> 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. Он предоставляет визуальное представление узлов, сообщений и связей моделируемой сети Thread. Обратите внимание на различные элементы OTNS-Web :

5. Добавьте узлы
Добавляйте узлы через OTNS-CLI.
Добавьте в симуляцию маршрутизатор потоков:
> 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 . Справа от выбранного узла должен появиться новый маршрутизатор. Новый маршрутизатор должен присоединиться к существующему разделу Thread:

Также нажмите кнопки FED, MED, SSED и BR на панели действий, чтобы создать эти другие типы узлов. Теперь должно быть в общей сложности 9 узлов. При желании перетащите некоторые узлы в другие позиции, чтобы создать другую физическую топологию сети.

Теперь вы создали сеть Thread с одним разделом, содержащим множество узлов. В следующем разделе мы настроим скорость моделирования, чтобы ускорить его выполнение.
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 маршрутизатора (шестиугольной формы), возможно, пограничный маршрутизатор (квадратной формы) и множество дочерних элементов, и работать со скоростью в 10 раз выше обычной.
Найдите текущего лидера (красная рамка) среди двух маршрутизаторов и выберите его одним щелчком мыши:

Выключите радио
Нажмите
Кнопка на панели действий позволяет отключить радиосвязь узла-лидера. Лидер не сможет отправлять или получать сообщения при выключенной радиосвязи.
Подождите примерно 12 секунд (120 секунд в режиме моделирования), пока другой маршрутизатор или пограничный маршрутизатор не станет новым лидером:

Сеть Thread автоматически восстанавливается после сбоя лидера, формируя новый раздел с новым лидером. Новый раздел также имеет новый цвет.
Включите радио
Выберите лидера, у которого была выключена радиосвязь. Нажмите на него.
Нажмите кнопку на Action Bar , чтобы восстановить радиосвязь:

Лидер должен повторно подключиться к сети после восстановления радиосвязи.
8. Переместить узлы
OTNS позволяет пользователям легко перемещать узлы с помощью OTNS-CLI или OTNS-Web .
Переместите узел через OTNS-CLI
Переместите узел пограничного маршрутизатора 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 и как его можно использовать для моделирования сетей OpenThread.
Что дальше?
Посмотрите некоторые из этих практических занятий по программированию...
- Имитация сети Thread с помощью OpenThread
- Имитация сетевой модели Thread с использованием OpenThread в Docker.
- Создайте сеть Thread с использованием плат nRF52840 и OpenThread.