par Mikeno

Envoi et réception de SMS en mer

Visualisation des locations calculées sous Google-Earth

« Loin de la civilisation » (plus de 25-30 milles nautiques des côtes), les seules possibilités pour obtenir des prévisions météo par fichier « grib » ou autre sont, soit d’avoir une connexion satellite ou d’être équipé d’un émetteur/récepteur ondes courtes (BLU) en ayant la licence radio adéquate.

Une alternative intéressante est d’utiliser le Garmin InReach pour envoyer à un serveur basé à terre une requête de prévision météo par SMS pour des locations se situant autour de la position actuelle et par rapport au cap suivi.

J’ai conçu une petite application pour Android et IOS qui définit de nouvelles locations suivant les paramètres fournis (position actuelle, cap suivi, distance(s), heure(s) et angle) qui délivre le contenu du SMS de requête météo codé en base 64 afin de réduire au maximum la place utilisée. Il suffit ensuite de copier/coller le texte vers l’application EarthMate qui est connectée à l’InReach via Bluetooth pour envoyer la requête au numéro du serveur.

L’exemple suivant donne le résultat des calculs de locations à 40 et 80 milles nautiques (dans la direction du cap donné (ici 35°) avec une distance diminuée vers l’arrière) séparées par un angle de 45°, par rapport à la position actuelle étant [46.1651, -4.4876] pour un cap de 35° :

Comme la taille des SMS est limitée à 160 caractères (codés sur 7 bits) et afin de profiter au mieux du peu d’espace disponible, les nombres décimaux sont multipliés par un certain facteur (x 10.000 pour les coordonnées géographiques) afin d’économiser le caractère « . » qui marque la décimale, et plutôt que d’utiliser le système décimal (basé sur 10 chiffres « 0123456789 »), j’utilise un autre système numérique basé sur les 64 caractères suivants « 0123456789 », « abcdefghijklmnopqrstuvwxyz », « ABCDEFGHIJKLMNOPQRSTUVWXYZ » et « &# ».

Par exemple, la longitude avec une précision de quatre décimales (±179.9999), utilise 9 caractères mais une fois codée, elle ne nécessite plus que 4 caractères, même chose pour la latitude ce qui représente un gain non négligeable. Le même système de codage sera employé pour toutes les informations retournées par le serveur SMS.

Dans l'exemple ci-dessus, le message contient exactement 150 caractères ; le texte « FORQUEST », le séparateur « ? », les heures de prévision, le séparateur « ? » et les coordonnées géographiques (LatitudeLongitude).

Le premier paramètre doit être [FORQUEST] afin que le serveur SMS (un smartphone tournant sous Android) puisse déterminer que le message reçu concerne une requête météo.

Du côté du smartphone, l’SMS est reçu et l’application (compilée sur DroidScript) lit la requête, la transforme en 16 requêtes différentes (une par location géographique) envoyées sur le site worldweatheronline.com. Ensuite, l’application extrait les données requises et les transforme, dans ce cas, en 5 messages de 160 caractères ou moins pour le dernier, avec les prévisions météo des heures demandées (dans cet exemple 12h et 18h).

Ne pas utiliser la dernière version de DroidScript car l’envoi et la réception de SMS ont été retirés, la dernière version qui le permet est la v1.68.

Si plus d’un SMS est envoyé et pour le cas où les SMS arriveraient dans le désordre, chaque message est précédé d’un nombre à 2 chiffres, le premier chiffre étant le numéro de message et le deuxième, le nombre total de messages.

Finalement, les messages sont renvoyés au numéro ayant envoyé la requête (le Garmin InReach). C’est simple et peu onéreux !

Dans cet exemple, 5 SMS ont été renvoyées pour coder toutes les informations. Au début du premier SMS, le nombre d’heures de prévisions est codé sur un caractère avec les information suivantes pour chaque location et pour chaque heure demandée :

  • Température de l’air en °C,
  • Direction du vent en °,
  • Vitesse du vent en nœuds,
  • Rafales en nœuds,
  • Pression atmosphérique en hPa,
  • Visibilité en milles nautiques,
  • Couverture du ciel en 1/8 (0=ciel dégagé, 8=ciel couvert),
  • Hauteur des vagues en m,
  • Direction de la houle en °,
  • Code météo indiquant la situation météo.

