README: correct the architecture diagram's capture paths

The diagrams conflated the SIMtrace2 hardware with the sniffer that reads it
and omitted the original Osmocom simtrace2-sniff: they showed
simtrace2-pysniff feeding the GSMTAP listener with the hardware only as its
subtitle, and a second, unexplained "SIMtrace2 hardware / direct USB" box.

The diagrams now show the device -> sniffer -> GSMTAP relationship explicitly:
SIMtrace2 hardware is read either by simtrace2-pysniff or by the original
simtrace2-sniff, and FX2 hardware by the sigrok_iso7816_stream decoder; the
sniffers/decoder stream GSMTAP-SIM to the UDP :4729 listener.  The direct USB
path is drawn separately from the device to the server and is labelled
"pysniff code in-process": --capture direct uses the bundled
simtrace2_pysniff package (DirectSniffer -> SniffSession) inside the server
process, not the simtrace2-pysniff CLI, and bypasses GSMTAP.  PCAP/COMPRION
import, SQLite and the browser UI keep their places.

The READMEs' alt text, the first-run capture-mode notes and the Usage command
comments now name the original simtrace2-sniff as a GSMTAP source and say the
direct mode runs the bundled sniffer code inside the server.

Both languages; 558 Python + 80 Node tests; runtime zip still carries both
diagrams and the README image guard passes.
This commit is contained in:
catarrh committed 2026-10-28 01:46:13 +03:00
1 parent 2b83d21e64
commit f492f29ea6
4 files changed
+120 -76

No files matched your search

