Oui. Pour GitHub, le plus simple est de le passer en Mermaid, parce que GitHub le rend nativement, contrairement à PlantUML.
Voici une version GitHub-friendly avec couleurs par phase :
%%{init: {
"theme": "base",
"themeVariables": {
"background": "#0d1117",
"primaryColor": "#1f2937",
"primaryTextColor": "#e5e7eb",
"primaryBorderColor": "#60a5fa",
"lineColor": "#93c5fd",
"secondaryColor": "#111827",
"tertiaryColor": "#0f172a",
"actorBkg": "#1e293b",
"actorBorder": "#38bdf8",
"actorTextColor": "#e5e7eb",
"signalColor": "#cbd5e1",
"signalTextColor": "#e5e7eb",
"labelBoxBkgColor": "#111827",
"labelBoxBorderColor": "#60a5fa",
"labelTextColor": "#e5e7eb",
"loopTextColor": "#fde68a",
"noteBkgColor": "#1f2937",
"noteBorderColor": "#f59e0b",
"noteTextColor": "#fef3c7",
"activationBorderColor": "#22c55e",
"activationBkgColor": "#14532d",
"sequenceNumberColor": "#94a3b8"
}
}}%%
sequenceDiagram
autonumber
title Diagramme de Séquence Complet - Boucle Fermée GSM (IMSI, Authentification, Chiffrement, ACK)
actor Utilisateur
participant Virtuel as Stack Virtuelle<br/>(osmo-qemu / fake BTS)
participant BTS as BTS<br/>(virtuelle)
participant Air as Air<br/>(interface radio)
participant MS as MS<br/>(Mobile Station)
participant RTL as RTL-SDR<br/>(réception)
participant Decodeur as Décodeur<br/>(gr-gsm / virtphy)
rect rgb(20, 40, 80)
Note over Utilisateur,Decodeur: PHASE 1 — Établissement du lien (Downlink)
Utilisateur->>Virtuel: Démarre la stack
Virtuel->>Virtuel: Active DLCI 5 (SDCCH)
Virtuel->>BTS: Configuration canal SDCCH
BTS->>BTS: Génère bursts DL (SYNC)
BTS->>Air: Burst DL : CHANNEL REQUEST<br/>(tn, fn, bits)
Air->>MS: Signal GMSK modulé
MS->>MS: Démodulation GMSK
MS->>MS: Détection burst
MS->>MS: Extrait message
end
rect rgb(20, 70, 60)
Note over Utilisateur,Decodeur: PHASE 2 — Réponse MS (Uplink)
MS->>Air: Burst UL : IMMEDIATE ASSIGN REQUEST<br/>(contient TMSI ou IMSI)
Air->>RTL: Signal capté
RTL->>RTL: Échantillonnage IQ
RTL->>Decodeur: Flux IQ
Decodeur->>Decodeur: Démodulation GMSK
Decodeur->>Decodeur: Extraction bits
Decodeur->>Virtuel: Injection UL (virtphy)
Virtuel->>Virtuel: Décode IMMEDIATE ASSIGN
alt TMSI inconnu
Virtuel->>BTS: Demande IMSI
BTS->>Air: Burst DL : IDENTITY REQUEST<br/>(type = IMSI)
Air->>MS: Signal
MS->>MS: Traite IDENTITY REQUEST
MS->>Air: Burst UL : IDENTITY RESPONSE<br/>(IMSI = 00101XXXXXXXXX)
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: IMSI reçu
end
end
rect rgb(80, 50, 20)
Note over Utilisateur,Decodeur: PHASE 3 — Authentification GSM
Virtuel->>Virtuel: Génère RAND (128 bits)
Virtuel->>Virtuel: Calcule SRES avec Ki
Virtuel->>BTS: AUTH REQUEST (RAND)
BTS->>Air: Burst DL : AUTH REQUEST<br/>(RAND)
Air->>MS: Signal
MS->>MS: Calcule SRES avec sa Ki
MS->>Air: Burst UL : AUTH RESPONSE<br/>(SRES)
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: SRES reçu
alt SRES = attendu
Virtuel->>Virtuel: Authentification OK
Virtuel->>BTS: AUTH PASS
else SRES != attendu
Virtuel->>Virtuel: Authentification FAIL
Virtuel->>BTS: REJECT
BTS->>Air: Burst DL : AUTH REJECT
Note right of BTS: Fin de procédure
end
end
rect rgb(70, 30, 80)
Note over Utilisateur,Decodeur: PHASE 4 — Chiffrement (A5/x)
Virtuel->>Virtuel: Active chiffrement A5/1
Virtuel->>BTS: CIPHER MODE COMMAND
BTS->>Air: Burst DL : CIPHER MODE COMMAND
Air->>MS: Signal
MS->>MS: Active chiffrement
MS->>Air: Burst UL : CIPHER MODE COMPLETE<br/>(message chiffré)
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Decodeur: Déchiffre A5/1
Decodeur->>Virtuel: CIPHER MODE COMPLETE
Virtuel->>Virtuel: Vérifie chiffrement OK
end
rect rgb(50, 60, 20)
Note over Utilisateur,Decodeur: PHASE 5 — Mise à jour de localisation (Location Update)
Virtuel->>BTS: LOCATION UPDATE REQUEST
BTS->>Air: Burst DL (chiffré) : LU REQUEST
Air->>MS: Signal
MS->>MS: Traite LU
MS->>Air: Burst UL (chiffré) : LU ACCEPT
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Decodeur: Déchiffre
Decodeur->>Virtuel: LU ACCEPT
Virtuel->>Virtuel: TMSI réalloué
Virtuel->>BTS: TMSI REALLOCATION
BTS->>Air: TMSI REALLOCATION COMPLETE
Air->>MS: Signal
MS->>Air: Burst UL : TMSI ACK
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: TMSI ACK
end
rect rgb(70, 20, 20)
Note over Utilisateur,Decodeur: PHASE 6 — Établissement d'appel (si requis)
Utilisateur->>Virtuel: Déclenche appel
Virtuel->>BTS: SETUP
BTS->>Air: Burst DL : SETUP<br/>(numéro appelé)
Air->>MS: Signal
MS->>MS: Affiche appel entrant
MS->>Air: Burst UL : CALL CONFIRMED
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: CALL CONFIRMED
Virtuel->>BTS: ALERTING
BTS->>Air: ALERTING
Air->>MS: Signal
MS->>MS: Sonnerie
MS->>Air: CONNECT
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: CONNECT
Virtuel->>BTS: CONNECT ACK
BTS->>Air: CONNECT ACK
Air->>MS: Signal
Note over Virtuel,Decodeur: APPEL ÉTABLI — COMMUNICATION ACTIVE
end
rect rgb(80, 80, 20)
Note over Utilisateur,Decodeur: PHASE 7 — Gestion des ACK et boucle de réémission
loop Chaque burst DL
Virtuel->>BTS: Envoi burst DL #n
BTS->>Air: Burst DL
Air->>MS: Signal
alt Burst reçu correctement
MS->>Air: Burst UL : ACK (RR)
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: ACK reçu
Virtuel->>Virtuel: Passe burst #n+1
else Burst non reçu
MS-->>Air: (silence)
Virtuel->>Virtuel: Timeout (200 ms)
Virtuel->>BTS: Réémission burst #n
BTS->>Air: Burst DL (réémission)
Note right of BTS: max 4 réémissions
end
end
end
rect rgb(30, 30, 30)
Note over Utilisateur,Decodeur: PHASE 8 — Finalisation
Utilisateur->>Virtuel: Fin communication
Virtuel->>BTS: DISCONNECT
BTS->>Air: Burst DL : DISCONNECT
Air->>MS: Signal
MS->>Air: RELEASE
Air->>RTL: Signal
RTL->>Decodeur: IQ
Decodeur->>Virtuel: RELEASE
Virtuel->>BTS: RELEASE COMPLETE
BTS->>Air: CHANNEL RELEASE
Air->>MS: Signal
MS->>MS: Libère canal
Virtuel->>Virtuel: Retour en IDLE
Virtuel-->>Utilisateur: Logs complets
end
Note over Virtuel,Decodeur: BOUCLE FERMÉE COMPLÈTE<br/>IMSI → Authentification → Chiffrement → Location Update<br/>→ Établissement appel → ACK → Réémission → Libération
Deux points utiles :
- GitHub ne rend pas PlantUML nativement, donc Mermaid est le bon format.
- Les couleurs par phase sont faites ici avec
rect rgb(...).
Je peux aussi te faire une version plus propre visuellement et plus compacte, parce que celle-ci est fidèle mais assez massive.