Ces messages n’étant absolument pas compréhensibles à l’œil nu, une petite application (Android et IOS) les transformera en texte clair et en fichier KML afin de pouvoir les visualiser sous forme graphique.

L’exemple montrait comment obtenir une prévision météo pour 16 locations à 2 intervalles de temps différents mais rien n’empêche de faire une requête pour plus (ou moins) de points avec d’autres intervalles de temps (maximum 96h).

Avec le Garmin InReach qui fonctionne dans le monde entier (car utilisant le système Iridium) pour un prix assez raisonnable, environ 350€ (pour l’InReach mini) et un forfait mensuel acceptable de 59,99€ avec un contrat annuel, ça reste cher mais l'avantage est de bénéficier de la messagerie texte bidirectionnelle illimitée afin de pouvoir communiquer avec ses proches ainsi que d’une sécurité supplémentaire avec le système GEOS.

Les informations météo provenant de World Weather Online nécessitent un abonnement, celui à 5$ par mois suffit amplement et permet jusqu’à 2000 requêtes par mois.

L’application du serveur SMS devra être installé sur un smartphone Android qui sera constamment allumé et branché sur le secteur puisqu’il devra réagir aux requêtes météo d’un ou de plusieurs utilisateurs. Il serait préférable que quelqu’un puisse le redémarrer si nécessaire.

Du côté de l’utilisateur, j’ai déjà programmé 2 applications qui tournent sous Android et IOS, l’une pour coder les requêtes et l’autre pour décoder le ou les messages envoyés en retour par le serveur SMS. Pour Android, j’ai utilisé DroidScript (JavaScript) et pour IOS (iPhone, iPod et/ou iPad), Pythonista (Python). Ce sont des outils incontournables pour tous ceux qui souhaitent programmer des petits trucs sur mesure.

Une fois tous les messages réceptionnés, il suffit de les copier un par un, par ordre chronologique dans un éditeur de texte en les séparant par [ENTER], finalement, copier le tout et lancer l’application de décodage « SMS-decode » sous IOS ou Android.

Le seul problème rencontré dans l’application EarthMate de Garmin (sous IOS et Android), c’est qu’il n’est pas possible de copier les messages mais après longue réflexion, j’ai enfin pu trouver un « work-around », il suffit d’appuyer longuement sur chaque message et de sélectionner « Afficher détails du message » et de choisir « Transférer », là, il est possible de sélectionner et copier le message.

L’application de décodage « SMS-decode » transcrit en texte clair les informations codées pour les locations et heures demandées comme suit :

En même temps, un fichier KML est créé afin de pouvoir visualiser ces informations sous Google-Earth ou toute autre application. Ci-dessus, la visualisation d’un fichier KML sous Google-Earth. Dans cet exemple, les noms des locations sont les prévisions de direction du vent à 12h et 18h :

Je suis encore en train d’effectuer des tests mais tout semble fonctionner parfaitement. Après avoir lancé une requête avec 8 locations et 2 heures de prévision, les 2 premiers SMSs sont arrivés après environ 5 minutes, le dernier SMS est arrivé environ une vingtaine de minutes plus tard, ce n’est pas très rapide mais largement suffisant, je suppose que c’est dû à la position des satellites.

Tout ceci nécessite pas mal d’étapes mais ça fonctionne et surtout, c'est du « sur-mesure » ! Il est évident que l’utilisation de fichiers « grib » est plus confortable et plus riche en informations mais à un coût bien supérieur.

Je compte donc utiliser ce système afin d'obtenir les prévisions météo. Mon départ n'est prévu que pour l'été 2020 mais si quelqu'un souhaite partager le peu de frais, ce serait volontier. Je pense que 2 à 3 personnes par système est un maximum afin de ne pas dépasser les 2000 requêtes mensuelles de worldweatheronline.com.

Pour ceux qui sont intéressés, je suis prêt à fournir le code source de toutes les applications.