URL: https://linuxfr.org/users/harlock974/journaux/json-est-dans-les-airs Title: JSON est dans les airs Authors: harlock974 Date: 2020年01月30日T20:19:27+01:00 License: CC By-SA Tags: json Score: 81 Depuis quelque temps les longs-courriers d'Air France disposent d'un réseau wifi interne, proposant des services plus ou moins payants (malgré le prix déjà scandaleusement élevé du billet). Sur un vol récent, le serveur web accessible à partir de ce réseau était à l'adresse 172.19.131.250. Mais il n'y a pas qu'un serveur web. Un `nmap -T4 -O` donne le résultat suivant : ``` Starting Nmap 7.60 ( https://nmap.org ) at 2020年01月15日 23:07 CET Nmap scan report for iptv.video.gogoinflight.com (172.19.131.250) Host is up (0.0037s latency). Not shown: 993 closed ports PORT STATE SERVICE 22/tcp filtered ssh 80/tcp open http 1000/tcp open cadlock 1443/tcp open ies-lm 8009/tcp open ajp13 9998/tcp open distinct32 9999/tcp open abyss MAC Address: 70:B3:D5:83:B8:8D (Ieee Registration Authority) Device type: general purpose Running: Linux 3.X|4.X OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 OS details: Linux 3.2 - 4.8 Network Distance: 1 hop ``` Vous noterez le choix pertinent du système d'exploitation. Des réponses plus détaillées sur les services peuvent être obtenues avec la commande `nmap -A -T4 172.19.131.250`. Il s'avère que le port 9999 produit un flux JSON qui peut être récupéré avec un `curl http://172.19.131.250:9999` En voici un extrait : ``` {"eventId":"serviceInformation","eventValue": {"timeStamp":"2019-07-23T19:29:27.943Z","tailNo":"FGSQR", "airlineCode":"AFR","wapType":"ACWAP","systemType":"2KU", "arincEnabled":"true","acpuVersion":"10.10.0","whiteListVersion":"P15340_RevMP", "latitude":"35.7744","longitude":"23.3621", "horizontalVelocity":"587.70984","verticalVelocity":"-0.72727275", "aboveGndLevel":"31002.002","aboveSeaLevel":"31002.002", "flightPhase":"EN_ROUTE",... ``` Le flux contient ainsi les données de vol en temps réel. Il est donc possible de les enregistrer pour ensuite tracer la trajectoire sur une carte, faire une courbe d'altitude, etc... J'ai été assez déconcerté lorsque j'ai voulu extraire la longitude et la latitude du flux. D'une part par manque d'expérience dans le traitement de donnée JSON (et en vol pas de connexion internet pour récupérer de la doc). Et d'autre part il s'agit d'un flux *continu*, sans le moindre retour chariot ou saut de ligne, ce qui rend les habituels grep et cut inopérants. Je disposais par contre du programme [jq](https://stedolan.github.io/jq/), qui permet d'extraire les données par nom. Mais je n'ai pas réussi à passer directement du flux à un fichier texte de type CSV. J'ai donc utilisé un fichier intermédiaire en lançant deux commandes simultanées dans deux terminaux : ``` curl -s http://172.19.131.250:9999 | jq --unbuffered -r '.'>>/tmp/flight.json ``` et : ``` while true;do cat /tmp/flight.json| jq -r '.eventValue.longitude?+" "+.eventValue.latitude?'|grep [.]|tail -1>> /tmp/flight sleep 30 done ``` On obtient ainsi un fichier flight contenant une liste de coordonnées et se remplissant toutes les 30 secondes. Après, pour afficher la position de l'avion dans un style [Wargames](https://fr.wikipedia.org/wiki/Wargames_\(film\)), j'ai utilisé le script R suivant : ``` #!/usr/bin/Rscript X11() library(mapdata) par(bg="black") map("world",col=3,xlim=c(-30,90),ylim=c(-35,55)) repeat { flight<-read.table("/tmp/flight") points(flight,col=2,cex=0.5) Sys.sleep(60) } ``` Et voilà :) ![](https://80calcs.pagesperso-orange.fr/divers/images-linuxfr/vol.png) Il y a sans doute moyen de faire plus simple, en particulier avec la commande jq sans passer par un fichier intermédiaire, mais je n'en ai pas saisi toutes les subtilités...

AltStyle によって変換されたページ (->オリジナル) /