home castoo
chapitre navigation
navigation

Navigation : Trame AIS
Outils d'analyse de trame
Géolocalisation et trace

mars 2019

La trame AIS :

Accès autres chapitres NMEA/AIS

Les trames NMEA qui commencent par !AIVDM sont intéressantes à disséquer ! Elles comprennent quelques infos que nous avions déjà décodées dans la présentation précédente, mais il y a aussi une partie DATA à laquelle nous allons nous intéresser ici.
Cette réalisation est développée avec le langage C++ dans l'environnement QT. Je vous livre donc les points importants des fichiers sources qui permettent de résoudre les problèmes qui vous entravent dans la réalisation de ce genre d'application. (pas les sources complet ! et puis quoi encore ! il faut bosser un minimum...) Pour les non programmeur l'executable sera bientôt mis à dispo...


Recepteur AIS

Le matériel que j'utilise pour ce test est un récepteur AIS, qui a plusieurs fonctions (seule la réception AIS est utile ici !) Cet appareil cumule les fonctions de traceur GPS en lui raccordant une petite antenne GPS, de récepteur AIS en lui connectant une antenne VHF, de multiplexeur NMEA en lui connectant une autre entrée NMEA. En sortie il peut soit transférer ses trames en nmea soit en USB soit par WIFI le tout pour moins de 90 euros.
Pas mal ! Je donne le lien vers la notice de ce matériel en bas d'article.
La reception AIS est également possible avec un petit recepteur USB RTL-SDR que l'on trouve pour moins d'une vingtaine d'euros (Clé USB RTL-SDR avec R820T2 sur google).


Raccordement du matériel, comme on peut le voir, il ne faut pas grand-chose pour capter les mouvements de bateaux environnants. Pour l'antenne VHF, le test est réalisé avec un simple câble de rallonge télé découpé (chercher notice sur site dans Informatique, astuces en vrac). Cette antenne me permet de capter des trames AIS de bateaux qui sont à plus de 10 km de mon domicile.

Recepteur AIS Recepteur AIS

Décomposition AIS

La trame AIVDM peut contenir jusqu'à 26 types de message différents et en plus ces messages peuvent être différents suivant qu'ils sont émis sur le canal A ou B. Certains de ces messages sont trop longs pour être encapsulés dans une seule trame NMEA, plusieurs trames sont alors utilisées et la partie data de celles-ci doit donc être concaténée pour avoir le message AIS entier.