+10 -6
View File
@@ -13,7 +13,7 @@ GSMTAP into this analyser.
![SIMtrace Analyser UI](frontend.png)
![Capture and analysis: simtrace2-pysniff (SIMtrace2 hardware) and sigrok_iso7816_stream (FX2) stream GSMTAP-SIM to the UDP :4729 listener; alternatively the server reads SIMtrace2 hardware directly over USB, and PCAP/COMPRION traces are imported from files; simtrace-analyser-server decodes and stores the traffic in SQLite and serves the web UI](architecture_en.svg)
![Capture and analysis: SIMtrace2 hardware is read by simtrace2-pysniff or the original simtrace2-sniff, and FX2 hardware by the sigrok_iso7816_stream decoder; the sniffers and the decoder stream GSMTAP-SIM to the UDP :4729 listener. The server can also read SIMtrace2 hardware directly over USB with the bundled pysniff code in-process, and imports PCAP/COMPRION traces from files. simtrace-analyser-server decodes and stores the traffic in SQLite and serves the web UI](architecture_en.svg)
## Prerequisites
@@ -115,9 +115,11 @@ simtrace-analyser-server --capture gsmtap
Open **http://127.0.0.1:8081/** in a browser. `Ctrl+C` stops the server.
- `--capture gsmtap` (default) — listen for GSMTAP-SIM on UDP 4729, e.g. from
`simtrace2-pysniff` or `sigrok_iso7816_stream`;
- `--capture direct` — read SIMtrace2 hardware directly (needs PyUSB; Windows
also needs the driver swap, see [USB Device Access](#usb-device-access));
`simtrace2-pysniff`, the original `simtrace2-sniff` or
`sigrok_iso7816_stream`;
- `--capture direct` — read SIMtrace2 hardware directly (the bundled sniffer
code runs inside the server and talks to the device over USB; needs PyUSB;
Windows also needs the driver swap, see [USB Device Access](#usb-device-access));
- `--capture disabled` — only browse stored captures.
The full runtime guide (server options, the UI views, the capture utility) is
@@ -133,10 +135,12 @@ bundled into the package on install) on the same origin. Three capture
modes:
```sh
# Listen for GSMTAP from simtrace2-pysniff (or original simtrace2-sniff):
# Listen for GSMTAP from simtrace2-pysniff, the original simtrace2-sniff or
# sigrok_iso7816_stream:
simtrace-analyser-server --capture gsmtap
# Capture directly from SIMtrace2 hardware (no external tool needed):
# Capture directly from SIMtrace2 hardware (the bundled sniffer code reads the
# device; no external tool, no GSMTAP):
simtrace-analyser-server --capture direct
# Browse/analyse existing captures without a capture backend:
+10 -6
View File
@@ -13,7 +13,7 @@ SIM/UICC из UDP-потока GSMTAP (или импортирует файлы
![Интерфейс SIMtrace Analyser](frontend.png)
![Захват и анализ: simtrace2-pysniff (оборудование SIMtrace2) и sigrok_iso7816_stream (FX2) передают GSMTAP-SIM слушателю UDP :4729; альтернативно сервер читает оборудование SIMtrace2 напрямую по USB, а PCAP/трассы COMPRION импортируются из файлов; simtrace-analyser-server декодирует и сохраняет трафик в SQLite и раздаёт веб-интерфейс](architecture_ru.svg)
![Захват и анализ: оборудование SIMtrace2 читает simtrace2-pysniff или оригинальный simtrace2-sniff, а оборудование FX2 — декодер sigrok_iso7816_stream; оба источника передают GSMTAP-SIM слушателю UDP :4729. Сервер также может читать оборудование SIMtrace2 напрямую по USB встроенным кодом pysniff внутри сервера и импортирует трассы PCAP/COMPRION из файлов. simtrace-analyser-server декодирует и сохраняет трафик в SQLite и раздаёт веб-интерфейс](architecture_ru.svg)
## Требования
@@ -117,9 +117,11 @@ simtrace-analyser-server --capture gsmtap
сервер.
- `--capture gsmtap` (по умолчанию) — слушать GSMTAP-SIM на UDP 4729,
например от `simtrace2-pysniff` или `sigrok_iso7816_stream`;
- `--capture direct` — читать оборудование SIMtrace2 напрямую (нужен PyUSB; в
Windows также нужна замена драйвера, см.
например от `simtrace2-pysniff`, оригинального `simtrace2-sniff` или
`sigrok_iso7816_stream`;
- `--capture direct` — читать оборудование SIMtrace2 напрямую (встроенный код
сниффера работает внутри сервера и обращается к устройству по USB; нужен
PyUSB; в Windows также нужна замена драйвера, см.
[Доступ к USB-устройству](#доступ-к-usb-устройству));
- `--capture disabled` — только просмотр сохранённых захватов.
@@ -136,10 +138,12 @@ simtrace-analyser-server --capture gsmtap
Три режима захвата:
```sh
# Слушать GSMTAP от simtrace2-pysniff (или оригинального simtrace2-sniff):
# Слушать GSMTAP от simtrace2-pysniff, оригинального simtrace2-sniff
# или sigrok_iso7816_stream:
simtrace-analyser-server --capture gsmtap
# Захват напрямую с оборудования SIMtrace2 (внешний инструмент не нужен):
# Захват напрямую с оборудования SIMtrace2 (встроенный код сниффера читает
# устройство; внешний инструмент и GSMTAP не нужны):
simtrace-analyser-server --capture direct
# Просмотр/анализ существующих записей без бэкенда захвата:
+50 -32
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="640" viewBox="0 0 960 640" role="img" aria-labelledby="diagram-title diagram-desc" font-family="'Segoe UI', 'Helvetica Neue', Arial, 'DejaVu Sans', sans-serif">
<title id="diagram-title">SIMtrace Analyser: capture and analysis</title>
<desc id="diagram-desc">simtrace2-pysniff (SIMtrace2 hardware) and sigrok_iso7816_stream (FX2 logic analyzer) stream GSMTAP-SIM to the listener on UDP :4729; alternatively the server reads SIMtrace2 hardware directly over USB, and PCAP/COMPRION traces are imported from files. simtrace-analyser-server decodes and stores the traffic in SQLite and serves the web UI.</desc>
<desc id="diagram-desc">SIMtrace2 hardware is read by simtrace2-pysniff (bundled) or the original simtrace2-sniff, and FX2 hardware by the sigrok_iso7816_stream decoder; the sniffers and the decoder stream GSMTAP-SIM to the listener on UDP :4729. The server can also read SIMtrace2 hardware directly over USB with the bundled sniffer code, and imports PCAP/COMPRION traces from files. simtrace-analyser-server decodes and stores the traffic in SQLite and serves the web UI.</desc>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 Z" fill="#64748b"/>
@@ -10,45 +10,63 @@
<rect x="1" y="1" width="958" height="638" rx="18" fill="#ffffff" stroke="#e2e8f0" stroke-width="1.5"/>
<text x="480" y="30" text-anchor="middle" font-size="14" fill="#475569">capture → analyse</text>
<rect x="120" y="48" width="320" height="76" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
<text x="280" y="84" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace2-pysniff</text>
<text x="280" y="108" text-anchor="middle" font-size="14" fill="#475569">SIMtrace2 hardware</text>
<!-- capture devices -->
<rect x="100" y="48" width="250" height="64" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="225" y="74" text-anchor="middle" font-size="15" font-weight="600" fill="#0f172a">SIMtrace2 hardware</text>
<text x="225" y="94" text-anchor="middle" font-size="12" fill="#475569">Osmocom USB sniffer</text>
<rect x="520" y="48" width="320" height="76" rx="12" fill="#f5f3ff" stroke="#c4b5fd" stroke-width="1.5"/>
<text x="680" y="84" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">sigrok_iso7816_stream</text>
<text x="680" y="108" text-anchor="middle" font-size="14" fill="#475569">FX2 logic analyzer</text>
<rect x="610" y="48" width="250" height="64" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="735" y="74" text-anchor="middle" font-size="15" font-weight="600" fill="#0f172a">FX2 logic analyzer</text>
<text x="735" y="94" text-anchor="middle" font-size="12" fill="#475569">Saleae clone</text>
<line x1="280" y1="124" x2="480" y2="210" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="680" y1="124" x2="480" y2="210" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="225" y1="112" x2="225" y2="148" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="735" y1="112" x2="735" y2="148" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="40" y="210" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="175" y="242" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a">SIMtrace2 hardware</text>
<text x="175" y="264" text-anchor="middle" font-size="14" fill="#475569">direct USB</text>
<!-- sniffers -->
<rect x="100" y="150" width="250" height="96" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
<text x="225" y="176" text-anchor="middle" font-size="14" font-weight="600" fill="#0f172a">SIMtrace2 sniffers</text>
<text x="225" y="202" text-anchor="middle" font-size="13" fill="#334155" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace2-pysniff</text>
<text x="225" y="224" text-anchor="middle" font-size="13" fill="#334155" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace2-sniff (Osmocom)</text>
<rect x="345" y="210" width="270" height="72" rx="12" fill="#fffbeb" stroke="#fcd34d" stroke-width="1.5"/>
<text x="480" y="242" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">GSMTAP UDP :4729</text>
<text x="480" y="264" text-anchor="middle" font-size="14" fill="#475569">listener</text>
<rect x="610" y="150" width="250" height="96" rx="12" fill="#f5f3ff" stroke="#c4b5fd" stroke-width="1.5"/>
<text x="735" y="190" text-anchor="middle" font-size="14" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">sigrok_iso7816_stream</text>
<text x="735" y="212" text-anchor="middle" font-size="13" fill="#475569">decoder</text>
<rect x="650" y="210" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="785" y="242" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a">PCAP / COMPRION import</text>
<text x="785" y="264" text-anchor="middle" font-size="14" fill="#475569">files</text>
<line x1="225" y1="246" x2="425" y2="278" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="735" y1="246" x2="535" y2="278" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="175" y1="282" x2="400" y2="368" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="480" y1="282" x2="480" y2="368" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="785" y1="282" x2="560" y2="368" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<!-- GSMTAP listener -->
<rect x="350" y="280" width="260" height="72" rx="12" fill="#fffbeb" stroke="#fcd34d" stroke-width="1.5"/>
<text x="480" y="310" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">GSMTAP UDP :4729</text>
<text x="480" y="332" text-anchor="middle" font-size="13" fill="#475569">listener</text>
<rect x="270" y="368" width="420" height="84" rx="12" fill="#ecfdf5" stroke="#6ee7b7" stroke-width="1.5"/>
<text x="480" y="404" text-anchor="middle" font-size="19" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace-analyser-server</text>
<text x="480" y="430" text-anchor="middle" font-size="14" fill="#475569">decodes · stores</text>
<!-- file import -->
<rect x="650" y="280" width="240" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="770" y="310" text-anchor="middle" font-size="14" font-weight="600" fill="#0f172a">PCAP / COMPRION</text>
<text x="770" y="332" text-anchor="middle" font-size="13" fill="#475569">import from files</text>
<line x1="480" y1="452" x2="255" y2="516" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="480" y1="452" x2="705" y2="516" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="480" y1="352" x2="480" y2="390" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="770" y1="352" x2="635" y2="390" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="120" y="516" width="270" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="255" y="554" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">SQLite</text>
<text x="255" y="576" text-anchor="middle" font-size="14" fill="#475569">sessions.db</text>
<!-- the direct USB path bypasses the sniffers and GSMTAP -->
<path d="M100 84 H52 V448 H258" fill="none" stroke="#64748b" stroke-width="2" stroke-linejoin="round" marker-end="url(#arrow)"/>
<text x="64" y="418" font-size="12" font-weight="600" fill="#475569">direct USB</text>
<text x="64" y="436" font-size="12" fill="#475569">pysniff code in-process</text>
<rect x="570" y="516" width="270" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="705" y="554" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">Browser (web UI)</text>
<text x="705" y="576" text-anchor="middle" font-size="14" fill="#475569">installable PWA</text>
<!-- analysis server -->
<rect x="260" y="392" width="440" height="84" rx="12" fill="#ecfdf5" stroke="#6ee7b7" stroke-width="1.5"/>
<text x="480" y="427" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace-analyser-server</text>
<text x="480" y="451" text-anchor="middle" font-size="13" fill="#475569">decodes · stores</text>
<line x1="400" y1="476" x2="250" y2="514" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="560" y1="476" x2="710" y2="514" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<!-- storage and UI -->
<rect x="110" y="516" width="280" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="250" y="548" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">SQLite</text>
<text x="250" y="570" text-anchor="middle" font-size="13" fill="#475569">sessions.db</text>
<rect x="570" y="516" width="280" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="710" y="548" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">Browser (web UI)</text>
<text x="710" y="570" text-anchor="middle" font-size="13" fill="#475569">installable PWA</text>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

+50 -32
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="640" viewBox="0 0 960 640" role="img" aria-labelledby="diagram-title diagram-desc" font-family="'Segoe UI', 'Helvetica Neue', Arial, 'DejaVu Sans', sans-serif">
<title id="diagram-title">SIMtrace Analyser: захват и анализ</title>
<desc id="diagram-desc">simtrace2-pysniff (оборудование SIMtrace2) и sigrok_iso7816_stream (логический анализатор FX2) передают GSMTAP-SIM слушателю UDP :4729; альтернативно сервер читает оборудование SIMtrace2 напрямую по USB, а PCAP/трассы COMPRION импортируются из файлов. simtrace-analyser-server декодирует и сохраняет трафик в SQLite и раздаёт веб-интерфейс.</desc>
<desc id="diagram-desc">Оборудование SIMtrace2 читает simtrace2-pysniff (входит в комплект) или оригинальный simtrace2-sniff, а оборудование FX2 — декодер sigrok_iso7816_stream; оба источника передают GSMTAP-SIM слушателю UDP :4729. Сервер также может читать оборудование SIMtrace2 напрямую по USB встроенным кодом сниффера и импортирует трассы PCAP/COMPRION из файлов. simtrace-analyser-server декодирует и сохраняет трафик в SQLite и раздаёт веб-интерфейс.</desc>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 Z" fill="#64748b"/>
@@ -10,45 +10,63 @@
<rect x="1" y="1" width="958" height="638" rx="18" fill="#ffffff" stroke="#e2e8f0" stroke-width="1.5"/>
<text x="480" y="30" text-anchor="middle" font-size="14" fill="#475569">захват → анализ</text>
<rect x="120" y="48" width="320" height="76" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
<text x="280" y="84" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace2-pysniff</text>
<text x="280" y="108" text-anchor="middle" font-size="14" fill="#475569">оборудование SIMtrace2</text>
<!-- устройства захвата -->
<rect x="100" y="48" width="250" height="64" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="225" y="74" text-anchor="middle" font-size="15" font-weight="600" fill="#0f172a">Оборудование SIMtrace2</text>
<text x="225" y="94" text-anchor="middle" font-size="12" fill="#475569">USB-сниффер Osmocom</text>
<rect x="520" y="48" width="320" height="76" rx="12" fill="#f5f3ff" stroke="#c4b5fd" stroke-width="1.5"/>
<text x="680" y="84" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">sigrok_iso7816_stream</text>
<text x="680" y="108" text-anchor="middle" font-size="14" fill="#475569">логический анализатор FX2</text>
<rect x="610" y="48" width="250" height="64" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="735" y="74" text-anchor="middle" font-size="15" font-weight="600" fill="#0f172a">Логический анализатор FX2</text>
<text x="735" y="94" text-anchor="middle" font-size="12" fill="#475569">клон Saleae</text>
<line x1="280" y1="124" x2="480" y2="210" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="680" y1="124" x2="480" y2="210" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="225" y1="112" x2="225" y2="148" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="735" y1="112" x2="735" y2="148" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="40" y="210" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="175" y="242" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a">Оборудование SIMtrace2</text>
<text x="175" y="264" text-anchor="middle" font-size="14" fill="#475569">прямой USB</text>
<!-- снифферы -->
<rect x="100" y="150" width="250" height="96" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
<text x="225" y="176" text-anchor="middle" font-size="14" font-weight="600" fill="#0f172a">Снифферы SIMtrace2</text>
<text x="225" y="202" text-anchor="middle" font-size="13" fill="#334155" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace2-pysniff</text>
<text x="225" y="224" text-anchor="middle" font-size="13" fill="#334155" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace2-sniff (Osmocom)</text>
<rect x="345" y="210" width="270" height="72" rx="12" fill="#fffbeb" stroke="#fcd34d" stroke-width="1.5"/>
<text x="480" y="242" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">GSMTAP UDP :4729</text>
<text x="480" y="264" text-anchor="middle" font-size="14" fill="#475569">слушатель</text>
<rect x="610" y="150" width="250" height="96" rx="12" fill="#f5f3ff" stroke="#c4b5fd" stroke-width="1.5"/>
<text x="735" y="190" text-anchor="middle" font-size="14" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">sigrok_iso7816_stream</text>
<text x="735" y="212" text-anchor="middle" font-size="13" fill="#475569">декодер</text>
<rect x="650" y="210" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="785" y="242" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a">Импорт PCAP / COMPRION</text>
<text x="785" y="264" text-anchor="middle" font-size="14" fill="#475569">файлы</text>
<line x1="225" y1="246" x2="425" y2="278" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="735" y1="246" x2="535" y2="278" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="175" y1="282" x2="400" y2="368" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="480" y1="282" x2="480" y2="368" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="785" y1="282" x2="560" y2="368" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<!-- слушатель GSMTAP -->
<rect x="350" y="280" width="260" height="72" rx="12" fill="#fffbeb" stroke="#fcd34d" stroke-width="1.5"/>
<text x="480" y="310" text-anchor="middle" font-size="16" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">GSMTAP UDP :4729</text>
<text x="480" y="332" text-anchor="middle" font-size="13" fill="#475569">слушатель</text>
<rect x="270" y="368" width="420" height="84" rx="12" fill="#ecfdf5" stroke="#6ee7b7" stroke-width="1.5"/>
<text x="480" y="404" text-anchor="middle" font-size="19" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace-analyser-server</text>
<text x="480" y="430" text-anchor="middle" font-size="14" fill="#475569">декодирует · сохраняет</text>
<!-- импорт файлов -->
<rect x="650" y="280" width="240" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="770" y="310" text-anchor="middle" font-size="14" font-weight="600" fill="#0f172a">Импорт PCAP / COMPRION</text>
<text x="770" y="332" text-anchor="middle" font-size="13" fill="#475569">из файлов</text>
<line x1="480" y1="452" x2="255" y2="516" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="480" y1="452" x2="705" y2="516" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="480" y1="352" x2="480" y2="390" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="770" y1="352" x2="635" y2="390" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<rect x="120" y="516" width="270" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="255" y="554" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">SQLite</text>
<text x="255" y="576" text-anchor="middle" font-size="14" fill="#475569">sessions.db</text>
<!-- прямой USB-путь минует снифферы и GSMTAP -->
<path d="M100 84 H52 V448 H258" fill="none" stroke="#64748b" stroke-width="2" stroke-linejoin="round" marker-end="url(#arrow)"/>
<text x="64" y="418" font-size="12" font-weight="600" fill="#475569">прямой USB</text>
<text x="64" y="436" font-size="12" fill="#475569">код pysniff внутри сервера</text>
<rect x="570" y="516" width="270" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="705" y="554" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">Браузер (веб-интерфейс)</text>
<text x="705" y="576" text-anchor="middle" font-size="14" fill="#475569">устанавливаемое PWA</text>
<!-- анализирующий сервер -->
<rect x="260" y="392" width="440" height="84" rx="12" fill="#ecfdf5" stroke="#6ee7b7" stroke-width="1.5"/>
<text x="480" y="427" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">simtrace-analyser-server</text>
<text x="480" y="451" text-anchor="middle" font-size="13" fill="#475569">декодирует · сохраняет</text>
<line x1="400" y1="476" x2="250" y2="514" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<line x1="560" y1="476" x2="710" y2="514" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
<!-- хранилище и интерфейс -->
<rect x="110" y="516" width="280" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="250" y="548" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">SQLite</text>
<text x="250" y="570" text-anchor="middle" font-size="13" fill="#475569">sessions.db</text>
<rect x="570" y="516" width="280" height="76" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
<text x="710" y="548" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">Браузер (веб-интерфейс)</text>
<text x="710" y="570" text-anchor="middle" font-size="13" fill="#475569">устанавливаемое PWA</text>
</svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB