Перейти к содержимому

Инспектор ​

Инспектор — это единая лента для всех инструментов: каждое OSC-сообщение, датаграмма, HTTP-обмен, публикация MQTT, сообщение WebSocket, пакет, прошедший через реле, и обмен с эмулятором попадают сюда в расшифрованном виде вместе с байтами, из которых состоят. С его помощью можно увидеть, что на самом деле прошло по сети, в каком порядке и что с этим случилось.

Он живёт в нижней панели, на вкладке Инспектор рядом с консолью, поэтому доступен на любом экране. Щёлкните вкладку, чтобы открыть его; панель открывается достаточно высокой для нескольких строк и подробностей кадра. Кнопка ⤢ (На всю высоту окна) делает панель во всю высоту окна. Инспектор сохраняет свой список и выбор, пока вы закрываете панель или переключаете экраны.

Захват ​

При запуске Signal Lab захват выключен, а пока он выключен, он ничего не стоит: инструменты даже не собирают кадры.

  1. Откройте вкладку Инспектор.
  2. Нажмите Включить захват. Точка на вкладке станет красной и начнёт пульсировать.
  3. Пользуйтесь любым инструментом. Кадры появляются вверху списка, новые первыми.
  4. Нажмите Выключить захват, когда получили всё, что нужно.

Вкладка показывает, сколько кадров захвачено, с любого экрана.

Кадры захватываются с момента включения захвата и никогда раньше: сначала включите его, потом отправляйте.

На сервере захват принадлежит серверу: каждая вошедшая на него страница видит одни и те же кадры, а включение или очистка на одной странице действуют для всех.

Что захватывается ​

ИнструментКадрыСколько
OSC: отправкаКаждое отправленное сообщениеКаждое
OSC: мониторКаждый принятый пакет; пакет, который не декодируется, помечен ошибкой декодированияКаждый
OSC: генератор сигналаОтправленные сообщенияНе более одного за 100 мс, с пометкой sampled
Броадкаст: отправить один разКаждая датаграмма, по одной на адресата; неудавшаяся отправка — с ошибкойКаждая
Броадкаст: маякОтправленные датаграммыНе более одной за 50 мс
Броадкаст: приёмник обнаруженияПринятые пробыНе более одной за 40 мс
Броадкаст: приёмник обнаруженияЕго ответы (auto-reply)Каждый
HTTP: отправка, сигналы, запросы экспериментаКаждый обмен: строка запроса, статус и время, заголовки ответа и начало телаКаждый
HTTP: нагрузочный поток и запросы под нагрузкойОбменыНе более одного за 100 мс
MQTT: соединениеОтправленные публикацииКаждая
MQTT: соединениеПринятые сообщенияНе более одного за 200 мс
MQTT: MQTT-сигнал, отправленный, пока экран не подключён к его брокеруПубликацияКаждая
WebSocketОтправленные и принятые сообщенияКаждое, пока трафик небольшой; не более 200 в секунду
ЭмуляторыТо, что пришло, и ответ — вместеНе более одного обмена за 10 мс
ПомехиКаждая датаграмма или фрагмент, прошедшие через реле, в обе стороны, с их судьбойНе более одного за 25 мс для обоих направлений вместе
Шторм (UDP)Пакеты потока, все одинаковыеОдин в секунду, с пометкой sampled 1/s; TCP-шторм ничего не захватывает
СканерКаждый открытый порт с баннеромКаждый
ЭкспериментыТо, что отправляют узлы запуска (TCP-сообщение: записанное содержимое и прочитанный ответ), и то, что получают его ожиданияКак у используемого инструмента

Инструмент, который берёт выборки, нарочно пропускает остальное и считает пропущенное: следующий нарисованный им кадр сообщает, сколько он удержал, в своём вердикте как +n not shown (sampled · +5 not shown). Это число того, что инструмент нарисовал бы, а не собственного сброса захвата (см. Счётчики и пропуски).

Список кадров ​

СтолбецЧто в нём
ВремяКогда кадр захвачен, с точностью до миллисекунды.
Напр.→ отправлен (tx), ← получен (rx). Для реле → означает от клиента к цели, а ← — от цели к клиенту.
Прот.osc, udp, tcp, http, mqtt или ws.
ПирДругая сторона: IP:port, URL, брокер.
БайтыРазмер кадра.
КраткоОдна строка в собственной нотации протокола, например /fader/1 0.75 или GET http://127.0.0.1:8080/ → 200 in 3ms.
ВердиктЧто с ним случилось, если есть что сказать.

Вердикт бывает зелёным, жёлтым или красным. Красный — потеря или ошибка (dropped (loss), failed, error: …); жёлтый — кадр изменён или это лишь выборка из многих (corrupted, copy 2/2, sampled, +n not shown); зелёный — всё остальное. Вот некоторые вердикты, которые вам встретятся:

ВердиктОткудаЧто значит
forwarded +42msПомехиПередан дальше после такой задержки; могут следовать · corrupted, · reordered или · copy 1/2.
dropped (loss), dropped (burst), dropped (offline)ПомехиПотерян намеренно, и по какой причине.
throttledПомехиОтброшен из-за ограничения полосы.
· client→target, · target→clientПомехиЗавершает вердикт каждого кадра, прошедшего через реле, перед любым +n not shown: в какую сторону он шёл.
#2 → 200 OK · 37 B, — → 404 …ЭмуляторыКакое правило ответило (—: никакое) и сам ответ.
down, down → 503ЭмуляторыПришёл, пока эмулятор был отключён.
200 OK, failedHTTPСтатус ответа или отсутствие ответа вообще.
openСканерОткрытый порт.
auto-replyОбнаружениеОтвет, который приёмник отправил на пробу.
clears retainedMQTTПустая retained-публикация.
+n not shownЛюбой инструмент, берущий выборкиСтолько кадров с предыдущего были пропущены; он следует за остальным вердиктом кадра после ·.

Список хранит новейшие 4000 кадров и рисует новейшие 300, подходящие под фильтры; под фильтрами написано, сколько показано из скольких подходящих.

Фильтрация ​

  • Введите текст в поле (фильтр по адресу, пиру, источнику…), чтобы оставить кадры, у которых краткое описание, пир, источник, протокол или вердикт содержат этот текст.
  • Щёлкайте плашки протоколов (osc, udp, tcp, http, mqtt, ws), чтобы показать только эти протоколы. Если ни одна плашка не включена, показываются все протоколы.
  • Щёлкните tx или rx, чтобы показать только отправленные или только полученные кадры.
  • Кнопка сбросить сбрасывает все три.

Фильтры меняют только то, что показывает список. Захват, счётчики и экспорт всегда охватывают всё.

Пауза и очистка ​

Кнопка Пауза замораживает список, чтобы вы могли читать его, пока трафик идёт; захват продолжается. Кнопка Продолжить снова впускает новые кадры. Кадры, пришедшие, пока вид был на паузе, в список не добавляются, но они есть в захвате и в экспорте.

Кнопка Очистить очищает список и захват и обнуляет счётчики.

Счётчики и пропуски ​

Полоса вверху считает захваченные кадры и их байты и показывает, насколько заполнен захват (хранимые кадры из 8192).

Когда кадры приходят быстрее, чем список успевает их принять, — больше 250 примерно за одну восьмую секунды, — список пропускает самые старые из них. Тогда жёлтая плашка считает не показанные кадры, а строка в списке отмечает, где они отсутствуют. Эти кадры всё ещё в захвате, если их с тех пор не вытеснили более новые: экспортируйте захват, чтобы их увидеть.

Подробности кадра ​

Щёлкните строку, чтобы увидеть кадр справа.

ПолеЧто это
номерНомер кадра. Номера растут в порядке захвата и никогда не используются повторно.
ВремяКогда кадр захвачен.
направлениеОтправлен или получен.
ПротоколКак в списке.
источникИнструмент, который его захватил (osc-send, osc-monitor, netsim, emulator, experiment-wait, …), и номер его задачи, если он относится к задаче.
локальныйАдрес с этой стороны, если он есть. Для кадра через реле — адрес, на котором слушает реле.
ПирДругая сторона. Для кадра через реле — куда он шёл: цель или клиент, которому ушёл ответ.
размерРазмер в байтах.
ВердиктКак в списке.

В разделе Декодировано кадр прочитан в своём протоколе: каждое сообщение OSC-бандла с аргументами, заголовки HTTP-ответа и начало его тела, запрос эмулятора и его ответ.

В разделе Байты — hex-дамп: смещение, 16 байт в hex и те же байты как текст. Список несёт первый КиБ каждого кадра; если кадр длиннее, кнопка под дампом загружает его целиком.

Что хранит кадр ​

ПределЗначениеПри достижении предела
Байты, которые хранит один кадр256 КиББолее длинный кадр хранит первые 256 КиБ и сообщает, какую часть от общего размера сохранил.
Кадры в захвате8192Самый старый кадр уступает место.
Байты, которые хранит весь захват64 МиБСамые старые кадры уступают место.

Некоторые кадры не хранят байтов: HTTP-обмены (их размер записывается, а заголовки ответа и начало тела вместо этого лежат в расшифрованном тексте) и открытые порты из Сканера.

Кадр MQTT хранит содержимое сообщения, а не пакет протокола вокруг него; топик, QoS и флаг retain — в его кратком описании.

Секреты ​

Пока запуск эксперимента или действие Отправить сейчас использует секреты, их значения маскируются в каждом кадре до захвата: •••• в кратком описании, расшифрованном тексте, адресах и вердикте и * для каждого байта содержимого, чтобы смещения в дампе оставались верными. Учётные данные экрана HTTP тоже никогда не появляются: HTTP-кадр хранит ответ, а не отправленный заголовок Authorization.

