-
Fabrication d'une antenne quadrifilaire (QFH)
Lors de mon tout premier projet de réception d’images satellites, j’avais fait une antenne V-dipôle. Elle a l’avantage d’être très facile à réaliser et d’obtenir des résultats très convaincants.
Le souci, c’est les bandes grises d’interférences que j’ai sur toutes mes images comme par exemple celle-ci.
J’ai essayé énormément de choses afin de les enlever, mais je n’y suis jamais parevenu. J’ai donc décidé de changer d’antenne par une antenne quadrifilaire ou antenne QFH (QuadriFilar Helicoidal). On verra bien si ça résoudra le problème :)
Fonctionnement d’une antenne QFH
L’antenne QFH est composée de 2 boucles hélicoïdales, enroulées autour d’un axe central chacune déphasées de 90° l’une par rapport à l’autre. Plus d’info sur le déphasage ici.
Grâce à ce déphasage, les hélices produisent une polarisation circulaire. Il faut le voir comme la “direction” (du champ électrique) de notre onde.
L’antenne V-dipôle qu’on avait faite a elle une polarisation horizontale, ce qui cause des pertes puisque le signal en provenance des satellites a lui une polarisation circulaire 🌀.
Fabrication de l’antenne
Gardez en tête que votre antenne ressemblera à ça, parce que sur les schémas en 2D on dirait pas forcément :
Théorie
Pour la fabrication de l’antenne, on va se servir de ce calculateur.
Design Frequency : Je mets 137.5MHz puisque je veux recevoir des signaux satellites compris entre 137 et 138MHz.
Conductor Diameter : Je mets 9.5mm car je vais utiliser un tube de cuivre 3/8” soit 9.52mm. En soit, on peut utiliser n’importe quel diamètre, plus gros permet d’élargir la bande passante de l’antenne et éventuellement réduire certaines pertes. Mais ça reste des gains modérés alors prenez ce que vous avez.
Bref, pour tout le reste, on peut laisser par défaut, c’est très bien puis on clique sur Calculate.
De là, on peut en tirer un schéma en à peu près. À noter les -0.5cm sur les 4 brins du haut uniquement afin de laisser de la place entre eux pour les relier.
Bricolage
C’est parti, on va commencer par dresser la liste de ce dont on va avoir besoin (hors outils). En ce qui concerne le cuivre, j’avais déjà des couronnes qu’on utilise pour la climatisation. C’est du cuivre dit recuit, et qui donc est malléable.
Haut de l’antenne
Afin de faciliter le bricolage, j’ai utilisé un manchon PVC qu’on va venir placer au dessus de l’antenne.
Il va falloir faire 4 trous parfaitement perpendiculaires autour de notre manchon. Pour ça, toujours depuis ce site, si on descend plus bas, on a une section bien pratique Generate a drilling template. On la remplit, avec le diamètre extérieur du manchon (58mm) et celui des tubes de cuivre (9.5mm).
Une fois fait, ça nous sort un template à imprimer, on peut découper et garder uniquement la partie Top.
Ensuite, on l’enroule autour de notre tube de PVC. À ce moment, c’est important que le papier fasse pile le tour du tube, même 1mm de décalage pourrait avoir un impact sur l’alignement des 4 tiges de cuivre. Si jamais ça ne fait pas pile le tour, c’est probablement dû à une mauvaise mesure du diamètre.
Bas de l’antenne
Revenons sur la section Generate a drilling template du calculateur. Cette fois-ci, on va prendre le diamètre extérieur du tube PVC (52mm).
⚠️ Attention à ne pas prendre celui du manchon comme pour le haut de l’antenne.
Ensuite, on découpe la partie Bottom de notre template pour l’enrouler autour du tube. Pour savoir à quelle distance il faut le placer, notez sur le template la valeur 695.10mm qui représente la distance que vous devez mesurer en partant des tiges du haut jusqu’au point A. En fait, il s’agit de la distance H2 sur le schéma de l’antenne.
Courbure des tubes
On peut placer les coudes (sans les fixer) aux extrémités de nos 4 longues tiges et les positionner sur le haut ou le bas de l’antenne, n’importe. On peut à la limite légèrement serrer les coudes aux tubes si jamais ça glisse trop histoire de faire notre courbure tranquillement.
Pour la courbure, plusieurs techniques existent mais dans mon cas, j’ai fait la courbure à la main selon ce principe :
⚠️ MAIS ATTENTION, les signaux satellites qu’on veut recevoir ont une polarisation circulaire DROITE (RHCP). Ça veut dire qu’il faut courber nos tubes dans le sens antihoraire quand on regarde depuis le haut.
Quand on est satisfait de sa courbure, on peut fixer définitivement les coudes aux tubes. J’avais la chance d’avoir accès à de l’abrasure forte qui est plus simple et plus rapide que la soudure à l’étain.
L’eau sur le cuivre sert à le refroidir pour éviter que la chaleur se propage et fasse fondre le PVC 🥵.
À la place de cette technique, on peut aussi serrer fort les coudes avec le tuyau, le contact ne sera pas parfait mais ça peut dépanner.
Balun
À présent, nous allons réaliser 2 trous en haut du tuyau afin de faire un balun.
En effet, le signal est converti en courant dans un sens dans une des branches et dans l’autre sens dans l’autre branche. On dit alors que le courant est symétrique dans l’antenne.
Mais dans un câble coaxial, le courant n’est transmis QUE dans le centre du câble et donc dans un seul sens. Le courant est alors asymétrique. La tresse extérieure est reliée à la masse et agit comme isolant afin d’éviter que le câble se comporte comme une antenne (et aussi pour protéger le signal).
Bref, si on ne fait rien, une partie du signal reçue va aller à la masse ce qui provoque de grosse pertes. Ainsi, on vient placer un balun pour balenced->unbalanced ou dit autrement symétrique->asymétrique qui vient régler ce souci.
On parle de balun 1:1. Le premier 1 représente l’impédance du côté symétrique donc l’antenne (50Ω) et le deuxième celle du côté asymétrique donc le câble (50Ω). Dans un balun 1:1, ces 2 impédances sont égales.
Les 4 tours ne sont pas une règle absolue mais semblent être une bonne balance pour les ondes VHF
Câblage
Il existe plusieurs méthodes pour raccorder les tiges mais voici un schema des liaisons à respecter :
D’abord, on fait des petits trous au bout des tiges du cuivre et on les lime.
Ensuite, on peut faire le câblage comme sur le schéma. Je l’ai fais sans soudure en torsadant les câbles entre eux et en les serrant bien à l’aide de colliers de serrage.
L’idéal reste quand même la soudure mais pour des signaux comme ceux des NOAA et METEOR, ça fera l’affaire.
J’ai représenté le courant en provenance de l’âme du câble en rouge et celui en provenance de la tresse en bleu.
On peut ensuite fermé le dessus pour protéger le câblage de la pluie.
Installation
J’ai fais un petit trou en bas du tube pour y faire sortir le câble, ça évite de l’écraser lorsque l’on pose l’antenne à plat.
Pour la placer le plus haut possible, j’ai rajouté une longueur de tube PVC. Je n’avais pas de manchon pour les relier, donc j’ai mis un té.
Et voilà l’antenne fièrement installée en haut de mon toit.
Tests
Sortons notre testeur d’antenne pour voir ces performances. Bien que les valeurs soient surtout utiles dans le cas où l’on souhaite émettre, elles nous permettent quand même de voir si notre antenne est bien calibrée.
Le VSWR est à 1.487 est vraiment pas mal pour une antenne QFH faite à la main. Tant que c’est <1.5, on peut considérer que l’antenne est bien calibrée.
L’impédance à 46.21Ω est très bien aussi, puisque qu’elle match à peu près les 50Ω de notre câble.
Et enfin, voici ce qu’on peut tirer de cette antenne :
Concernant la problématique de départ, mes images ne contiennent (presque) plus aucune interférences ! Vous pouvez d’ailleurs voir la différence sur ma station à partir du 15/10, date à laquelle, j’ai changé d’antenne.
-
Recevoir des images en provenance de l'ISS
Connaissez-vous le programme ARISS (Amateur Radio on the International Space Station) ? Il permet aux radioamateurs du monde entier de communiquer avec les astronautes à bord de la ISS. Dans le cadre de ce programme, ARISS diffuse parfois des images en utilisant un protocole du nom de SSTV, permettant ainsi aux passionnés comme nous de recevoir des photos directement depuis l’espace.
SSTV
La SSTV (Slow Scan Television) est une méthode de transmission d’images avec des ondes radios. Ça existe depuis 1950 et ce n’est plus trop utilisé aujourd’hui parce qu’envoyer une image, c’est quand même plus facile avec Internet. Le signal est facilement reconnaissable grâce à une tonalité bien particulière dont voici un exemple. Ce son va ensuite être décodé grâce à des logiciels spécifiques pour être converti en une image de ce type :
Pour rentrer en détail dans son mode de fonctionnement, il y a ce pdf qui est pas mal.
Préparation
Programme ARISS
Vouloir recevoir des images de l’ISS c’est bien, encore faut-il qu’elle soit en train d’en émettre. Et pour le coup, c’est assez rare, 1 à 2 fois par an seulement. Sur le site d’ARISS France, vous pourrez consulter l’actualité afin de voir si une transmission SSTV est prévue. Lorsqu’il y en a, ça dure environ 1 semaine durant laquelle on a plusieurs occasions de recevoir des images.
Passage de l’ISS
Si une transmission SSTV est prévue, alors il va falloir prédire les horaires de passage de l’ISS. Pour cela, plusieurs méthodes, dans mon cas, j’utilise le site AMSAT.
Dans le rectangle rouge, on entre nos coordonnées géographiques puis on clique sur Predict. On peut voir la liste des prochains passages de l’ISS au dessus de nous. On va préférer se concentrer sur les passages avec une élévation élevée (rectangle vert) donc minimum 20 sauf si vous êtes dans une zone avec un horizon super dégagé.
Logiciel
On peut faire de la SSTV avec un simple talkie-walkie permettant d’écouter le signal et en même temps, depuis un logiciel le décoder. C’est la méthode la plus simple, mais le décodage du signal se fait avec un micro (téléphone ou ordinateur), ce qui n’est pas optimal.
Dans mon cas, je vais procéder avec la SDR en utilisant le logiciel SDR++ pour recevoir le signal et Black Cat SSTV pour le décoder car étant sur Mac c’est le seul fiable que j’ai trouvé. Si vous êtes sur Linux, prenez QSSTV et si vous êtes sur Windows, utilisez MMSTV.
Pour décoder une image, le logiciel SSTV attend en entrée le signal audio. Or, notre signal audio étant présent sur notre logiciel SDR, il va falloir trouver un moyen de relier les deux logiciels. Pour cela, la solution la plus simple à mettre en oeuvre est l’utilisation d’un câble audio virtuel. Voici un schéma de comment ça fonctionne :
Pour réaliser ce câble virtuel, le plus simple est d’installer VB-cable.
Matériel
L’idéal pour recevoir un bon signal serait de se faire une antenne spécialement calibrée pour la fréquence à laquelle l’ISS envoie son signal. Comme j’avais la flemme, j’ai utilisé ce que j’avais déjà à savoir une antenne QFH 137MHz et une antenne Yagi pour la télévision terrestre.
L’antenne Yagi étant directive, il va falloir suivre la position de l’ISS à la main, y a pleins d’applis pour la tracker. Pour l’antenne QFH, elle est omnidirectionnelle donc rien de spécial à faire.
Côté SDR, n’importe quel récepteur fera l’affaire, j’ai eu des résultats correctes avec la clé RTL-SDR V4 et le SDRPlay RSP1B.
Réception
Comme ces transmissions sont rares, je ne vais pas prendre le risque de décoder en live mais je vais d’abord enregistrer le signal et le décoder hors ligne, comme sur le schéma Traitement offline un peu plus haut. Voici mes setups :
Depuis SDR++, on règle la fréquence à laquelle le contact ARISS est prévue, dans mon cas 145.800MHz. On sélectionne NFM comme modulation.
Dans la section Record, on lance l’enregistrement en appuyant sur Record.
Si tout se passe bien, vous devriez voir clairement le signal apparaître. N’hésitez à régler le Max et le Min à droite pour bien refaire ressortir le signal sur la cascade.
La station n’émet pas en continue donc si vous recevez rien au début c’est normal, soyez patient. Une tonalité bien précise marquera le début de la transmission.
Une autre tonalité marquera la fin de la transmission, vous pouvez stopper l’enregistrement, noter où le fichier .wav est enregistré et passer au décodage de notre signal.
Décodage
On ouvre notre enregistrement avec Audacity et on change l’output en allant au milieu dans Audio Setup -> Playback Device et on sélectionnes VB-Cable.
Depuis le logiciel SSTV, on modifie l’input en sélectionnant aussi VB-Cable. On peut choisir le mode SSTV car il est donné par ARISS donc PD120. En auto, ça devrait trouver tout seul.
On a plus qu’à lancer l’audio depuis Audacity et automatiquement, le logiciel SSTV va commencer à former l’image.
Voici quelques exemples d’images que j’ai reçue, à gauche avec l’antenne QFH et à droite avec la Yagi :
Si vous voulez vous entraîner à décoder des signaux SSTV, vous avez des challenges comme celui-ci sur Root-me ou celui-là sur HackTheBox.
-
Writeup Hack-A-Sat : IQ
Description du challenge : Convert the provided series of transmit bits into in-phase quadrature samples.
Le challenge est disponible à cette adresse.
Connectons-nous à l’instance du challenge :
On nous demande de convertir une série de bits en un échantillon I/Q en modulation QPSK (Quadrature Phase Shift Keying).
Modulation QPSK
La modulation QPSK est une modulation de phase numérique où l’on va modifier la phase de la porteuse pour transmettre des données. Tu peux retrouver un cours sur ce qu’est la modulation juste là et sur la phase juste ici.
Concrètement, pour cette modulation, les bits sont regroupés par paires donc on a 4 combinaisons possibles : 00, 01,10,11 et ainsi 4 phases possibles. En général, chacune d’entre elles est espacée de 90°. Par exemple, on pourrait avoir 00 à 0°, 01 à 90°, 11 à 180° et 10 à 270°.
On peut aussi le voir sur ce schéma avec d’autres valeurs mais qui restent espacées de 90° :
Échantillon IQ
I (In-phase) et Q (Quadrature) sont les deux composantes orthogonales du signal modulé. Elles représentent respectivement les parties cosinus et sinus de l’onde porteuse modulée.
Si on décompose le signal avec ces deux valeurs, on peut représenter le signal modulé comme un point dans un plan à deux dimensions appelé diagramme de constellation.
Un échantillon I/Q permet ainsi de représenter les valeurs numériques des deux composantes du signal modulé. Cela nous permet de représenter la modulation en phase du signal comme pour le QPSK.
Résolution
Pour la résolution du challenge, on va faire un script en Python. Sachant qu’en QPSK, les bits sont codés par paire, on va commencer par cette étape :
bits = "01000011 01110010 01101111 01101101 01110101 01101100 01100101 01101110 01110100 00001010"
bits_pair = []
i = 0
while i < len(bits):
if bits[i] == " ": # Pour ignorer les espaces de notre variable bits (Oui, on aurait pu les enlever direct manuellement mais c'est pour que ça reste propre)
i += 1
pair = bits[i:i+2]
bits_pair.append(pair)
i += 2
print(bits_pair) # ['01', '00', '00', '11', '01', '11', '00', '10', '01', '10', '11', '11', '01', '10', '11', '01', '01', '11', '01', '01', '01', '10', '11', '00', '01', '10', '01', '01', '01', '10', '11', '10', '01', '11', '01', '00', '00', '00', '10', '10']
Chaque combinaison de bits est mappée à un point spécifique dans le plan I/Q où I (In-phase) est l’axe horizontal et Q (Quadrature) l’axe vertical.
Par rapport au diagramme qui nous est donné, on peut déduire la façon de coder nos bits :
Ainsi, on peut faire une table de mappage en utilisant un dictionnaire et sortir une liste iq_samples qui contient nos bits mappés :
bits_map = {
"00": "-1.0 -1.0",
"01": "-1.0 1.0",
"10": "1.0 -1.0",
"11": "1.0 1.0"
}
iq_samples = []
for pair in bits_pair:
iq_value = bits_map.get(pair)
iq_samples.append(iq_value)
print(iq_samples) # ['-1.0 1.0', '-1.0 -1.0', '-1.0 -1.0', '1.0 1.0', '-1.0 1.0', '1.0 1.0', '-1.0 -1.0', '1.0 -1.0', '-1.0 1.0', '1.0 -1.0', '1.0 1.0', '1.0 1.0', '-1.0 1.0', '1.0 -1.0', '1.0 1.0', '-1.0 1.0', '-1.0 1.0', '1.0 1.0', '-1.0 1.0', '-1.0 1.0', '-1.0 1.0', '1.0 -1.0', '1.0 1.0', '-1.0 -1.0', '-1.0 1.0', '1.0 -1.0', '-1.0 1.0', '-1.0 1.0', '-1.0 1.0', '1.0 -1.0', '1.0 1.0', '1.0 -1.0', '-1.0 1.0', '1.0 1.0', '-1.0 1.0', '-1.0 -1.0', '-1.0 -1.0', '-1.0 -1.0', '1.0 -1.0', '1.0 -1.0']
Et enfin, on peut construire notre échantillon QPSK :
qpsk = ' '.join(iq_samples)
print(qpsk)
Plus qu’à lancer notre script en entier et on obtient ça :
python .\iq.py
-1.0 1.0 -1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 -1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 1.0 -1.0 1.0 -1.0
On le copie colle et on obtient le flag :)
> docker run --rm -i -e FLAG=pouet iq:challenge
[...]
Input samples: -1.0 1.0 -1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 -1.0 -1.0 -1.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 1.0 -1.0 1.0 1.0 -1.0 1.0 1.0 1.0 -1.0 -1.0 1.0 1.0 1.0 -1.0 1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 1.0 -1.0 1.0 -1.0
You got it! Here's your flag:
pouet
-
Écoute des satellites russes METEOR-M
Les satellites américains NOAA que l’on a vu durant mon premier projet sont un peu le point de départ de tout amateur radio satellite. Mais, il existe d’autres satellites très similaires, qui produisent de meilleures images avec plus ou moins le même matériel que pour les NOAA, ce sont les satellites russes METEOR 🇷🇺.
Qui sont les METEOR ?
Les METEOR sont des satellites météorologiques soviétiques, puis russes. Depuis 1964, 70 modèles ont été lancés. Pour cet article, on va s’intéresser uniquement au dernier, ceux de la série METEOR-M dont voici l’historique :
Comme leurs homologues NOAA, la série de satellites METEOR-M se situe à une altitude d’environ 800km et possèdent une orbite polaire et plus précisément héliosynchrone. Ainsi, ils font constamment face au Soleil 🌞. Plus d’infos sur les types d’orbites juste ici.
L’orbite héliosynchrone va leur permettre de passer par les mêmes endroits à la même heure solaire 2 fois par jour.
La principale différence avec les NOAA est leur mode de transmission qui se nomme LRPT. Pour les NOAA, c’était le mode APT.
Pour cet article, 2 METEOR-M vont nous intéresser :
À noter que le METEOR M2-4 est toujours en phase de test. Du coup, sa fréquence varie des fois entre 137.1 et 137.9MHz et pareil pour le débit de symbole qui varie entre 72 et 80Kbit/s.
Pour vérifier, on peut utiliser ce site qui permet de savoir l’état actuel du satellite. Voici l’état actuel le 02/09/2024 :
Place à l’écoute
Côté antenne, j’utilise une QFH pour les 137MHz. Elle possède une polarisation circulaire gauche ce qui est parfait pour les METEOR puisqu’ils émettent avec une polarisation circulaire droite.
Pour la réception, on va utiliser SatDump. Je ne vais pas rentrer dans tous les détails de configuration, j’ai déjà fait un cours sur SatDump ici :)
D’abord, à l’aide de la section Tracking de SatDump ou en utilisant un site web, on va check quand est-ce que le satellite va passer. Cette section nous permet aussi de savoir “où en est” le satellite nottament en observant son élevation.
Dans la section Device, on sélectionne notre récepteur SDR, dans mon cas un SDRPlay RSP1B puis on lance l’enregistrement en cliquant sur Start.
Je vous conseil de régler le FFT Max et le FFT Min dans la section FFT pour bien faire ressortir le signal. De manière général, régler d’abord le FFT Min histoire que le bruit soit à peine visible puis pour le FFT Max, mettez la valeur du FFT Min + 30.
Dans la section Processing, on sélectionne METEOR M2-x LRPT 72k. On sélectionne Primary pour 137.900MHz et Backup pour 137.100MHz.
Le décodage se lance en cliquant à nouveau sur Start. Si tout est bien réglé, vous devriez voir le signal envoyé par METEOR M2-4 🛰️ !
Et pour s’assurer que le décodage se déroule bien, en bas, on peut regarder de un le SNR qui idéalement devrait être à 10 minimum mais tant qu’il est >2, vous devirez quand même avoir quelque chose. Et de deux, la partie en bas à droite Viterbi où si tout est vert, c’est que c’est bon. 😄
⚠️ Une fois le satellite passé, on clique depuis la section Processing sur le bouton Stop et uniquement après, on peut arrêter l’écoute avec le bouton Stop de la section Device. Attention de ne pas inverser cet ordre car ça risque de perdre l’enregistrement que vous venez de faire.
L’écoute étant terminée, on attend quelques instants que SatDump est bien finit de tout décoder et on peut décaler sur l’onglet Viewer pour voir nos images et appliquer du post-traitement.
On peut ainsi jouer avec les différents réglages pour obtenir des images en fausse couleur ou en infrarouge :
La qualité de l’image est vraiment pas mal par rapport au NOAA.
À vous de jouer à présent !
-
Les différents types d'orbites
Lorsque l’on envoie un satellite dans l’espace, on a le choix avec une infinité d’orbites disponibles.
Pour la grande majorité des satellites, ce qui compte, c’est la Terre, puisque c’est avec elle qu’ils vont interagir. Ainsi, pour être efficace, ils doivent être placés sur des orbites qui tiennent compte à la fois de leur propre mouvement autour de la Terre mais aussi de la rotation de cette dernière sur son axe.
Il n’y a donc que quelques orbites spécifiques qui optimisent tout ça, et on va comprendre pourquoi dans ce cours.
Orbite géostationnaire (GEO)
Il s’agit d’une orbite qui match parfaitement avec la rotation de la Terre. Du coup, les satellites placés sur cette orbite apparaissent comme “stationnaires” ou immobiles au-dessus d’une position donnée. Comme ils tournent en même temps que la Terre, ils mettent 24h à faire le tour de cette dernière (23h 56min 4s exactement).
On va utiliser satvis pour mieux comprendre et prendre comme exemple, le satellite météorologique GOES-17
Sur cette image, on peut voir que ce satellite a un champ de vision énorme sur les 2 continents américains, donc presque tout un hémisphère 🌎.
Si on met la vue en 2D, la couverture du satellite donnerait ça :
Et ainsi, on peut récupérer ce type d’image bien pratique pour la météo par exemple :
Cette orbite n’est pas pratique uniquement pour faire des photos mais aussi pour des services comme la télévision par satellite.
Bon, l’orbite paraît idéal pour tout type d’activité mais en réalité, elle a un désavantage, sa distance de la Terre qui est de 35786km (au niveau de l’équateur) ! Donc non seulement, c’est très couteux et gourmand d’envoyer un satellite aussi loin mais surtout, il faut prendre en compte un délai de 22 secondes pour qu’une information aille du satellite jusqu’à la Terre ou l’inverse ce qui peut rendre plus difficile certaines opérations ⏳.
Orbite terrestre moyenne (MEO)
Rapprochons nous avec l’orbite terrestre moyenne situé entre l’orbite basse et l’orbite géostationnaire.
C’est une orbite idéale pour les satellites de navigations qui fonctionnent par constellation. Ainsi, sur cette orbite, chacun d’entre eux peux quand même voir 38% de la surface de la Terre tout en allant assez vite pour couvrir l’entiereté du globe. Leur période orbitale varient entre 2 et 12h.
On peut voir sur satvis par exemple la constellation Galileo constituée de 30 satellites avec la couverture d’un seul satellite permettant ainsi de savoir où l’on est à tout instant.
N’hésites pas à consulter juste ici mon cours sur le GPS/GNSS pour comprendre comment ça fonctionne :)
Orbite terrestre basse (LEO)
Allons au plus proche de notre surface terrestre avec l’orbite la plus peuplée, l’orbite basse (85% des satellites actuellement en orbite). Ce sont tous les satellites qui sont à moins de 2000km de nous à peu près.
Si c’est la plus remplie, c’est principalement car il faut “peu” de ressources pour les mettre en orbite, rendant l’espace accessible à de plus “petits” acteurs du spatial. En plus, il n’y a quasiment aucun délai pour la communications contrairement au 22 secondes des géostationnaires.
Comme ils sont proche, ils font aussi le tour de la Terre très rapidement, 90 minutes seulement. C’est ce qui explique que les astronautes à bord de l’ISS (qui va à 28000km/h) voient 16 couchers de soleil par jour 🌅.
Bien que cette orbite puisse balayer plusieurs endroits de la Terre rapidemet, sa couverture reste très petite ce qui nécessite de multiplier les stations de sol afin d’avoir un contact avec le satellite.
C’est d’ailleurs sur cette orbite qu’est placée la mega constellation de satellites Starlink de SpaceX. Il y en a plus de 6000 aujourd’hui (donc plus de la moitié du nombre total de satellites) et ça ne fait qu’augmenter.
Orbite polaire
L’orbite polaire qui est en soit une orbite basse tourne autour des pôles terrestres. En fait, son orbite est incliné de 90°. Comme la Terre tourne sur elle même, les satellites sur cette orbite ont une couverture sur toute le globe rapidement.
Bon sur mon schema, niveau échelle par rapport au Soleil, on fait comme ci ne rien n’était. Mais on comprend que l’avantage de cette orbite est que les satellites font toujours face au Soleil et donc peuvent recevoir en permanence de l’énergie ☀️.
Orbite héliosynchrone (SSO)
L’orbite héliosynchrone est une orbite quasi polaire qui fait aussi partie de l’orbite basse où l’on chosit un angle et une inclinaison de sorte que le satellite observe chaque bout de la Terre toujours aux mêmes heures. Pratique pour les études sur le climat.
C’est cette orbite qu’utilisent les NOAA dont on récupéraient les images sur ce projet.
Orbite elliptique élevée (HEO)
Une orbite particulière qui a une trajectoire elliptique de sorte que le satellite passe de très proche de la Terre à très très loin.
C’est par exemple utilisée par les satellites russes. Sur cette orbite, ils se déplacent lentement durant leur apogée pour avoir une couverture prolongée au niveau des latitudes nords. Et, ils se déplacent rapidement lors de leur périgée au niveau des latitudes sud. Dans cet exemple, on parle plus précisément d’orbite de Molniya.
Il existe aussi l’orbite Toundra mais bref, c’est des cas particuliers d’orbites en général les HEO qui sont surtout pratiques pour les télécommunications dans les régions polaires.
Et voilà pour les principaux types d’orbites, aujourd’hui, c’est plus de 10000 satellites qui sont actuellement en orbite autour de la Terre. Il n’est pas évident de connaître le nombre exacte de satellites mais on peut avoir un bon aperçu avec le site Orbiting now 🔍.
-
La distribution Linux SDR : DragonOS
La distribution DragonOS est un fork de Lubuntu mais spécialisé pour la SDR. Elle possède déjà un grand nombre d’outils installés bien pratiques comme par exemple GNURadio. C’est super cool pour gagner du temps car nombre de ces tools en radio sont vieux et peuvent être compliqués à mettre en place.
Malgré ces gros avantages, en fin d’article, j’expliquerai pourquoi je ne pense pas que ce soit la meilleure option, même pour les débutants.
Installation
Pour récupérer l’iso, on se rend juste ici. Ensuite, il nous faut un hyperviseur comme VirtualBox ou VMWare, peu importe. Dans mon cas, comme je suis sur Windows, je vais rester au plus simple avec VirtualBox que l’on peut télécharger directement ici. Pour les Mac ARM, il faudra utiliser VMWare :)
On peut lancer VirtualBox et cliquer sur le bouton New afin d’y importer notre iso.
On peut cliquer sur Next pour allouer nos ressources matérielles. Je ne sais pas trop ce qui est le mieux, mais pour la mémoire vive, 4Go devrait faire l’affaire. Dans le doute, comme il y a des logiciels qui peuvent être très gourmands, je mets 8Go (8192Mb). Pour le CPU, pareil, ça dépend de votre configuration, je le monte à 6 mais 2 ou 4 devraient suffire.
Puis, on reclique sur Next pour allouer l’espace disque. Il faut le mettre à 30Go minimum puisque vous rencontrerez plus tard une étape pour laquelle les 30Go minimum seront nécessaires.
Et re Next puis Finish.
Premier lancement
A présent, on double clique pour lancer DragonOS. Il est possible que vous ayez une page comme ça :
Vous pouvez faire entrer et après quelques instants, on arrive sur le bureau qui se présente ainsi :
L’installation n’est pas encore finie, on remarque sur le bureau le Install DragonOS FocalX. Il faut l’installer car sinon, à chaque fois que l’on va éteindre la VM, tout ce qu’on aura fait dessus sera perdu.
Du coup, on double clique, et on suit l’installation. Pour ce qu’il faut cocher, on peut laisser par défaut, c’est très bien.
Après un long moment, ça nous propose de redémarrer la VM et on sera fin prêts à s’en servir !
Découverte
Sur DragonOS, on va retrouver une multitude de logiciels préinstallés donc on va pas tous les voir. Je vous laisserai les découvrir par vous même en fonction de vos usages, mais sachez qu’il y en a pour tous les goûts niveau radios.
Bref, testons tout ça et sortons notre récepteur SDR. Dans mon cas, j’utilise la clé RTL-SDR V4 et un logiciel comme par exemple le super SDR++.
Avant de continuer, il va falloir dire à Virtual Box de prendre en compte notre clé SDR branchée sur le port USB de notre hôte. Pour ça, en haut, on fait Devices -> USB et on clique sur notre récepteur SDR.
À présent, on est prêts à écouter. Sur SDR++, dans Source, on sélectionne RTL-SDR et juste en dessous on choisit notre récepteur, on clique sur le bouton Play en haut et tout fonctionne nickel !
Dossier partagé
Lorsque vous voudrez travailler avec des fichiers de la machine hôte sur votre VM, vous aurez besoin d’un moyen de les faire passer. Une manière simple de le faire est de mettre en place un dossier partagé.
Pour cela, dans un premier temps, il faut que les Additions Invité soient installées. C’est des pilotes qui permettent une meilleure interaction entre la VM et l’hôte.
Donc, depuis la VM, en haut, on va dans Devices -> Insert Guest Additions CD Image…. Puis, on Execute le fichier autorun.sh.
Ensuite, on peut éteindre la VM, on clique sur Settings (l’engrenage jaune) puis Shared Folders. Clic droit et Add Shared Folder.
Enfin, on choisit quel dossier de notre machine hôte on veut partager et on coche Auto-Mount.
À présent, depuis la VM, dans l’explorateur de fichiers, on peut y voir notre dossier partagé sous le nom sf_Downloads.
Si jamais vous avez une erreur comme quoi vous n’avez pas les permissions, ouvrez un terminal et tapez sudo adduser [your-user] vboxsf puis redémarrez la VM et ça devrait être bon.
Et voilà, DragonOS est prêt à être utilisé !
Mon avis
Alors, cette distribution est une solution très pratique pour gagner du temps, bien qu’on puisse s’en passer et installer nos tools directement en local sur notre machine hôte. Je préfère d’ailleurs cette option pour des questions de rapidité, car faire de la SDR sur une VM peut être très gourmand ce qui peut rendre de nombreuses tâches plus longues. On peut évidemment allouer de plus grosses ressources, mais avec un ordinateur portable classique, on en a pas toujours l’occasion. Après, en tant que hôte principal comme sur un Raspberry, je n’ai pas essayé mais ça doit être plus rapide déjà.
De plus, apprendre à configurer soi-même les logiciels, installer les bonnes librairies permet de mieux comprendre ce que l’on fait et surtout d’être plus efficace pour debugger.
C’est pour cela que même pour un débutant, je ne recommande pas d’installer directement DragonOS afin d’y aller étape par étape.
D’autre part, au fil de mon apprentissage, je reviendrai sur cet avis si je me rends compte que certains tools bien spécifiques sont vraiment une horreur à configurer :)
-
Les notions de phase et de déphasage d'un signal
Les signaux ne se comportent pas tous de la même manière dans le temps entre eux. On va voir dans ce cours, la notion de phase et comment le déphasage peut modifier l’alignement des ondes.
La phase
La phase d’un signal est une mesure qui permet de représenter la forme d’une onde sinusoïdale à un instant donné. On la note en degrés (de 0° à 360°) ou bien en radians (de 0 à 2π).
Mais alors, qu’est-ce que le nombre π à avoir avec nos ondes radio ? Replongeons dans la trigonométrie pour comprendre avec ce schéma :
Peu importe la fréquence d’un signal, la période de ce dernier (donc son cycle) correspondra à une rotation complète sur un cercle soit 360° ou 2π.
Deux signaux sont en phase lorsque leurs amplitudes coincident, les signaux oscillent ensemble. On parle de déphasage nul.
Le déphasage
Un déphasage, c’est une différence dans le temps ou dans la position d’une onde. En gros, si on a deux ondes qui commencent à des moments différents ou atteignent leur maximum à des moments différents, on dira qu’elles sont déphasées.
Par exemple, si le déphasage est à 180° donc qu’un signal est en avance de π radians par rapport à l’autre, on dit que les signaux sont en opposition de phase. Ça donne que les amplitudes max d’un signal correspondent aux amplitudes min de l’autre signal, les signaux oscillent en opposition.
Ou si le déphasage est à 90° donc qu’un signal est en avance de π/2 radians par rapport à l’autre, on dit que les signaux sont en quadrature de phase. C’est à dire que les amplitudes d’un signal coïncident avec les passages par zéro de l’autre signal.
Et voilà pour ce mini cours sur les notions de phase sans trop rentrer dans les détails. Ça permettra de mieux comprendre les notions de polarité d’une onde que l’on verra plus tard.
-
Writeup Hack-A-Sat : Fiddlin' John Carson
Description du challenge : Your spacecraft has provided its Cartesian ICRF position (km) and velocity (km/s). What is its orbit (expressed as Keplerian elements)?
Le challenge est disponible à cette adresse
Connectons-nous à l’instance du challenge :
> docker run --rm -i -e FLAG=pouet kepler:challenge
KEPLER
CHALLANGE
a e i Ω ω υ
. .
,' ,=, .
, / \ .
. | | .
. \ / .
+ '=' .
. .'
. . '
'
Your spacecraft reports that its Cartesian ICRF position (km) and velocity (km/s) are:
Pos (km): [8449.401305, 9125.794363, -17.461357]
Vel (km/s): [-1.419072, 6.780149, 0.002865]
Time: 2021-06-26-19:20:00.000-UTC
What is its orbit (expressed as Keplerian elements a, e, i, Ω, ω, and υ)?
Semimajor axis, a (km):
On va devoir à partir d’une position cartésienne et d’une vitesse retrouver les paramètres d’orbite de notre vaisseau spatial.
Il est important de comprendre de quoi on parle quand on évoque les paramètres d’orbite. Heureusement pour toi, j’ai fait un petit cours que tu peux consuler juste ici :)
Voici un petit schema de ce que représente les différentes données qu’on a (le placement du vaisseau est arbitraire, il ne correspond pas à ses coordonnées réelles, flemme de faire un truc en 3D) :
Bon, en vrai, les calculs pour trouver les paramètres d’orbite sont plutôt compliqués, donc on va juste apprendre à utiliser la bibliothèque Python poliastro pour arriver à nos fins.
Dans un premier temps, on va convertir nos listes qui contiennent les coordonnées de position et de vitesse en objets avec des unités physiques appropriées pour faire des calculs avec.
from poliastro.twobody.orbit import u
pos = [8449.401305, 9125.794363, -17.461357]
vel = [-1.419072, 6.780149, 0.002865]
pos_km = [*pos] * u.km
vel_kms = [*vel] * u.km / u.s
Le u.km, c’est une unité de mesure qui provient de la bibliothèque astropy. En multipliant notre liste avec, on convertit chaque coordonnée en objet Quantity. Ainsi, les coordonnées x, y et z sont désormais traitées comme ayant pour unité le km ce qui va nous permettre de faire des calculs physiques avec.
Pareil pour le u.s qui représente des secondes et donc u.km / u.s “transforme” notre liste de vitesse avec comme unité le km/s.
Ensuite, et c’est là que la magie se fait, on a juste à appeler la méthode Orbit.from_vectors qui va s’occuper de faire tous les calculs pour nous afin qu’on puisse récupérer tout ce dont on a besoin.
from poliastro.bodies import Earth
from poliastro.twobody import Orbit
time = "2021-06-26 19:20:00.000"
orb = Orbit.from_vectors(Earth, pos_km, vel_kms, time)
Earth, c’est juste un objet qui contient les paramètres gravitationnels et géométriques de la Terre. Ces derniers sont indispensables pour le calcul mais pas la peine de rentrer dans les détails.
On oublie pas aussi de lui spécifier notre temps (time) exacte qui représente le moment dans le temps où la position et la vitesse ont été mesurés. Et oui, les paramètres orbitaux peuvent être amenés à changer avec le temps en raison de divers perturbations gravitationnelles donc faut le spécifier ce temps.
Une fois, l’appel à Orbit.from_vectors fait, on a plus qu’à récupérer nos 6 paramètres d’orbite :
a = orb.a # Demi-grand axe en km
e = orb.ecc # Excentricité
i = orb.inc.to_value(u.deg) # Inclinaison
Omega = orb.raan.to_value(u.deg) # Longitude du nœud ascendant
omega = orb.argp.to_value(u.deg) # Argument du Périastre
nu = orb.nu.to_value(u.deg) # Anomalie vraie
Avec la méthode to_value d’astropy, on peut convertir directement une valeur avec l’unité de son choix. En l’occurrence, comme les angles sortent en radians, on s’en sert pour les convertir en degrés.
On print tout ça, et y a plus qu’à remplir avec les bonnes valeurs :
> docker run --rm -i -e FLAG=pouet kepler:challenge
KEPLER
CHALLANGE
a e i Ω ω υ
. .
,' ,=, .
, / \ .
. | | .
. \ / .
+ '=' .
. .'
. . '
'
Your spacecraft reports that its Cartesian ICRF position (km) and velocity (km/s) are:
Pos (km): [8449.401305, 9125.794363, -17.461357]
Vel (km/s): [-1.419072, 6.780149, 0.002865]
Time: 2021-06-26-19:20:00.000-UTC
What is its orbit (expressed as Keplerian elements a, e, i, Ω, ω, and υ)?
Semimajor axis, a (km): 24732.885760723184
Eccentricity, e: 0.7068070220620631
Inclination, i (deg): 0.11790360842507447
Right ascension of the ascending node, Ω (deg): 90.22650379956278
Argument of perigee, ω (deg): 226.58745900876278
True anomaly, υ (deg): 90.389955034578
You got it! Here's your flag:
pouet
Et on a notre flag :)
-
Satdump GUI pour récupérer des images satellites
Durant mon premier projet pour récupérer les images des satellites NOAA, j’avais évoqué le logiciel Satdump permettant de considérablement nous simplifier la vie.
Aujourd’hui, je vais vous présenter sa version graphique avec une démo :)
Offline processing
Voilà comment se présente SatDump au lancement.
On tombe sur l’onglet Offline Processing qui est utile dans le cas où l’on a déjà un enregistrement qui provient d’un satellite. On a juste à choisir le satellite de provenance, notre fichier et cliquer sur Start, facile.
Mais on va pas trop s’y attarder, ça reste intuitif, passons plutôt à l’onglet Settings pour régler quelques trucs.
Settings
Ici, on va venir régler la position de notre récepteur (ça servira pour les prédictions de passage des satellites).
Donc, on y met notre latitude, longitude, altitude, éventuellement les couleurs (si on les veut) qui seront affichées sur les images qu’on récupère.
On voit aussi en bas la dernière fois que les TLE ont été mis à jour.
Ceci étant fait, allons dans l’onglet principal Recorder.
Recorder
Device
Ici, on choisit notre récepteur SDR, dans mon cas, un HackRF. On peut choisir notre fréquence d’écoute et notre samplerate.
Aussi, on peut modifier différents paramètres en fonction du récepteur SDR. On retrouve les différentes options possibles ici.
J’ai activé le Bias-Tee, ça permet d’alimenter un filtre LNA directement avec son récepteur SDR. Mais si vous n’utilisez pas de filtre, n’activez pas cette option !
Sautons quelques sections pour voir celle permettant de voir et prédire le passage des satellites, l’onglet Tracking.
Tracking
On peut y voir l’azimuth et l’élevation de n’importe quel satellite (donc là NOAA 15) par rapport aux positions géographiques qu’on a entré dans les Settings.
Pour rappel, l’azimuth, c’est en quelque sorte la direction qu’indiquerait une boussole vers le satellite.
L’élevation, ça serait l’angle avec lequel il faut “lever les yeux” pour voir le satellite.
En dessous, le polar plot, très pratique, qui permet d’avoir une représentation graphique de nos deux valeurs.
Le haut du graphique, ça représente l’azimuth à 0°, le bas 180°.
Le centre du graphique, c’est pour une élevation à 90°, le premier anneau à partir du centre, 60°, le second 30° et le dernier, 0° donc l’horizon.
De plus, le polar plot permet de représenter le prochain passage d’un satellite avec la ligne orange qui représente la trajectoire du satellite et un point rouge pour sa position actuelle.
On a aussi le AOS (Acquisition Of Signal) qui indique dans combien de temps on pourrait enregistrer le signal pour commencer l’écoute.
À présent, cliquons en bas sur le bouton Schedule and Config
C’est ici qu’on va pouvoir prédire les prochains passages des satellites et éventuellement, lancer automatiquement l’acquisition du signal.
Alors, en haut, on choisit les satellites qui nous intéressent.
On peut choisir l’élevation minimale pour laquelle on accepte que le prochain passage doit être prédit. Donc, dans mon cas, tout ce qui est en dessous de 40° ne sera pas prédit.
Une fois qu’on sélectionne les satellites qu’on veut écouter, on voit qu’on peut les “configurer”.
Les informations comme la fréquence ou le mode de transmission doivent être remplies manuellement.
On peut alors cliquer sur le bouton Update Passes pour voir apparaître les prochains passages de nos satellites. Attention, l’heure indiquée est en UTC, je ne sais pas comment la modifier en heure française.
Dans mon cas, le prochain passage est donc prévu à 20h21 jusqu’à 20h37 avec une élevation maximale de 61° :
Toute cette partie sert dans le cas où vous souhaitez laisser votre ordinateur relié à l’antenne et que les enregistrements se fassent tout seul. Mais on peut aussi s’en servir pour rapidement jeter un coup d’oeil pour le prochain passage et faire les choses après plus ou moins manuellement.
Recording
Vite fait, l’onglet Recording.
Comme son nom l’indique, il permet de sauvegarder un signal dans un fichier. On pourra ainsi le conserver pour le traiter par la suite, soit sur l’onglet Offline Processing, soit avec un autre logiciel de traitement de signal. Plusieurs formats de fichiers sont pris en charge.
Processing
Avec l’onglet Processing, on va pouvoir préciser de quelle manière on veut traiter le signal reçue et le décoder en temps réel !
En glissant son curseur sur les différents paramètres, on a plus d’informations sur ce qui font donc je vais pas m’y attarder. Ce qui est intéressant, c’est que lorsqu’on sélectionne le mode, donc sur mon exemple NOAA APT, on nous propose lequel des 3 NOAA on souhaite écouter, et lorsque l’on en choisit un, automatiquement, la fréquence d’écoute se met à jour sur la bonne.
Le bouton Start restera grisé tant qu’on aura pas lancé l’écoute depuis l’onglet Device.
Globalement, on a vu les onglets principaux pour commencer à utiliser SatDump, il en reste un, le super onglet Viewer que l’on verra après la démo car il nous faut un enregistrement pour avoir des choses à montrer.
Exemples d’utilisation
Allez, c’est parti, on va écouter NOAA 15. J’appuie sur Start depuis l’onglet Device puis sur Start dans l’onget Processing en ayant configuré le traitement pour le mode APT.
Voici une capture d’écran lorsque le satellite passe :
On peut voir en bas en temps réel le scan progressif du satellite apparaître. Aussi, on constate la position du satellite avec le point rouge sur le polar plot.
Une fois l’acquisition terminée, on appuie sur le Stop de l’onglet Processing (Pas celui de l’onglet Device si non, SatDump ne va pas comprendre que le traitement est terminé).
Et l’on peut à présent décaler sur l’onglet Viewer pour voir nos résultats.
Viewer
Et voilà mon image :
Cet onglet est vraiment génial, on va pouvoir traiter en temps réel notre image, là par exemple, j’ai appliqué le mode d’image MCIR qui permet d’avoir de fausses couleurs sur notre image.
On peut jouer avec les différents paramètres en fonction de ce que l’on souhaite mettre en valeur.
Par exemple, afficher des couleurs pour les probabilités de pluie, les frontières des pays et bien d’autres trucs sympas.
Et voilà pour ce super SatDump qui permet en un seul logiciel de faire plusieurs choses à la fin, de la prédiction, de l’acquisition de signal et même le traitement de ce dernier. Peut-être un jour, j’aurais la possibilité de tester un rotor d’antenne car SatDump les prend en charge, ça peut être cool.
Évidemment, je n’ai pas tout présenté, je vous laisser explorer le reste par vous même :)
-
Writeup RingZer0 CTF : Don't flip out, Thomas!
Description du challenge : The aliens’ capabilities have advanced and they’ve decided to improve the reliability of their transmissions. Can you crack their message?
Le challenge est disponible à cette adresse.
Pour comprendre le writeup, il est important de comprendre la notion de modulation, alors n’hésite pas à jeter un oeil sur ce cours :)
Le challenge commence avec un fichier sdr-challenge3.cfile.
Ouvrons-le avec Universal Radio Hacker.
Comme pour les 2 précédents challenges, on a plusieurs morceaux, zoomant sur l’un d’entre eux.
Ça ressemble clairement à de l’ASK. Si ce type de modulation ne te dit rien, je t’invite à d’abord lire le writeup de ce challenge qui traite d’ASK.
On peut alors sélectionner ASK comme type de modulation et pour le Samples/Symbol, on peut le faire manuellement en sélectionnant le morceau le plus petit pour noter le nombre entouré en rouge.
On met la vue en ASCII pour voir ce que donne notre signal décodé. On obtient 3 lignes similaires mais qui ne veulent pas dire grand chose.
J’oublie pas que durant le premier challenge, j’avais pris du temps à comprendre pourquoi ça décoder pas car j’avais laissé le Pause Threshold à 8. Donc, je le remets à 0 pour le désactiver. Et à présent, le signal décodé donne ça :
Bon, ok pas ouf MAIS, on sait que ce challenge est le dernier de sa série et au vu de la description, les aliens ont “amélioré” la fiabilité de leur transmission.
Donc je me dis que ça doit être la méthode pour encoder les données qui n’est pas bonne.
Attention, il ne faut pas confondre la modulation avec la méthode d’encodage.
Pour envoyer un message binaire qui à la base est donc un signal numérique, on va l’encoder, il faut le voir comme la manière dont les bits sont organisés. par exemple, le morse est une forme d’encodage.
Et c’est après qu’on vient moduler le signal numérique en ASK (par exemple) pour le “transformer” en une onde radio qui puisse être transmise.
Dans le cas d’Universal Radio Hacker, il utilise par défaut comme méthode pour décoder le NRZ (Non Return To Zero). On peut le voir dans l’onglet Analysis souligné en rouge :
URH a déjà des presets de quelques méthode d’encodage connues comme le codage de Manchester. Pour ce dernier, un bit à 0 est représenté avec une transition de bas en haut (0 à 1) au milieu de l’intervalle. Pour un bit à 1, c’est l’inverse.
A noter, les traits blancs qui ne font pas partie de l’encodage, ils sont juste là pour relier deux mêmes valeurs consécutives.
Sur URH, on a le Manchester 1 et le Manchester 2 (Le Differential Manchester c’est autre chose).
La différence entre le Manchester I et 2 c’est juste que le Manchester 2 inverse les bits. Donc les 0 deviennent des 1 et les 1 des 0.
Et si on choisit le Manchester 2, on voit que le flag apparaît :)
Et voilà pour ce dernier challenge de transmission alien.
-
Writeup RingZer0 CTF : Let's Get Scwhifty!
Description du challenge : The aliens are on to us… They’ve started wearing tin foil hats and switched things up with their radio transmission. Can you crack their latest message?
Le challenge est disponible à cette adresse.
Pour comprendre le writeup, il est important de comprendre la notion de modulation, alors n’hésite pas à jeter un oeil sur ce cours :)
Le challenge commence avec un fichier sdr-challenge2.cfile.
Ouvrons-le avec Universal Radio Hacker.
On retrouve plusieurs morceaux similaires, en zoomant sur l’un d’entre eux, on remarque beaucoup de bruit, rien qui puisse nous aider dans l’état actuel.
Je décide de l’ouvrir avec Inspectrum afin d’afficher le spectrogramme. Par défaut, il ouvre le signal hyper zoomé donc on voit rien, faut scroll avec le curseur du bas pour atteindre un des morceaux et obtenir ceci :
Sachant que pour le Sample Rate, j’ai mis au pif, c’est pas très grave, ça permet de faire apparaître au moins les fréquences.
Donc nous voilà avec un spectrogramme qui montre l’intensité du signal en fonction du temps (axe horizontal) et de la fréquence (axe vertical).
Déjà, on voit plus de choses intéressantes. Notamment le fort signal en bas (trait rouge que l’on voit pas très bien) qui alterne de manière brusque entre 2 fréquences. On peut alors supposer qu’il s’agit d’une modulation FSK (Frequency Shift Keying).
Ce type de modulation numérique utilise une fréquence pour représenter un 0 et une autre pour représenter un 1.
Faisons un clic droit dessus, puis Add Derived plot et Add Frequency Plot. Et on peut par la suite, sélectionner uniquement le bout du signal qui nous intéresse.
Cela nous permet de faire une analyser plus précise en observant clairement la puissance du signal varier au fil du temps à une fréquence spécifique.
Et au vue de la forme, on est à présent sur qu’il s’agit d’une modulation FSK, on peut alors extraire uniquement cette partie du signal en faisant un clic droit sur le morceau du haut (pas celui du bas !), puis Export samples to file.... On le laisse en .f32.
À présent, ouvrons le à nouveau avec Universal Radio Hacker :
À partir de là, je vais aller plus vite car j’avais déjà expliqué comment trouver les bons paramètres dans le précédent challenge donc n’hésite pas à y jeter un coup d’oeil si tu comprends pas tout ce qui suit.
Donc, on sélectionnes comme modulation FSK, on peut cliquer sur Autodetect parameters ce qui permet de trouver le Samples/Symbol tout seul et en basculant la vue de Bits en ASCII, on obtient direct le flag :)
-
Writeup RingZer0 CTF : You Turn Me On And Off
Description du challenge : We captured alien radio data… Can you crack their message?
Le challenge est disponible à cette adresse.
Pour comprendre le writeup, il est important de comprendre la notion de modulation, alors n’hésite pas à jeter un oeil sur ce cours :)
Le challenge commence avec un fichier sdr-challenge1.cfile.
Ouvrons-le avec Universal Radio Hacker.
Ok, on a plusieurs morceaux, en zoomant sur l’un d’entre eux, on peut supposer le type de modulation.
Il s’agit d’une modulation ASK (Amplitude Shift Keying) et plus précisément une modulation OOK (On Off Keying).
En ASK, de manière générale, on utilise l’amplitude du signal porteur pour représenter les données, où différentes amplitudes représentent différents bits.
Et donc, en OOK, pour représenter un bit à 1, on va envoyer un signal (on) et pour représenter un 0, on envoie rien (off).
Ce type de modulation est très utilisé pour envoyer des données numériques comme avec des clés de portail.
Du coup, depuis URH, on peut sélectionner comme type de modulation ASK. On peut aussi changer le Show data as en sélectionnant ASCII en bas à gauche afin de pouvoir lire les données en clair.
Mais autre truc important à trouver, c’est le Samples/Symbol qui fait référence au nombre de fois que le signal est mesuré (échantillonné) pour chaque symbole transmis. Par symbole, on entend “unité de transmission”.
Genre, nous comme c’est une modulation binaire, si on met le Samples/Symbol à 10, ça veut dire que pour chaque bit transmis, le signal sera échantillonné 10 fois.
Enfin bref, cette valeur est super importante à trouver puisque c’est grâce à elle qu’on pourra correctement décoder notre signal. Pour la trouver, soit on clique sur Autodetect, des fois ça marche (comme ici où il me trouve 200) mais apprenons à le faire manuellement quand même :)
Pour ce faire, on va devoir repérer le plus petit morceau de signal.
Zoomons sur le premier morceau de l’image précédente qui semble faire partie des plus petits. Et on sélectionne “à peu près” ce morceau pour regarder en bas la valeur qui nous est affichée. Ici, 210, donc avec mes mots, on peut dire que le 210 c’est la taille du plus petit mot qu’on puisse faire et donc la taille d’1 symbole. Si on veut faire des mots plus grands, leur taille sera un multiple de 210.
Bref, changeons notre Samples/Symbol avec cette valeur.
A noter que c’est pas la valeur exacte, c’est une valeur approximative, j’ai pas le tricks pour trouver exactement la bonne valeur, et d’ailleurs, ce que je trouve est légèrement différent de ce que nous donnait l’Autodetect.
Pas grave, on voit qu’au niveau de ce qui est décodé, ça veut pas dire grand chose mais hors mis la dernière, chaque ligne est similaire. Le même signal est répété.
Pendant longtemps, je n’ai pas compris pourquoi je n’arrivais pas à mettre la main sur le flag, surtout qu’en mettant le Samples/Symbol à 190, j’obtiens des valeurs comme celle-ci :
On voit qu’une bonne partie est constituée de “vrais” caractères, et non, c’est pas de l’hexa que je peux décoder…
Après pas mal de recherches, j’ai finis par trouver un paramètre qui change la donne.
En cliquant sur la clé à molette à droite du type de modulation, on peut désactiver la valeur Pause Threshold. Et en faisant, ça toutes les données s’affichent plus que sur une ligne avec dedans le flag !
Ce paramètre sert à déterminer les pauses ou les intervalles de silence entre les données du signal. C’est en gros le nombre minimum d’échantillons de silence consécutifs qu’il faut pour dire “Ah ! là y a une pause” dans la transmission.
Par défaut, URH met cette valeur sur 8, donc pour lui, il y a une pause tous les 8 échantillons consécutifs où le signal est en dessous d’un certains niveau (considéré comme silence).
Bref, en désactivant cette contrainte, URH ne cherche plus de pauses et réussi à décoder le signal.
Et voilà pour ce challenge :)
-
Comprendre les systèmes de positionnement par satellites
Le système de positionnement par satellites que l’on désigne par GNSS (Géolocalisation et Navigation par un Système de Satellites) nous permet de déterminer des positions géographiques précises n’importe où sur Terre 🌍.
On va aujourd’hui comprendre comment fonctionne tout ça, dans les grandes lignes parce que ça peut vite devenir compliqué :)
Introduction
Ce qu’on appelle GPS (Global Positioning System) n’est qu’un type de GNSS opéré par les États-Unis depuis les années 70. Mais il en existe d’autres, comme le Galileo en Europe (opérationnel en 2024 et plus précis que le GPS), le GLONASS en Russie ou encore le BeiDou en Chine.
Donc, dans le vie courante, lorsque l’on parle de “GPS”, on entend par là le terme générique GNSS quel qu’il soit.
Dans le cas de la constellation GPS, c’est 24 satellites qui orbitent autour de la Terre à une altitude d’environ 20000km sur l’orbite terrestre moyenne de sorte à ce qu’il est toujours au moins 4 satellites visibles en même temps.
Ces derniers émettent en permanence des ondes radios et comme on connaît leur position, on peut grâce à de la triangulation déterminer la distance entre le satellite et le récepteur sur Terre.
Même si 3 satellites pourraient suffire pour récupérer une latitude et une longitude, en pratique, il en faut plutôt au minimum 4. Ce dernier permettant de corriger le décalage d’horloge. Mais on va voir tout ça après.
Référentiel géocentrique
Un référentiel, c’est simplement un point de vue. Le lieu d’où on observe les choses. Et quand il s’agit de faire des calculs liés au GNSS, on se base sur le référentiel géocentrique 🌐 (ou ECEF en anglais).
Ce référentiel utilise le centre de la Terre comme point de référence.
Ce dernier se base sur un système dit cartésien, ça veut dire qu’il utilise 3 axes perpendiculaires entre eux, nommés X, Y et Z pour définir la position des points.
Ces coordonnées (x,y,z) permettant ainsi de localiser précisément des points dans l’espace en fonction de leur distance par rapport au centre de la Terre.
Mais comme des positions x,y,z c’est pas trop parlant pour nous, on convertit ses données en latitude et longitude bien plus simple à lire.
Pseudo-distance
On parle de pseudo-distance pour parler de la distance apparente entre un récepteur et un satellite.
Elle se mesure avec la formule qu’on apprenait au lycée D=V.Δt avec D la distance, V la vitesse moyenne de propagation du signal et Δt le temps mis pour recevoir le signal.
Si l’on utilise le mot “pseudo”, c’est qu’en réalité, cette distance inclut non seulement la vraie distance mais aussi des erreurs dues à divers facteurs comme les décalages d’horloges entre le récepteur et l’émetteur ou encore les effets atmosphériques.
Le satellite et le récepteur génèrent tous les deux un même code afin de bien identifier le satellite. En comparant les deux, le récepteur peut mesurer le retard entre l’émission et la réception du signal. Retard du au temps que met à parcourir le signal.
Pour calculer la pseudo-distance, on multiplie ce retard par la vitesse de l’onde (vitesse de la lumière).
Triangulation
Les horloges des satellites sont synchronisées sur la même source qu’on appelle le temps GPS. Si l’on reçoit 4 signaux de 4 satellites différents, on aura alors 4 pseudo-distances.
En résolvant une équation à 4 inconnues, on peut alors récupérer les coordonnées (x,y,z) du récepteur sur Terre ainsi que le décalage de son horloge par rapport à celles des satellites.
Alors, c’est quoi ces belles équations. En fait, elles représentent la distance réelle entre les satellites et le récepteur en appliquant le théorème de Pythagore en 3 dimensions avec X, Y et Z les coordonnées du satellite et U les coordonnées du récepteur que l’on recherche donc.
Puis on additionne l’erreur dû au décalage de l’horloge notée c qui est donc la différence de temps entre les 2 horloges.
On va pas rentrer dans les détails de comment résoudre ces équations, c’est trop complexe mais il y a 2 méthodes principales pour le faire (La méthode des moindres carrés et le filtre de Kalman). Si vous êtes curieux, vous pouvez y jeter un oeil ;)
Bref, une fois qu’on a résolut tout ça, on obtient les coordonnées (x,y,z) de U.
Latitude et Longitude
Bon, nous, on veut savoir exactement où on est sur Terre pour trouver notre route, et les x,y,z, ça nous arrange pas. Heureusement pour nous, on peut les convertir en latitude et longitude.
Déjà, faut comprendre que les coordonnées à base de latitude et longitude se base sur une approximation ellipsoïdale de la Terre. En soit c’est logique, on veut convertir des trucs 3D en des trucs en 2D, sur une carte quoi. Et le meilleur moyen de représenter notre planète bleue qui est plus ou moins une boule, c’est en utilisant une ellipsoïde de référence qui est définie par le modèle mathématique WGS 84.
Pareil, on va pas rentrer dans les détails, j’ai mis la page Wikipédia pour les curieux mais c’est avec un peu de trigonométrie que la conversion se passe.
Et voilà, on est capable de se positionner sur une carte 🗺️ ! On pourrait même aller plus loin pour connaître notre altitude mais ça se complexifie encore plus donc on laisse ça de côté pour le moment.
Merci d’avoir suivi ce cours :)
On pourra prochainement découvrir une attaque très populaire, le GPS Spoofing.
Lien vers un article qui m’a aidé pour ce cours
-
Writeup Hack-A-Sat : Linky
Description du challenge : Years have passed since our satellite was designed, and the Systems Engineers didn’t do a great job with the documentation. Partial information was left behind in the user documentation and we don’t know what power level we should configure the Telemetry transmitter to ensure we have 10 dB of Eb/No margin over the minimum required for BER (4.4 dB)
Le challenge est disponible à cette adresse
Le but de ce challenge est de trouver certains points d’un bilan de liaison (budget link) pour compléter une documentation afin d’aider les ingénieurs satellites.
Donc, lorsque l’on accède à l’instance on nous donne ça :
> docker run --rm -i linky:challenge
...
Here's the information we have captured
************** Global Parameters *****************
Frequency (Hz): 12100000000.0
Wavelength (m): 0.025
Data Rate (bps): 10000000.0
************* Transmit Parameters ****************
Transmit Line Losses (dB): -1
Transmit Half-power Beamwidth (deg): 26.30
Transmit Antenna Gain (dBi): 16.23
Transmit Pointing Error (deg): 10.00
Transmit Pointing Loss (dB): -1.74
*************** Path Parameters ******************
Path Length (km): 2831
Polarization Loss (dB): -0.5
Atmospheric Loss (dB): -2.1
Ionospheric Loss (dB): -0.1
************** Receive Parameters ****************
Receive Antenna Diameter (m): 5.3
Receive Antenna Efficiency: 0.55
Receive Pointing Error (deg): 0.2
Receive System Noise Temperature (K): 522
Receive Line Loss (antenna to LNA) (dB): -2
Receive Demodulator Implementation Loss (dB): -2
Required Eb/No for BER (dB): 4.4
Calculate and provide the receive antenna gain in dBi:
Ok, ça fait pas mal d’informations.
Calcul du gain
On va utiliser ce site. Ce dernier nous demande 3 paramètres :
L’efficacité de réception de l’antenne. Elle nous est donné, elle vaut 0.55.
La longueur d’onde. On l’a aussi, elle vaut 0.025m.
La surface d’aperture physique de l’antenne. Alors, ça on l’a pas mais on peut le calculer facilement. C’est juste la surface géométrique réelle qui capte ou émet les ondes. On nous donne le diamètre de notre antenne donc au final, sa surface physique, c’est juste son aire qui se calcule avec la formule π*r^2 avec r le rayon. Dans notre cas, il vaut r=5.3/2=2.65m
Donc, calculons cette surface : π*r^2=π*2.65^2=22. On peut à présent rentrer toutes nos valeurs dans le calculateur de gain :
Super, on a notre gain qui vaut à peu près 54dB. On peut répondre à la question et ça nous renvoit ceci :
Good job. You get to continue
Receive Antenna Gain (dBi): 54.00
Receive Half-power Beamwidth (deg): 0.33
Receive Pointing Error (deg): 0.2
Receive Pointing Loss (dB): -4.48
Okay, now we know the receive antenna gain.
Calculate and provide the ground terminal G/T (dB/K):
Calcul du G/T (Gain-To-Noise Temperature)
On a un calculateur pour ça qui utilise la formule suivante :
Pour l’antenna gain, on l’a calculé avant, il vaut 54 mais attention, on veut le G/T de la station de sol (ground terminal), pas juste de l’antenne donc il faut aussi prendre en compte les pertes de transmission qui nous sont donnés Receive Line Loss (antenna to LNA) (dB): -2. On parle de gain effectif dans le cas où on prend en compte les pertes. Le calcul reste le même pour autant. Donc, notre gain effectif vaut 54-2=52.
Le system noise temperature nous est donné à 522K.
Calculons tout ça :
Ok, très bien, on trouve 24.8dB/K
Calculate and provide the ground terminal G/T (dB/K): 24.8
Nicely done. Let's keep going.
Determine the transmit power (in W) to achieve 10dB of Eb/No margin (above minimum for BER):
SUPER ! On peut passer à la suite.
Calcul du Transit Power
À présent, on doit calculer la puissance de transmission pour atteindre une marge de 10dB de Eb/No au-dessus du minimum requis pour le taux d’erreur binaire (BER).
Le BER (Bit Error Rate) c’est la proportion de bits reçus avec des erreurs par rapport au nombre total de bits transmis.
Pour toute la suite, ce document va nous être bien utile si ce n’est indispensable :)
Ça nous dit que pour calculer le transmit power, il y a 3 étapes :
1 : Déterminer le Eb/No pour le BER voulu.
2 : Convertir le Eb/No en C/N (Carrier-to-Noise ratio).
3 : Ajouter les pertes de chemin et les marges d’affaiblissement.
1 : Déterminer le Eb/No
Le Eb/No pour le BER, on nous le donne, c’est 4.4dB.
2 : Convertir le Eb/No en C/N
On va utiliser ce calculateur qui se sert de cette formule.
On a besoin du bit rate, tant mieux, on nous le donne aussi, c’est 10000000.0bps donc 10Mbps.
On aussi besoin de la bande passante du récepteur. D’après l’exemple sur le pdf, ça vaut la moitié du bit rate donc 10/2=5MHz.
On remplit tout ça et on obtient C/N ≈ 7.4dB
3 : Ajouter les pertes et les marges
Carrier Power
Le carrier power (puissance de la porteuse) se calcule avec la formule suivante :
C = C/N * N ou en dB C = C/N + N avec C/N en db, N le noise power en W.
Noise Power
Donc, on doit d’abord calculer le Noise Power (Puissance du bruit) avec cette formule :
N = k * T * B avec k la constante de Boltzmann qui vaut 1.380650x10-23 J/K, T la température effective en Kelvin et B la bande passante du récepteur en Hz.
Quand on parle de puissance de bruit, on parle en réalité du bruit thermique généré par l’agitation thermique des électrons dans un conducteur, c’est pour ça qu’on utilise le Kelvin. Plus la température est élevée, plus les électrons s’agitent et plus le bruit est fort. Bref, calculons tout ça :
>>> boltzman = 1.38065e-23 # J/K
>>> data_rate = 10000000.0 # nous est donné
>>> bandwidth = data_rate / 2 # Hz
>>> effective_temperature = 290 # on prend la même que le PDF
>>> noise_power = boltzman * effective_temperature * bandwidth
>>> print(noise_power)
2.0019425e-14 # watts
Super, on a N = 2.0019425e-14W
Sauf qu’il ne faut pas oublier d’ajouter le bruit naturel auquel fait fasse notre récepteur. Ainsi, il faut aussi lui ajouter le noise figure qui mesure la dégradation du SNR en prenant comme référence une température de 290K (C’est une température de réference à laquelle les mesures de bruit sont normalisées). Le noise figure est un ratio alors que le noise power est une mesure absolue.
Noise Figure
On peut utiliser ce site pour récupérer ce dernier.
Le noise temp, il nous est donné à 522K et pour la reference temp, j’utilise la même que le guide donc 290K.
Et pour le noise power, on l’avait déjà calculé (2.0019425e-14) mais le résultat était en watt. Mettons le donc en dBm :
>>> import math
>>> noise_power_w = 2.0019425e-14 # W
>>> noise_power_mw = noise_power_w * 1000 # mW
>>> noise_power_dBm = 10*math.log10(noise_power_w) # dbm
>>> print(noise_power_dBm)
-106.98548400528693
On ajoute notre noise figure et noise temp : 4.4716 - 106.98548400528693 ≈ -102.5dBm
Et enfin, on a notre carrier power : C = 7.4 - 102.5 = -95.1dB.
Il s’agit de la puissance que reçoit le récepteur en entrée.
Path Loss
La path loss (pertes de propagation) en dB pour un site en plein air suivent cette formule : PL = 22dB + 20log(d/λ) avec d la distance entre l’émetteur et le récepteur. Et λ la longueur d’onde de la porteuse. Ces 2 valeurs nous sont déjà données.
>>> distance = 2831000 # m
>>> wavelength = 0.025 # m
>>> path_loss_dB = 22 + 20*math.log10(distance/wavelength) # dB
>>> print(path_loss_dB)
183.0799972138613
Okkk, on a notre PL=183.0799972138613
Transmit Power
On arrive au bout là, plus qu’à additionner tout ça ainsi que les autres pertes qui nous sont données et on aura enfin ce que l’on recherche, le transmit power
>>> transmit_line_losses = 1
>>> transmit_pointing_loss = 1.74
>>> polarization_loss = 0.5
>>> atmospheric_loss = 2.1
>>> ionospheric_loss = 0.1
>>> receive_pointing_loss = 4.48
>>> carrier_power_dBm = -95.1
>>> path_loss_dB = 183.0799972138613
>>> margin_dB = 10
>>> tx_antenna_gain_dBi = 16.23
>>> rx_antenna_gain_dBi = 54.00
>>> tx_power_dBm = transmit_line_losses + transmit_pointing_loss + polarization_loss + atmospheric_loss + ionospheric_loss + receive_pointing_loss + carrier_power_dBm + path_loss_dB + margin_dB - tx_antenna_gain_dBi - rx_antenna_gain_dBi # dBm
>>> tx_power_w = 10 ** (tx_power_dbm / 10) * 10**-3 # watt
>>> print(tx_power_W)
5.847897089829658
SUPER, donc notre puissance de transmission serait 5.8W.
Determine the transmit power (in W) to achieve 10dB of Eb/No margin (above minimum for BER): 5.8
Sorry, you lost
Wrong! Maybe next time.
AIE 🥲. Pourtant, le résultat est vraiment super cohérent.
Du coup, on va brute force, tant pis. Voici le script :
from pwn import *
context.log_level = "critical"
output = b"Wrong answer! You lose."
tx_power = 5.0
while b"Wrong" in output:
command = "docker run --rm -i linky:challenge"
p = process(command, shell=True)
p.recvuntil(b"Calculate and provide the receive antenna gain in dBi: ")
p.send(b"54\n")
p.recvuntil(b"Calculate and provide the ground terminal G/T (dB/K): ")
p.send(b"24.8\n")
p.recvuntil(b"Determine the transmit power (in W) to achieve 10dB of Eb/No margin (above minimum for BER): ")
print(f"Trying with Power Transmission = {tx_power:.1f}")
tx_power_formatted = f"{tx_power:.1f}\n"
p.send(tx_power_formatted.encode())
output = p.recv()
p.close()
tx_power += 0.1
print(output.decode())
On lance notre super script est … :
> p pouet.py
Trying with Power Transmission = 5.0
Trying with Power Transmission = 5.1
...
Trying with Power Transmission = 9.4
Trying with Power Transmission = 9.5
Winner Winner Chicken Dinner
OK, ça a l’air d’être 9.5W, un peu loin de ce que l’on a trouvé mais tant pis, on essaie cette valeur et let’s gooo, on a le flag !
Et voilà pour ce challenge avec pleins de calculs.
-
Prédire le passage des satellites avec les TLE
Pour prédire le passage d’un satellite à un endroit donné, on a besoin de connaître comment est décrit son orbite. Pour cela, on va utiliser un standard qui se nomme TLE se basant sur 6 paramètres physiques.
TLE (paramètres orbitaux à deux lignes)
Pour savoir quand est-ce que va passer un satellite au dessus de nous, on peut utiliser SatDump, N2YO ou bien d’autres. Mais tous ont en commun de se baser sur les mêmes données, à savoir les TLE (Two Lines Elements) qui sont propre à chaque objet en orbite autour de la Terre. La NASA et la NORAD les calculent régulièrement (car les orbites des objets changent) puis les publient sur des bases de données comme CelesTrak sur lesquelles se base nos fameux outils de prédiction.
Prenons le TLE de NOAA 19 à date où j’écris l’article en guise d’exemple :
NOAA 19
1 33591U 09005A 24285.49466946 .00000972 00000-0 54355-3 0 9997
2 33591 99.0340 342.4576 0013141 327.7681 32.2687 14.13153634808053
La deuxième ligne est celle qui nous intéresse car c’est grâce à elle qu’on détermine à quoi ressemble l’orbite de l’objet en question. Et pour les plus courageux, c’est sur ces mots barbares qu’on va poursuivre le cours en s’aidant du super site Orbital Mechanics.
L’inclinaison
Noté i, c’est l’angle d’inclinaison en ° du plan de l’orbite par rapport au plan équatorial.
En bleu, c’est le plan de l’orbite terrestre. En orange, c’est le plan de l’orbite du satellite.
On distingue 3 types d’inclinaison :
0°≤i≤90° : Prograde, le sens de l’orbite est le même que le sens de rotation de la Terre (ouest vers l’est).
90°<i≤180° : Rétrograde, le sens de l’orbite est à l’inverse du sens de rotation de la Terre (est vers l’ouest).
i=90° : Orbite polaire, cas particulier qui couvre toutes les latitudes.
Longitude du nœud ascendant
Noté Ω, c’est l’angle entre le nœud ascendant et le point vernal. J’avoue, ça n’aide pas 😄.
Nœud ascendant
D’abord, la notion de nœud ascendant et tant qu’on y est de nœud descendant :
Le nœud ascendant, c’est le croisement entre le plan de l’orbite terrestre et celle du satellite lorsque ce dernier “remonte”. Le nœud descendant, c’est pareil mais inversement.
Point Vernal
Le point vernal, c’est en gros le nœud ascendant de l’orbite du Soleil avec celle de la Terre.
L’écliptique, c’est l’orbite que décrit le Soleil autour de la Terre. L’équateur céleste, c’est le plan défini par l’équateur terrestre.
Longitude du nœud ascendant
On comprend (à peu près) mieux la première phrase : La longitude du nœud ascendant, c’est l’angle entre le nœud ascendant et le point vernal.
Bon, j’avoue, c’est le plus dur de tous à assimiler mais voyons ce que si passe quand on change cet angle avec orbital Mechanics :
Le demi-grand axe
Bien que non présent dans les TLE, ce paramètre est à prendre en compte pour la représentation d’une orbite.
Noté a, il représente la moitié du grand axe d’une ellipse.
Voilà comment se modifie notre orbite lorsque que l’on modifie cette valeur :
L’excentricité
Noté e, ça représente l’aplatissement d’une ellipse. Elle se calcule à partir des longueurs du demi-grand axe a et du demi-petit axe b avec cette formule.
Pour e=0, on a un cercle parfait (orbite & chemin fermé).
Pour 0<e<1, on a une ellipse (orbite & chemin fermé). C’est ce type d’excentricité qu’on aura affaire pour les satellites.
Pour e=1, on a une parabole (trajectoire ouverte).
Pour e>1, on a une hyperbole (trajectoire ouverte).
Changement de e :
L’argument du Périastre
Noté ω, c’est l’angle en ° entre le nœud ascendant et le périastre.
Le périastre, c’est le point sur l’orbite où le satellite est au plus proche de l’astre autour duquel il tourne.
Si l’astre c’est la Terre, on parle de périgée et d’apogée (périhélie et aphélie pour le Soleil).
Voyons ce qui se passe quand on change cet valeur :
L’anomalie vraie
Noté 𝜈, c’est l’angle en ° entre le périastre d’une orbite et la position actuelle du satellite. En fait, c’est ce paramètre qui nous permet de situer le satellite sur notre orbite. Sur le schéma ci-dessous, en fonction de l’angle, le satellite sera à différents endroits sur l’orbite.
Donc voilà, on a :
La taille et la forme de notre orbite grâce au demi-grand axe et l’excentricité.
L’orientation de l’orbite grâce à l’inclinaison, la longitude du nœud ascendant et l’argument du périastre.
La position du satellite grâce à l’anomalie vraie.
Et c’est bon, on a réussi à arriver jusqu’au bout, BRAVO 😎.
Retenez surtout qu’on va souvent utiliser les TLE car c’est grâce à eux qu’on pourra prédire le passage d’un satellite à un endroit bien précis.
Pour ceux qui auraient besoin d’une autre représentation visuelle, y a cette super vidéo.
-
Réception automatique d'images satellites NOAA
Pour tout curieux souhaitant débuter dans le milieu de la SDR, recevoir des images satellites en fabriquant sa propre antenne est un excellent point de départ pour acquérir des bases en radiofréquence. On va pousser ce projet un peu plus loin en faisant en sorte que ces images satellites se récupèrent automatiquement.
Compréhension du projet
Qui sont les NOAA ?
Les satellites NOAA sont des satellites météorologiques américains situés à une altitude d’environ 850km. Pour comparer, l’ISS est à environ 400km.
À ce jour, il y en a 3 qui vont nous intéresser :
Leur fréquence étant publique, n’importe qui avec le matériel adéquat peut recevoir leurs images. Ils ne sont plus en période d’exploitation mais tant que la NASA considère qu’ils ne sont pas un danger, ils continuent de les laisser tourner.
Orbite héliosynchrone
Ces satellites ont une orbite circulaire qui les font passer d’un pôle à l’autre de la Terre. Ce sont des orbites dites polaire et plus précisément héliosynchrone. Mais pour plus d’infos sur les différents types d’orbites, tu peux cliquer ici.
Ils se présentent toute l’année sous le même angle par rapport au Soleil :
Ainsi, comme la Terre tourne sur elle même, le satellite peut balayer toute sa surface. Grâce à des logiciels ou sites web, on peut calculer ses orbites et prévoir le passage de chacun par rapport à des coordonnées géographiques. Ils passent à peu près 2 fois par jour au-dessus d’une même zone.
Par exemple, voici une liste de prédictions au dessus de la ville où est installée mon antenne:
Transmission APT
Les NOAA ne prennent pas directement des photos de la Terre. Ils utilisent un radiomère à balayage qui effectue un scan comme le ferait un scanner papier à une vitesse de 2 lignes par seconde, donc c’est lent.
Pour cela ils vont utiliser le mode APT (Automatic Picture Transmission). Il date de 1960 et seules ces 3 satellites l’utilisent encore. La qualité n’est que de 4km pour 1 pixel.
Voici un exemple d’image transmise que j’ai reçu avec ce système :
La transmission est composée de deux canaux d’images, des informations télémétriques et des données de synchronisation.
Le premier canal (image de gauche) d’image est pris avec un capteur dans les longueurs d’onde visibles. (Un autre capteur peut être utilisé en fonction de la quantité de nuages).
Le second canal (image à droite) utilise un capteur infrarouge.
La bande à gauche de chaque image sont des données de synchronisation. Comme les ondes peuvent faire des rebonds dans l’atmosphère ou sur d’autres obstacles, elles peuvent ne pas arriver dans le bon ordre jusqu’à l’antenne, donc ces bits de données sont là pour les remettre dans le bon ordre et être sûr qu’on reçoive le scan correctement.
Les 2 bandes à droite de chaque image sont des données télémétriques. Il s’agit d’informations envoyés concerant le satellite ainsi que des données pour la météo (c’est à ça qui sert après tout).
Toutes ces données vont être envoyées ligne par ligne à l’horizontal.
Avant d’être diffusées, les images recoivent des corrections géométriques permettant ainsi d’être exempt de la distorsion causée par la courbure de la Terre (car oui, la Terre n’est pas plate).
Ainsi, avec ces deux images capturées, on peut obtenir d’autres types d’image. Par exemple, voici une image thermique générée par les deux images précédentes :
C’est grâce à ce genre d’image que les personnes dans la météorologie seront à même de prédire le temps qu’il va faire ⛈️.
Fonctionnement d’une antenne et SDR
Pour récupérer leur images, il va nous falloir une antenne ainsi qu’un récepteur SDR.
Ainsi, je vous recommande de lire les 2 articles que j’ai fais, le premier pour comprendre comment on choisit une antenne en fonction de la fréquence qu’on veut écouter.
Le second qui explique ce qu’est la SDR (Software Defined Radio).
Mise en place du projet
Partie matérielle
Fabrication de l’anntenne
Pour ce projet, j’ai décidé de partir sur une antenne V-dipôle qui sera placée horizontalement. De fait, son diagramme de rayonnement sera dirigé vers le ciel. Ça permet aussi de grandement réduire les interférences en provenance des signaux terrestres polarisés veriticalement.
Malgré tout ça, ce n’est pas l’antenne optimale pour ce projet (à cause de sa polarisation) mais ça reste la plus simple à construire donc on va partir là dessus pour débuter. Si non, on pourrait directement partir sur une antenne QFH.
Les signaux APT sont très résistants donc au final, même avec une antenne non parfaite, on recevra quand même des trucs, le plus important, c’est surtout d’avoir un ciel dégagé avec l’antenne placée le plus haut possible.
Comme vu sur les cours des antennes, pour qu’elle soit résonnante à la fréquence de 137MHz, on peut faire le calcul suivant : λ=300/137≈2.18m.
On va faire une antenne demi-onde donc elle devra faire une longueur de 2.18/2 soit 1.09m.
De plus, comme on fait un dipôle, on va devoir diviser à nouveau par 2 pour avoir la longueur de chaque pôle. Donc 1.09/2≈0.54. On sait à présent que chaque pôle devra faire 54cm pour être efficace au 137MHz.
Afin d’avoir une impédance de 50Ω, l’angle formé par les 2 pôles doit être de 120°.
Le raccordement entre les pôles et le câble se fait avec un domino. On relie la tige centrale du câble à l’un, et la tresse autour du câble à l’autre. On peut analyser ses performances avec un testeur d’antenne.
Le deux valeurs à prendre en compte sont
L’impédance -> R (Ω) qui est de 58Ω donc pas les 50Ω idéales mais relativement proche donc c’est cool.
Le rapport d’onde stationnaire -> VSWR qui doit être au plus proche de 1. Et là, 2.8, c’est pas terrible.
Les premiers résultats n’étant pas très convaincant, je décide d’enlever le domino et de plutôt venir souder les parties entre elles pour que le contact se fassent au mieux. Je récupère à la déchetterie une vieille antenne TV pour caravane qui me permet de facilement régler l’orientation des pôles pour ajuster l’impédance de l’antenne. Et voici le résultat final :
Le VSWR est très proche de 1 ce qui est vraiment pas mal pour le coup.
L’impédance de 42Ω n’est pas parfaite mais reste tout à fait correct.
Placement et Orientation
Une antenne dipôle n’est pas omnidirectionelles et il va falloir la placer correctement. Les NOAA avec leur orbite polaire arrive soit par le nord soit par le sud. Par conséquant, on doit orienter l’antenne dans l’une de ses directions, n’importe laquelle. Si on la place vers le nord alors que le satellite arrivait par le sud, on aura juste à retourner l’image. :)
Voilà le rendu final de l’antenne sur le toit orienté plein sud dans mon cas :
Évidemment, la parabole et l’antenne râteau n’ont rien à voir pour ce projet.
Raspberry
Pour ce projet, j’utilise un Raspberry 4 model B qui tourne sur Raspbian lite OS en 64-bits. Il n’aura pas d’interface graphique afin d’éviter toutes fréquences parasites provoquées par la consommation du CPU et de la RAM à cause des composants graphiques.
Ce dernier sera placé dans les combles dans un tupperware pour le protéger de la poussière. Pour le récepteur SDR, j’utilise la clé RTL-SDR V4. Elle sera reliée à l’antenne par 5m de câble coaxial TV de récup, mais c’est mieux de prendre un bon câble style du RG58.
Filtre
Bien que la clé SDR a pour rôle d’enregistrer dans la fréquence qu’on lui demande, elle n’est pas parfaite et il y aura toujours des signaux parasites autour. Pour régler ce problème, on peut être tenté par utiliser un LNA (Low Noise Amplicator). Il va nous permettre de filtrer et amplifier les signaux dans une gamme de fréquence bien spécifique. Par exemple, pour ce projet, il faudrait un LNA 137MHz comme celui-ci.
Il est important de le placer au plus prêt de l’antenne, afin d’amplifier le signal dès que possible. Ainsi, on est sur que le signal ne se perde pas durant le trajet.
⚠️ Mais attention, l’efficacité d’un filtre dépendra de pleins de facteurs compelxes. Car même si le signal du NOAA sera amplifié, le bruit parasite le sera aussi. Et dans mon cas, pour l’avoir testé, ça ne change vraiment rien d’avoir un filtre donc je ne recommande pas d’investir dedans.
Partie logicielle
Afin de tester toute notre chaîne matérielle, on peut d’abord brancher notre récepteur SDR à un ordinateur avec un logiciel comme SatDump et tenter de récupérer un signal manuellement. J’en ai fais un guide juste ici.
Si tout fonctionne, en théorie on pourrait s’arrêter là pour le projet, mais pour aller plus loin, on va faire en sorte d’automatiser tout ça pour avoir un site qui contiendra toutes nos images récupérées 🖼️.
Github
Pour ce projet, j’ai décidé d’utiliser ce dépôt Git qui va grandement nous être utile.
Pour l’installer, on le git clone sur le Raspberry, puis on édite le fichier config/settings.yml pour y mettre nos coordonnées géographiques ainsi que d’autres paramètres selon nos besoins.
Voici quelques exemples de paramètres que j’ai changé :
# Les coordonnées de où est installée votre antenne.
latitude: 37.2387771634851
longitude: -115.80047482064876
altitude: 1360
# Le logiciel satdump est plus récent et plus efficace.
noaa_decoder: 'satdump'
meteor_decoder: 'satdump'
# Le signal au début et la fin du passage est très faible ce qui crée pas mal de bruit sur notre image. On peut alors rogner ces parties pour avoir une meilleure image.
noaa_crop_toptobottom: true
# Perso, j'aime bien avoir une image naturelle sans les frontières et grilles.
noaa_map_crosshair_enable: false
...
noaa_map_grid_degrees: 0.0
...
noaa_map_country_border_enable: false
...
noaa_map_state_border_enable: false
On a plus qu’à lancer l’installation en exécutant le script ./install_and_upgrade.sh (ça prend du temps) et nous voilà avec un site web affichant tous les passages prévus des satellites, un enregistrement qui se lance automatiquement et une page Capture avec l’ensemble des images récupérées. Super pratique !
Accès à distance
Après l’installation, un serveur web nginx est créé en localhost sur le Raspberry accessible donc que depuis le réseau local.
Si vous avez un nom de domaine et que vous souhaitez accéder à votre site depuis n’importe où, vous pouvez associer votre site à l’adresse IP de votre box internet. Grâce au tool GitHub, on a la possibilité de générer des certificats HTTPS très facilement pour améliorer la sécurité du site. Vous pouvez consulter ce guide pour en savoir plus. Dans mon cas, ma station est accessible depuis ici.
Prédiction
Pour prédire le passage des satellites, on a un cronjob qui va se lancer chaque jour à 00h00. Il va s’occuper d’aller chercher les TLE (Two Lines Elements) des satellites en ligne. Il s’agit d’une représentation standardisée des paramètres orbitaux des objets en orbite terrestre. C’est grâce à ces paramètres que l’on va pouvoir prédire à quelle heure un satellite va passer au dessus d’un point donné.
Une fois récupérée, on a une base de données à jour contenant la position des satellites qui nous intéressent.
Ainsi, on peut faire appel à l’outil predict qui va prédire le passage des satellites en sa basant sur les TLE, et sur la position géographique du fichier setting.yml. Ce dernier va nous donner un intervalle durant laquelle le satellite va passer en nous indiquant l’élévation maximale du passage.
Un exemple de la commande lancée manuellement :
> nugget@noaa:~ $ predict -p "NOAA 15" -t /home/nugget/.config/satdump/satdump_tles.txt
1714330922 Sun 28Apr24 19:02:02 0 173 192 17 358 3297 35014 * 0.000000
1714331020 Sun 28Apr24 19:03:40 7 175 196 23 359 2648 35014 * 0.000000
1714331117 Sun 28Apr24 19:05:17 15 178 200 29 0 2017 35014 * 0.000000
1714331212 Sun 28Apr24 19:06:52 29 185 204 35 2 1446 35014 * 0.000000
1714331299 Sun 28Apr24 19:08:19 49 202 208 40 4 1030 35014 * 0.000000
1714331365 Sun 28Apr24 19:09:25 64 248 211 43 5 886 35014 * 0.000000
1714331410 Sun 28Apr24 19:10:10 59 293 213 46 6 919 35014 * 0.000000
1714331461 Sun 28Apr24 19:11:01 45 318 215 49 7 1079 35014 * 0.000000
1714331532 Sun 28Apr24 19:12:12 29 331 218 53 9 1423 35014 * 0.000000
1714331618 Sun 28Apr24 19:13:38 17 337 222 58 12 1937 35014 * 0.000000
1714331713 Sun 28Apr24 19:15:13 8 341 226 63 16 2543 35014 * 0.000000
1714331810 Sun 28Apr24 19:16:50 1 343 230 69 21 3185 35014 * 0.000000
1714331830 Sun 28Apr24 19:17:10 0 344 230 70 23 3314 35014 * 0.000000
Ici, on demande les prédictions du satellite NOAA 15 en précisant un fichier TLE à jour. L’élévation est indiqué par la 5ème colonne.
On voit que le prochain passage aura lieu entre 19:02 (première ligne) et 19:17 (dernière ligne) et que l’élévation maximale aura lieu à 19:09 (6ème ligne) et sera de 64°.
Traitement du signal
Mais au final, qu’est ce qu’on enregistre, des images ? Et bien non. En réalité, l’enregistrement consiste en la récupération d’un fichier audio !
La commande principale ressemble à ça :
./satdump live noaa_apt --source $receiver --samplerate $samplerate $ppm_correction --frequency "${NOAA_FREQUENCY}e6" --sdrpp_noise_reduction $gain_option $GAIN $crop_topbottom --start_timestamp $PASS_START --save_wav $finish_processing --timeout $CAPTURE_TIME
On va pas rentrer dans les détails de chacun des arguments mais cette commande permet d’enregistrer le signal et de le traiter en même temps afin de convertir le signal audio en une image. Vous trouverez des infos sur les arguments ici et ici.
Récupération des images
Une fois tout le traitement terminé, satdump va appliquer un traitement sur l’image reçue selon ce que l’on a mis comme paramètres dans le fichier settings.yml. Ainsi, il va pouvoir en générer plusieurs, comme des images en couleurs ou en vision thermique. Ces dernières étant disponible depuis la section captures de votre site.
Voici un exemple de la même image de NOAA 19 reçue mais avec un traitement différent :
Comme vous pouvez le voir, il y a pas mal de bandes en plein milieu, ce sont des interférences dues à mon antenne qui n’est pas parfaite. J’y travaille afin d’avoir une image parfaitement nette.
Les images que je récupère sont disponibles sur ma station juste ici.
Suite et Améliorations
METEOR
Si vous avez tout correctement configuré, vous avez dû voir qu’il y a 2 autres satellites appelés METEOR qui sont récupérés. Ce sont aussi des satellites météos qui émettent sur les 137MHz. C’est pour cela qu’avec le même matériel que pour les NOAA, vous pouvez les recevoir. Plus d’infos sur ces satellites russes ici.
HRPT
En réalité, ces satellites peuvent envoyer de plus belles images que ça. On l’a dit, mais le protocole APT date de 1960 alors que ces satellites ont été envoyés dans les années 2000. En fait, c’est juste pour une question de rétro-compatibilité avec de vieux équipements. Mais sinon, les météorologues vont utiliser un protocole plus récent, le HRPT ( High-Resolution Picture Transmissions). Les NOAA envoient avec ce mode sur des fréquences plus hautes, 1700MHz. Leur réception demande plus de connaissance et surtout une antenne tout autre. Il s’agit de la suite logique de ce projet afin d’avoir des images toujours plus belles car là où l’APT nous donnait du 4km/pixel, l’HRPT nous donne du 1km/pixel. C’est comme passé d’un écran FULL HD à de la 4K :)
-
Comment choisir son antenne pour la SDR ?
Une antenne n’est rien de plus qu’un morceau de métal. Son but est de transformer une énergie électrique en une onde électromagnétique pour transmettre un signal radio et inversement pour en recevoir. Nous allons dans ce cours voir les différentes notions importantes à comprendre afin de bien choisir son antenne, que ça soit pour un projet SDR ou n’importe.
Fréquence
Pour choisir son antenne, il va d’abord falloir savoir sur quelle fréquence on veut travailler. Mais d’abord, c’est quoi la fréquence ?
Quand on branche une prise de courant dans une maison, le courant qui y circule est dit alternatif, cela signifie qu’il change de sens à intervalle régulier (Le courant va du + vers le - et vice-versa). Le changement ne se fait pas en mode brutal, mais progressivement, formant une jolie sinusoïde.
En France par exemple, cet intervalle oscille à 50Hz, ça signifie qu’il change de sens 100 fois par seconde. C’est ce qu’on appelle la fréquence avec comme unité le Hertz.
Une radio, c’est aussi un oscillateur, on parle de VFO (Variable Frequency Oscillator), terme barbare pour dire qu’on peut changer la fréquence.
Par exemple, en voiture, on peut tourner la roulette pour mettre une fréquence de 102.4MHz (NRJ). Cela signifie qu’on a 102,4 millions d’oscillations par seconde !
Longueur d’onde
Le facteur le plus important d’une antenne est sa longueur que l’on choisira en fonction de la fréquence qui nous intéresse. On dira que notre antenne est résonante à une fréquence spécifique. Ce qui signifie qu’elle transformera efficacement l’énergie électrique en onde radio et inversement.
Pour que notre antenne soit en résonance avec une fréquence, elle devra correspondre à une proportion spécifique de la longueur d’onde du signal.
La longueur d’onde se calcule ainsi, sachant qu’on a une version simplifiée comme on connaît la vitesse de la lumière et que l’on travaille surtout avec des fréquences en MHz :
Quand on a calculé la longueur d’onde du signal qu’on souhaite exploiter, on va pouvoir choisir une fraction de cette valeur pour dimensionner l’antenne, généralement une demi-onde (λ/2) ou une quart d’onde (λ/4).
Par exemple, supposons qu’on veut une antenne pour travailler sur la fréquence 433MHz, on calcule sa longueur d’onde : 300/433≈0.70cm. Si on part sur une antenne demi-onde, sa longueur devra donc être égale à la moitié de la longueur d’onde soit 34.5cm.
Une fois qu’on connaît la taille de notre antenne, il va falloir déterminer quelle forme elle va prendre. Mais avant ça, il va falloir faire une parenthèse sur la notion d’impédance.
Impédance
Alors, on va faire simple. Pour que notre signal radio soit efficacement transféré entre l’antenne et le récepteur/émetteur, il faut que les deux soient bien adaptés l’un à l’autre. Cette adaptation est déterminée par une propriété appelée impédance.
Il faut la voir comme la résistance d’un circuit électrique mais adaptée aux courants alternatifs. En radiofréquence, on voudra que l’impédance de l’antenne match avec celle de notre appareil de réception/émission. Une valeur est utilisée presque partout de manière général, c’est 50Ω. C’est par exemple l’impédance des récepteurs SDR. Bref, ça signifie qu’on cherchera toujours à avoir une antenne au plus proche de ce 50Ω.
Types d’antenne
Ils existent tout un tas de type d’antenne donc on va pas toutes les présenter, mais jetons un coup d’œil à 3 d’entre elles importantes à connaître.
Dipôle (Doublet)
L’antenne la plus basique que l’on puisse faire est une antenne doublet. Elle existe en mode replié (qu’on appelle trombone) et en mode classique qu’on appelle dipôle. C’est sur cette dernière qu’on va s’intéresser bien que la trombone suit le même principe.
Dans sa version basique, il s’agira d’une antenne demi-onde (λ/2), avec chacun des pôles qui aura une longueur de λ/4. Cette dernière est alimenté en son milieu et se place de manière isolée dans l’espace et loin du sol.
L’angle entre les 2 pôles peut être ajuster afin de régler l’impédance de notre antenne. Dans le cas où ils sont droits comme sur le schéma, on aura une impédance de 75Ω. En mettant un angle de 120°, on aura nos 50Ω comme sur ce projet.
De plus, une dipôle peut être placé horizontalement ou verticalement selon la polarisation des ondes que l’on souhaite exploiter.
Enfin, ce type d’antenne concentre son énergie dans deux directions, la rendant très efficace lorsque l’on connaît la direction du signal que l’on souhaite recevoir.
Ground plane
Pour l’antenne ground plane, on va avoir un conducteur vertical d’une longueur d’un quart d’onde (λ/4) qui va être monté au-dessus d’un plan de masse que l’on appelle ground plane, d’où le nom. Ce plan de masse agit comme un miroir qui vient “compléter” l’antenne en réflétant les ondes devenant ainsi l’équivalent d’un dipôle.
Pour former ce plan de masse, on peut utiliser des tiges métalliques qu’on appelle des radiants réparties uniformement autour de la base donnant à notre antenne une apparence d’araignée 🕷️. Pareil que pour le dipôle, si on veut une antenne à 50Ω, il faudra un angle de 120° entre les brins.
Autrement, on peut utiliser la terre, la mer, un toit de voiture, n’importe tant que c’est conducteur. D’ailleurs, certaines antennes de talkie-walkie en sont aussi à partir du moment où on le tient en main car notre corps fait office de plan de masse.
Ces antennes sont omnidirectionnelles donc pratique quand on ne connaît pas forcément la direction du signal que l’on souhaite recevoir.
Yagi
Les antennes Yagi utilisables des ondes HF aux ondes UHF, sont des antennes directives. On les appelle aussi antennes râteaux, c’est celles que l’on a en général sur nos toits pour la télévision terrestre.
L’idée est de partir sur un doublet demi-onde (λ/2), et d’ajouter des éléments parasites non alimentés afin de concentrer l’énergie dans une direction. On aura des élements directeurs, plus courts que le doublet, placés devant lui et des éléments réflecteurs qui eux, seront plus long à l’arrière.
En augmentant le nombre d’éléments, l’impédance diminue et le gain augmente ↗️. Ces antennes sont très pratiques dans le cas où l’on souhaite travailler avec un signal qui vient d’une direction bien précise, afin de concentrer toute son énergie vers lui.
Conclusion
Vous devriez déjà mieux comprendre comment choisir votre antenne et ajuster sa longueur en fonction de ce que vous voulez recevoir.
Il existe une infinité de possibilités, n’hésitez pas à me contacter sur Instagram si vous avez des questions :)
Si vous êtes intéressés par faire vos propres antennes ou tout simplement tester les performances de celles que vous achetées, je prépare un cours qui expliquera comment on évalue si notre antenne est efficace pour une certaine fréquence.
-
La modulation d'amplitude (AM)
Les signaux bruts qu’on veut émettre sont souvent faibles et peuvent grandement s’atténuer sur de longues distances. En modulant notre signal, on va pouvoir porter l’information sur une onde beaucoup plus puissante 💪🏽.
Bien que les sources d’émission se mettent plus ou moins d’accord pour utiliser des fréquences différentes, la modulation permet d’éviter les interférences en évitant que les signaux se mélangent.
La modulation
Imaginons qu’on ait un signal à transporter, du son par exemple. On l’appellera signal modulant. Ce type de signal a une fréquence basse et est très faible.
Pour le transporter, il nous faut un autre signal qu’on apellera onde porteuse qui sera une onde avec une fréquence élevée et donc puissante. C’est elle qui transportera notre signal faible.
Avec nos deux signaux réunis, on va venir les superposer (c’est des maths derrière), et on obtient notre signal modulé. Il existe plusieurs manières de faire tout ça, et en guise d’exemple, on va voir le type de modulation le plus simple à appréhender, la modulation d’amplitude.
L’amplitude
L’amplitude d’un signal représente sa hauteur maximale par rapport à sa position au repos. C’est en quelque sorte la puissance du signal radio.
Cette valeur est importante pour déterminer la qualité du signal modulé. Plus l’amplitude du signal modulé est élevée, meilleure en théorie sera la qualité de la réception, car cela permet de mieux différencier le signal utile du bruit ambiant.
En modulation d’amplitude noté AM, on va venir faire varier l’amplitude de l’onde porteuse en fonction de l’amplitude du signal modulant.
Pour mieux comprendre, on va utiliser un très célèbre logiciel nommé GNURadio. Ce n’est pas très grave de ne pas savoir comme il fonctionne. Mais dans l’idée, ça permet de manipuler des signaux radio en utilisant des blocs qu’on vient relier entre eux.
Donc là, on place 2 blocs Signal Source qui permettent de générer un signal, un pour notre Signal Modulant qui a une fréquence de 20Hz et un autre qui sera notre onde porteuse avec une fréquence de 1000Hz donc bien plus élevée que le signal modulant.
Le bloc Throttle, on s’en fiche pour ce cours mais sachez qu’il est là pour éviter de faire crash le PC en réduisant la cadence à laquelle le CPU voudrait éxecuter le programme. Un seul placé quelque part suffit, c’est pour ça que y en a juste un. Bref, revenons à ce qui nous intéresse.
Le bloc QT GUI TIME SINK va nous permettre de visualiser nos deux signaux dans le temps.
Voilà ce qu’on obtient lorsque l’on lance notre programme :
On voit nos 2 jolies sinusoides, la rouge qui est notre porteuse et la bleu notre signal modulant.
Modulation d’amplitude
À présent, superposant nos deux signaux en les multipliant. (Les fameuses maths qui se cachent derrière).
Donc ici, on a juste rajouté le bloc Multiply et on renvoie le signal modulé dans notre QT GUI Time Sink. J’ai aussi laissé les 2 autres signaux reliés au QT GUI Time Sink pour qu’on puisse mieux comprendre. Et pareil, le bloc Throttle, vous pouvez l’ignorer.
Lançons le programme et laissons apparraître uniquement le signal modulé pour voir à quoi il ressemble.
On peut voir cette forme caractéristique d’un signal modulé en amplitude.
Et maintenant, affichons nos 3 signaux (modulant, porteuse et modulé)
On comprend déjà mieux, lorsque que l’amplitude de notre signal modulant diminue, ça diminue en conséquence l’amplitude de la porteuse.
C’est tout pour ce cours simplifié sur la modulation d’amplitude. Il existe bien d’autres types de modulation (FM, PM, …) qu’on choisit en fonction de ce que l’on veut transmettre, de notre bande passante, du bruit environnant, etc, … mais on garde ça pour une prochaine fois :)
-
Les bases de la SDR (Software-defined radio)
Dans le monde des ondes radio, on utilise traditionnellement des composants qui peuvent faire peur comme des résistances, des condensateurs, des bobines afin de réaliser des systèmes permettant de traiter du signal.
L’inconvéniant, pour nous qui voulions juste découvrir la radio, c’est que chaque composant est une entité physique, qui peut être coûteuse, encombrante, et modifier ses caractéristiques demande des compétences techniques en électronique 🔧.
Heuresement pour nous, grâce au numérique, on va pouvoir simplifier tout ça et avoir la possibilité de plonger dans le monde des radiofréquences pour trois fois rien 🎉.
Récepteur numérique
L’idée va être de numériser le signal le plus tôt possible pour l’envoyer à un CPU (processeur) où l’on pourra commencer notre traitement du signal. L’avantage est que l’on pourra utiliser des algorithmes beaucoup plus complexes, notamment à l’aide des nombres complexes qui sont très difficiles à mettre en place avec des résistances ou autres.
Et oui, ces fameux nombres qu’on pensait inutiles au lycée ont une réelle utilité pour numériser les signaux.
La partie réelle du nombre sert à représenter l’amplitude (sa hauteur en quelque sorte) du signal.
La partie imaginaire, pour représenter sa phase (sa position dans le temps).
Ainsi, on va pouvoir simplifier des opérations mathématiques.
Pas convaincu ? Prenons par exemple la multiplication de deux signaux (inutile de comprendre ce que ça signifie).
Sans nombres complexes, il faudrait utiliser des calculs trigonométriques assez tordus.
Alors qu’avec les nombres complexes, il “suffirait” de multiplier les amplitudes et ajouter leur phase, ce qui se fait simplement avec des opérations algébriques sur les nombres complexes (si si 😄).
De plus, le numérique se met simplement à jour, ce qui est pratique, notamment pour les logiciels ou autres algorithmes.
Un autre gros avantage du numérique est de visualiser le spectre de fréquence ainsi qu’un spectrogramme (qu’on appelle cascade ou waterfall en anglais) ce qui est très pratique pour comprendre ce qui se passe.
C’est comme utiliser WireShark pour analyser les paquets sur un réseau🦈.
Fréquence d’échantillonnage
Les signaux radios sont dit analogiques et comportent une infinité de valeurs, et ça nos CPU n’aiment pas, donc on vient capturer plusieurs points sur le signal à intervalle régulier afin de le transformer en un nombre fini. En fait, c’est plus précis de dire qu’on vient mesurer l’amplitude du signal à intervalle régulier puis qu’on vient stocker tout ça sous forme de nombres. C’est ça qu’on appelle la fréquence d’échantillonnage !
Elle est rendue possible grâce à un convertisseur analogique-numérique (CAN).
Plus on prendra d’échantillons, plus on aura un signal numérique fidèle à la réalité mais plus il sera lourd et long à traiter.
Il existe d’ailleurs un théorème, celui de Nyquist–Shannon qui dit que pour reconstruire à l’identique un signal analogique, il doit être échantillonné à une fréquence au moins deux fois supérieure à sa fréquence maximale. En prenant une valeur 2 fois supérieure, on s’assure de reconstruire un signal analogique très précis.
Récepteurs SDR
Numériser le signal et le traiter par logiciel a un nom, c’est la SDR (Software Defined Radio). Elle est rendue possible par des récepteurs comme par exemple celui-ci :
Ces récepteurs bon marché (lien vers un super kit pour débuter), se branchent en USB à un ordinateur équipé d’un logiciel SDR (il en existe plusieurs). On retrouve un port MCX (Micro Coaxial eXtended), c’est un connecteur coaxial plus petit que l’on relie à notre antenne. Ce dernier ne permet que la réception des signaux mais pas la transmission. Pour bénéficier des deux, il faudrait par exemple utiliser un HackRF.
Logiciels SDR
Une fois en possession d’un récepteur SDR, on n’a plus qu’à s’équiper d’un logiciel SDR. À titre personnel, mon favori est SDR++ pour tout ce qui va être “écoute”.
SatDump qui est une copie de SDR++ mais spécialisée pour l’écoute et le décodage des signaux satellites.
Et mention honorable aussi pour SDRAngel bien pratique avec ses plugins permettant par exemple d’afficher des cartes interactives comme dans le cas de réception ADS-B.
À noter qu’il existe une distribution Linux du nom de DragonOS qui permet d’avoir tous ces logiciels directement installés et configurés tout seul :)
-
Writeup HackTheBox : Walkie Hackie
Description du challenge :
Our agents got caught during a mission and found that the guards are using old walkie-talkies for their communication. The field team captured their transmissions. Can you interrupt their communication to help our agents escape from the guards?
Pour ce challenge, on nous fournit 4 transmissions audio au format complex.
On a aussi accès à une instance web :
On peut tester avec des valeurs randoms pour voir comment ça réagit mais rien de spécial se produit.
Il faut sûrement y mettre un préambule spécifique ou je sais pas. Bref, allons voir de plus près les signaux avec Universal Radio Hacker.
Donc, on ouvre nos 4 fichiers avec URH. Exemple avec le premier :
En affichant les données en hexadécimal, on constate que les 4 signaux fournis suivent une même logique :
Signal 1 : aaaaaaaa73214693a1ff14
Signal 2 : aaaaaaaa73214693a2ff84
Signal 3 : aaaaaaaa73214693b2ff24
Signal 4 : aaaaaaaa73214693b1ff57
Ça a l’air de matcher avec nos 3 paramètres, pour le signal 1, aaaaaaaa serait le préambule, 73214693 le sync word et a1ff14 le payload.
Je réessaie mais toujours rien.
Par contre, on remarque que les payloads, suivent eux aussi une logique, avec 2 caractères hexa, ff, et 2 autres caractères hexa.
On pourrait se créer une wordlist pour brute-force tous les payloads possibles et voir si une page réagit différemment.
Créons d’abord une wordlist avec crunch :
crunch 6 6 0123456789ABCDEF -t @@FF@@ -o pouet
Passons au bruteforce avec ffuf. Mais d’abord, il nous faut récupérer le nom des paramètres pour la requête POST. Plusieurs possibilités, perso, j’utilise l’onglet Network présent sur n’importe quel navigateur en lançant une requête avec des paramètres au pif. On peut voir le nom de nos 3 paramètres, pa, sw et pl.
Bref, voici la commande pour le bruteforce, sans oublier le Content-Type sinon, il ne se passera rien :
ffuf -c -w pouet -u http://94.237.56.188:40252/transmit -X POST -d "pa=aaaaaaaa&sw=73214693&pl=FUZZ" -H "Content-Type: application/x-www-form-urlencoded"
On note la taille d’une requête type qui fait 2831, CtrlC puis on refait la même commande en y rajoutant le -fs 2831 pour voir si une requête a une taille différente.
On laisse mijoter et là, on voit que TOUS les payloads qui ont leur deuxième partie à F9 ont une size différente.
<SNIP>
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 25ms]
* W1: 9B
* W2: F9
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 23ms]
* W1: A7
* W2: F9
[Status: 200, Size: 2896, Words: 420, Lines: 134, Duration: 25ms]
* W1: BE
* W2: F9
Reste plus qu’à rentrer les bonnes valeurs avec un payload qui finit par F9 et obtenir notre flag :)
On peut aussi faire un curl pour que ça fasse + hacker :
curl -X POST http://94.237.56.188:40252/transmit -d 'pa=aaaaaaaa&sw=73214693&pl=a2fff9'
Touch background to close