Симулируйте сети потоков с помощью OTNS

1. Введение

Изображение топологии сети Thread mesh

Что такое нить и 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 в начале

Если на странице 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 :

Элементы веб-интерфейса OTNS объяснены.

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 :

Сеть потоков с 4 узлами

Также в OTNS-Web можно выбрать любой из узлов, чтобы получить панель с более подробной информацией о нем. Например, на рисунке ниже выбран узел 1. Запись «Роль» на панели подтверждает, что это Лидер.

Сеть потоков с 4 узлами, выбран узел 1.

Добавление узлов через OTNS-Web

Вы также можете добавлять узлы через OTNS-Web . Нажмите кнопку New Router на Action Bar . Справа от выбранного узла должен появиться новый маршрутизатор. Новый маршрутизатор должен присоединиться к существующему разделу Thread:

Добавлен маршрутизатор, всего 5 узлов.

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

Добавлено несколько новых узлов, всего 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 раз выше обычной.

Найдите текущего лидера (красная рамка) среди двух маршрутизаторов и выберите его одним щелчком мыши:

Сеть потоков с выбранным ведущим узлом 1

Выключите радио

Нажмите Кнопка выключения радио Кнопка на панели действий позволяет отключить радиосвязь узла-лидера. Лидер не сможет отправлять или получать сообщения при выключенной радиосвязи.

Подождите примерно 12 секунд (120 секунд в режиме моделирования), пока другой маршрутизатор или пограничный маршрутизатор не станет новым лидером:

Формируется новый раздел, в котором узел 9 становится новым лидером.

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

Включите радио

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

Узел 1 присоединяется к разделу после повторного включения его радиосвязи.

Лидер должен повторно подключиться к сети после восстановления радиосвязи.

8. Переместить узлы

OTNS позволяет пользователям легко перемещать узлы с помощью OTNS-CLI или OTNS-Web .

Переместите узел через OTNS-CLI

Переместите узел пограничного маршрутизатора 9 в новое место:

> move 9 50 50
Done

Переместите узел через OTNS-Web.

Перетащите узел 5 в самый нижний правый угол. Поскольку узел 5 теперь находится вне зоны действия радиосигнала других маршрутизаторов, он образует собственный раздел с новым идентификатором раздела. Идентификаторы разделов можно проверить на панели информации об узлах, щелкнув по узлам.

Узел 5 отодвигается от остальных узлов и образует новый раздел.

Обратите внимание, что между узлом 5 и узлом 9 по-прежнему отображается одна зеленая линия. Часто это происходит из-за устаревшей информации о дочернем узле, которая все еще хранится в таблице дочерних узлов бывшего родителя. Или это может быть устаревшая информация о прежнем соединении маршрутизатор-маршрутизатор между узлом 9 и узлом 5. (Или, возможно, в данном случае, даже ошибка рендеринга.) В конечном итоге, устаревшая информация удаляется на узлах после истечения соответствующего таймаута.

9. Удалить узлы

Удаление узлов через OTNS-CLI

Удалить узел 5:

> del 5
Done

Узел 5 должен исчезнуть из симуляции:

Узел 5 удален из симуляции.

Удаление узлов через OTNS-Web

Выберите узел Border Router 9 и нажмите Кнопка «Удалить» кнопка на Action Bar для удаления узла 9:

Узел 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_ .log , ниже приведен фрагмент файла журнала:

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.

Скриншот анализа пакетов 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.

Что дальше?

Посмотрите некоторые из этих практических занятий по программированию...

Справочная документация