Сохранение кадра как сигнала ​

Чтобы сохранить пойманный пакет и отправить его снова позже — когда устройства, которое его отправило, уже нет рядом:

  1. Выберите кадр.
  2. Нажмите Сохранить как сигнал.

Сигнал попадает в папку Захвачено библиотеки сигналов со всеми байтами кадра, взятыми из того, что сохранил захват, а не из расшифрованного текста. Он назван по краткому описанию кадра, а его заметка говорит, из какого кадра он получен.

Что получится, зависит от кадра:

КадрСигнал
Датаграмма OSC или UDPСырой UDP-сигнал с байтами кадра в hex.
Публикация MQTT — отправленная, полученная или эмулятораMQTT-сигнал с брокером, топиком, QoS и флагом retain кадра и его содержимым как текстом — в точности как было. Пустое содержимое сохраняется, поэтому снятие retained-значения можно сохранить.
Любое другое: поток TCP (в том числе прошедший через реле или от TCP-узла), HTTP-обмен, сообщение WebSocket, пакет MQTT, не являющийся публикацией (подписка клиента на эмуляторе)Ничего: кнопка отключена, и её подсказка объясняет почему. Сигнал отправляет одну датаграмму или одну публикацию; эти кадры нельзя отправить снова такими, какими они были.

Куда уходит датаграмма:

  • для принятого кадра — на адрес, который его принял (сторона локальный), так что сигнал заменяет отправителя;
  • для отправленного кадра — на пир, которому он был отправлен;
  • для кадра через реле, в любую сторону, — на адрес, куда он шёл: на цель для кадра от клиента, на клиента для ответа.

Если этот адрес — все адреса этого компьютера (монитор, слушающий на 0.0.0.0:9000 или [::]:9000), сигнал нацеливается вместо этого на сам компьютер: 127.0.0.1:9000 или [::1]:9000. Откройте сигнал и измените его адресат, если имеете в виду другой адрес.

MQTT-сигнал уходит на брокер, указанный в кадре. Брокер, слушающий на всех адресах, достигается на 127.0.0.1 так же.

Кнопка отключена также для:

  • кадра, сохранённого не целиком: больше 256 КиБ или не сохранившего байтов;
  • сообщения MQTT, содержимое которого не текст, — содержимое сигнала является текстом, поэтому его байты нельзя было бы отправить снова такими, какими они были;
  • принятого кадра, у которого с этой стороны не назван сокет, — отправлять некуда.

Кадр, который захват уже отпустил, тоже нельзя сохранить; консоль сообщает об этом. Пока файл библиотеки нельзя прочитать, кнопка Сохранить как сигнал тоже отключена, а её подсказка показывает ошибку файла (см. Сигналы).

Экспорт ​

Кнопки Экспорт .jsonl и Экспорт .txt записывают весь захват — до 8192 кадров, каждый байт, который каждый из них сохранил, независимо от того, что показывают фильтры, — в файл capture-<time>.jsonl или capture-<time>.txt в папке данных (см. Файлы и папки). Консоль сообщает, куда. В браузере, подключённом к серверу, файл записывается на сервере, а браузер его скачивает.

Пустой захват не записывается; консоль сообщает, что сохранять нечего.

  • .jsonl — один объект JSON на строку, одна строка на кадр: seq, ts (миллисекунды с 1970 года), proto, dir, source, job_id, local, remote, bytes, kept, summary, detail, hex (дамп первого КиБ), verdict и data — сохранённые байты в base64.
  • .txt — для чтения: строка на кадр с номером, временем, направлением, протоколом, пиром, размером и вердиктом, затем его краткое описание, расшифрованный текст и hex-дамп каждого сохранённого байта.
json
{"seq":12,"ts":1767225600123,"proto":"osc","dir":"rx","source":"osc-monitor","job_id":3,"local":"0.0.0.0:9000","remote":"127.0.0.1:53211","bytes":20,"summary":"/fader/1 0.75","detail":"/fader/1 0.75","hex":"0000  2f 66 61 64 65 72 2f 31  00 00 00 00 2c 66 00 00  |/fader/1....,f..|\n0010  3f 40 00 00                                       |?@..|\n","verdict":null,"kept":20,"data":"L2ZhZGVyLzEAAAAALGYAAD9AAAA="}

Переходы из других мест ​

Другие экраны указывают на кадры: ожидание на ленте запуска эксперимента ссылается на кадр, который оно приняло, а в списке принятого у эмулятора на каждом обмене есть кнопка ⌕ (Открыть в Инспекторе). Переход по такой ссылке открывает Инспектор с выбранным кадром, сброшенными фильтрами и возобновлённым видом.