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

1. Введение

Впечатление от топологии сетчатой ​​сети Thread

Что такое 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, не рассматриваются.

Что вам понадобится

  • Предпочтительно Linux x86_64 или Mac OS с Homebrew . Ubuntu 22/24 в Windows WSL2 также должны работать, но могут потребоваться некоторые ручные настройки.
  • Гит .
  • Веб-браузер. OTNS-Web использует веб-браузер для отображения симуляций.
  • Thread Primer . Вам необходимо знать основные концепции Thread, чтобы понять, чему учит эта практическая работа.

Терминология

Термин «Маршрутизатор» используется как технический термин для Thread Mesh Extender, который изначально назывался Thread Router. «Узел» относится к любому моделируемому устройству OpenThread в симуляции OTNS.

2. Установка

Получить код OTNS

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

Все последующие команды консоли в этой лабораторной работе запускаются из каталога otns .

Загрузка и установка

Скрипт bootstrap установит зависимости (включая Python3 и Go/Golang, если необходимо) и установит OTNS. Он также создает различные типы узлов 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 при запуске

Если вы видите только пустую страницу для OTNS-Web, скорее всего, WebGL не включен в вашем браузере. Пожалуйста, обратитесь к https://superuser.com/a/836833 , чтобы узнать, как включить WebGL.

В следующих разделах вы научитесь управлять моделированием OTNS с помощью OTNS-CLI и OTNS-Web .

4. Познакомьтесь с OTNS-CLI и OTNS-Web

OTNS-CLI

OTNS-CLI — это интерфейс командной строки (CLI) для управления моделированием OTNS.

$ otns
>_ ← OTNS-CLI prompt

Вы можете вводить команды через OTNS-CLI . Обратитесь к справочнику OTNS CLI для полного списка команд. Не волнуйтесь, вы будете использовать только несколько из этих команд в этой Codelab.

Введите команду 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-Веб

OTNS-Web — это инструмент визуализации и управления сетью OTNS. Он обеспечивает визуальное представление узлов, сообщений и связей моделируемой сети Thread. Обратите внимание на различные элементы OTNS-Web :

Объяснение элементов 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 :

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

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

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

Добавить узлы с помощью OTNS-Web

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

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

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

Добавлено несколько новых узлов, всего 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 .: Индикатор скорости моделирования MAX .

Замедлить симуляцию

Вы можете замедлить симуляцию, нажав кнопку Кнопка уменьшения скорости кнопка.

Приостановить симуляцию

Нажмите на Кнопка паузы кнопка для приостановки симуляции во время ее работы. Кнопка изменится на Кнопка воспроизведения .

Возобновить моделирование

Нажмите на Кнопка воспроизведения кнопка для возобновления симуляции, когда она приостановлена. Кнопка будет изменена обратно на Кнопка паузы .

Установите скорость симуляции на 10X

Чтобы сэкономить время, используйте

OTNS-CLI для настройки скорости моделирования

10X , чтобы мы могли гораздо быстрее наблюдать изменения топологии в сети.

> speed 10
Done

7. Включить/выключить радио

Теперь симуляция должна содержать не менее 2 маршрутизаторов (шестиугольной формы), возможно, один граничный маршрутизатор (квадратной формы) и множество дочерних элементов, и работать на скорости 10X.

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

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

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

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

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

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

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

Включи радио

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

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

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

8. Перемещение узлов

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

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

Переместите узел Border Router 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

Чтобы настроить ключ дешифрования, выберите в меню Edit -> Preferences . Затем в окне настроек выберите Protocols -> IEEE 802.15.4 . Нажмите кнопку Edit... рядом с «Decryption Keys». Нажмите + , чтобы создать новую запись, и введите ключ 00112233445566778899aabbccddeeff (32 символа) и выберите «Thread hash» в поле «Key hash». «Decryption key index» можно оставить равным 0 Затем нажмите OK и еще раз OK . Теперь файл OTNS PCAP должен правильно дешифроваться при загрузке.

Временные метки, показанные в столбце «Время» (в секундах), соответствуют абсолютным значениям времени моделирования, показанным в журналах узлов OpenThread. Это упрощает сопоставление сообщений журнала с переданными или полученными радиокадрами. Однако значения обычно не идентичны с точностью до одной микросекунды: смоделированное радиооборудование IEEE 802.15.4 может добавить некоторую дополнительную задержку после того, как стек OpenThread запросит отправку радиокадра.

12. Поздравления

Поздравляем, вы успешно выполнили свою первую симуляцию OTNS!

Вы узнали, как установить OTNS и его зависимости. Вы запустили симуляцию OTNS с симуляционными узлами OpenThread. Вы узнали, как манипулировать симуляцией различными способами как через OTNS-CLI , так и через OTNS-Web .

Теперь вы знаете, что такое OTNS и как можно использовать OTNS для моделирования сетей OpenThread.

Что дальше?

Ознакомьтесь с некоторыми из этих лабораторных работ...

Справочные документы