Sur l'écran ci-dessus, voila donc la décomposition du contenu d'une trame, celui-ci est codé en binaire et représenté sous la forme de car ascii qui n'ont aucun sens ! La première étape du programme en C++ sera donc de lire cette suite binaire et de la décomposer en bit.
Le principe, on lit un octet (correspondant à un caractère ascii 8 bits (ceux que l'on voit dans le message de base)) on soustrait 48 si c'est > à 40 on soustrait à nouveau 8 et on ne garde que les 6 bits de poids faibles, ensuite on passe au caractère suivant.


Pour résoudre ce besoin le plus simple est de créer un objet. Celui-ci décodera la trame et mémorisera les infos qui m'intéressent. IL permettra au reste du programme d'accéder aux données décodées.

Objet AIS

Cet objet contiendra la description des types de trame qui m'interressent.

Objet type trame AIS

Voici donc le constructeur de cet objet, la lecture de celui-ci vous donne le principe de la mémorisation du tableau de bit et du décodage des différents types d'infos.

Constructeur Objet type trame AIS

Suivant que l'info est codée sous forme d'un entier, d'un nombre signé (complément à deux) ou non, d'un nombre flottant ou d'une chaine de caractère (ascii 6bits) des fonctions de décodage spécifiques sont nécessaires.

décodage Objet type trame AIS

Quelques informations supplémentaires sont aussi nécessaires pour documenter certains codes (petite erreur dans commentaire 2eme liste il faut lire "liste des status").

Compléments d'info type trame AIS

Voici un exemple d'un message AIS qui a demandé 2 trames NMEA, pour les décoder, il faut ajouter à la partie data de la 1er, la 2eme partie data (la checksum devient forcément mauvaise, mais le decodage ce fait normalement).

info type trame 2 messages AIS

Côté programme principal il ne reste plus qu'a exploiter l'objet. Pour chaque trame nous allons répertorier le code du bateau (mmsi) et construire des tableaux avec les infos de latitudes de longitudes et beaucoup d'autres choses.

Exploitation des infos du message AIS

Plus haut nous avons vu la description de la partie data des trames, j'ai ensuite décidé d'afficher la position du navire sur une carte (géolocaliser le navire). Pour cela il faut une carte avec la zone concernée et la position (latitude et longitude), l'AIS nous donne la latitude et la longitude dans les messages 1,2,3 et 18 (parmi ceux que nous suivons dans l'application). Pour la cartographie une communauté internationale met à notre disposition sur internet des cartes : OpenStreetMap. Ces cartes sont exploitables gratuitement pour une utilisation non commerciale. Javascript va nous permettre de localiser le point sur la carte mais aussi de créer des polylines pour représenter une continuité entre toutes les positions relevées. Pour cela nous allons devoir créer une page html avec des fonctions javascript pour afficher les infos et un fichier de données pour stocker les points (j'ai choisi de créer un fichier de données javascript indépendant car cela m'a semblé plus facile). Si j'avais voulu créer une application plus complexe pour suivre le trafic maritime il aurai été préférable d'utiliser une base SQL. Mais restons simple je n'ai pour motivation que la compréhension du NMEA et de l'AIS !
Donc le programme C++ construit le fichier data.js et y mémorise les variables suivantes :
Le premier tableau "data_ais" regroupe donc pour chaque navire sa derniere position réceptionnée et un amalgame de toutes les infos le caractérisant reçus dans toutes les trames le concernant.
Les autres tableaux "v_mmsibateau" représentent toutes les positions trouvées pour un bateau, y compris si le bateau a fait du surplace au port ! Le but du premier tableau est d'afficher tous les bateaux à leur dernieres position et si l'on passe la souris sur cette position d'afficher toutes les caractéristiques du navire dans un tableau.
Le but du deuxième tableau (1 par bateau) est de tracer une polyline qui permet de suivre son déplacement.
Sur la partie gauche de l'écran le fichier des trames nmea ais qui ont servis à la création des tableaux de données javascript.

donnees javascript AIS

Autres exemples de data javascript, on voit ici un bateau qui est resté sur sa position.

info2 type trame 2 messages AIS

Maintenant histoire de changer un peu du C++ un peu de programmation javascript.
On trouve ici le positionnement de chaque bateau en le représentant par un petit icone en forme de roue de gouvernail et l'affichage des infos du bateau en cas de survol de la souris.
Ensuite exploitation du tableau de chaque bateau avec ses positions successives pour affichage des polylines.

info2 type trame 2 messages AIS

Voila le résultat. On y voit un pétrolier (qui donc peut tourner en rond dans le Pertuis d'Antioche sans ce soucié du carburant !) qui est en attente d'autorisation pour le port industriel de la Palice. On y voit un bateau que l'on identifiera plus tard avec une trace en vert clair. et enfin on voit un amalgame de bateau dans le port de plaisance de La Rochelle. La souris survole l'un d'entre eux : un voilier de 9m.

Geolocalisation AIS

Le bateau de l'image précédente est donc un navire de dragage "Le fort boyard" qui navigue à 1 noeud et qui mesure 41 m. On voit également ici tous les bateaux appontés dans le port de plaisance de La Rochelle qui ont un AIS en route à bord.

Geolocalisation 2 AIS

La fonction de décodage d'une trame spécifique est également disponible et si des positions GPS sont détectés un bouton de géolocalisation en bas de l'ecran devient disponible.

Geolocalisation mano AIS

Et si au hasard d'une balade sur internet vous récupérez une trace ais rien ne vous empêche de voyager virtuellement en attendant de pouvoir prendre la mer !

Geolocalisation mano AIS

Voilà donc un outil qui permet de mieux comprendre ce que les trames NMEA 0183 AIS nous cachent ! IL est perfectible dans bien des domaines, dans une prochaine aventure je vais m'intéresser au NMEA 2000... A suivre...
Si vous le souhaitez, vous pouvez télécharger l'exécutable de cette application dans le dernier chapitre de cette analyse sur ce site...



Quelques liens qui peuvent vous aider pour aller plus loin :
- Les trames AIS un site incontournable (Eric S. Raymond) AIVDM/AIVDO protocol decoding
- La communauté et des ressources à portée de clic OpenStreetMap
- Fonctions javascript pour exploiter la géolocalisation : leafletjs
- Le recepteur AIS utilisé : QUARK-ELEC QK-A026 : QUARK-ELEC

accueil navigation

Bricolage Robotique Informatique Peinture Voyage
Téléc. portail Le robot "mécano" Astuces informatique Henri Bertrou Auvergne
Bat. Iphone 6S Le robot "solaire" Réseau couche app. Jean-Michel Castille Floride
Robot piscine Servo et IR" Réseau Les couches New York
Xiaomi M365 Le robot "thymio" Réseaux Outils L'Ouest américain
Mac Mini Le robot "Rovio" Unités grandeur inf. L'Ile Maurice
Putty SSH Windows L'Italie / Venise
Bases Raspberry Tunisie
Termius IPhone/IPad Grece
Le vieux ZX 81
...
Navigation La Rochelle CNC / Imp3D Electronique Programmation
Rencontre dauphins Les Minimes Construction CNC Alim. TPL 5110 Doc. programme
Analyse NMEA 0183 Le Vieux port CNC du commerce Carte ESP8266 Indent programme
graph. NMEA 0183 L'Ile de Ré Martyr CNC ESP8266 1 relai Prog. objet
Analyse trames AIS A visiter Réa. imp. 3D ESP8266 Alarme Prog. procédurale
Analyse AIS TCP-IP Cura impression 3D ESP8266 MQTT
Sortie en ketch Plateau CR10 ESP8266 Temp.
Echange GPS C80 Anémomètre.
HP Sun-Odyssey CNC / 3D en vrac MCP9808 Librairie
LCD yanmar Saisie Oled
Testeur nmea esp1 i2c