dimanche 24 juin 2018

Script Pocsag vers fichier texte

Malgré le manque de temps en ce moment et comme le pocsag revient au goût du jour, avec le dapnet notamment, je me suis fait un petit script en python qui pourra devenir évolutif avec le temps. Pour l'instant, il récupère les données via la clé rtl-sdr puis place le tout dans un fichier en prenant soin de ne garder que l'essentiel. 
J'ai commencé par les pocsag des pompiers en VHF basse, à savoir le 85.955 Mhz mais en allant modifier la fréquence et le ppm de la clé, il est possible de décoder le réseau E-message sur 466 ou autre.
Les indispensables : 
Python  => 2.7 : https://www.python.org/

Voici donc le script en question :
#!/usr/bin/python
#coding: utf-8

import os
import sys, getopt
import subprocess
import collections
import time

print "***********************************"
print "*                                 *"
print "* Décodage pocsag Sapeur-Pompiers *"
print "*                                 *"
print "***********************************"

# creation d'une variable qui va stocker tous les messages identiques
ident = collections.deque(maxlen=10)
#on efface l'écran
os.system("clear")
# on lance le programme multimon ( on converti au bon format pour multimon via sox )
flux = "rtl_fm -f 85.955e6 -M fm -s 200000 -r 48000 -p 66 - | sox -traw -r48000 -es -b16 -c1 -v1 - -traw -es -b16 -c1 -r 22050 - | multimon-ng -a POCSAG512 -f alpha -t raw /dev/stdin -"
# on affiche la commande du programme
print flux
# on lance le traitement du programme
mm  = subprocess.Popen(flux,shell=True,stdout=subprocess.PIPE)
# dès qu'un message est reçu, il est traité
while mm.poll() is None:
  msg = mm.stdout.readline()
# si le message ne contient aucun texte, rien ne se passe
  if "Alpha: " not in msg:
   continue  
# sinon on continue la procédure
# on enlève tous les messages contenant des NUL ou vides
  msg = msg.replace("<NUL>", "")
# on récupère le message seul situé après la balise Alpha
  msg = msg.split("Alpha:",1)[1]
# on supprime l'espace devant le message
  msg = msg.strip()
# Si le message fait moins de 3 caractères, rien ne se passe
  if len(msg)<3:
   continue
# sinon on continue
# on vérifie que le message n'est pas déjà passé en comparant les 15 derniers caratères à notre variable ident
  if msg[-15:] in ident:
# si les caractères sont déjà présent, rien ne se passe
   continue
# sinon
# on va stocker les 15 derniers caractères du message dans notre variable
  ident.append(msg[-15:])
# on affiche notre message
  print msg
# on ouvre notre fichier poc.txt en mode ajout de texte
  fichier = open("poc.txt", "a")
# on écrit le message reçu
  fichier.write(msg+"\n")
# on referme notre fichier
  fichier.close() 
# et on revient au début du traitement 
Avant toute chose, il est important de créer dans le répertoire ou le script sera sauvegardé, un fichier vide nommé poc.txt . En rouge dans le script, se trouve la fréquence d'écoute et le ppm de la clé, à modifier à votre convenance.

En considérant que le script est sauvegardé sous le nom de pager.py , pour le lancer, on ouvre un terminal et l'on va entrer la commande :
> python pager.py
Le fichier poc.txt se remplira alors par le décodage effectué par multimon-ng

(112DEPART) VSAV 01 / CHUTE D'UNE PERSONNE DE - 3 M(112DEPART) DECLENCHEMENT SYSTEMATIQUE DEPART : VSAV 01 - CHUTE D'UNE PERSONNE DE - 3 M (ANNECY - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
(800DEPART) VLM 02 / DIFFICULTE RESPIRATOIRE SEVERE
(198DEPART) VTU HR 01
(800DEPART) DECLENCHEMENT SYSTEMATIQUE DEPART : VLM 02
(198DEPART) 282DEPART
(198DEPART) DECLENCHEMENT SYSTEMATIQUE DEPART : VSAV 01
(112DEPART) VSAV 01 / MALADIE
(112DEPART) DECLENCHEMENT SYSTEMATIQUE DEPART : VSAV 01 - MALADIE (EPAGNY METZ-TESSY - ***************************** ) 

les adresses sont volontairement enlevées 

On pourra très bien envisagé par la suite, l'envoi des données, non pas vers un fichier mais ver un téléphone via un sms (via la commande urllib.urlopen ) ou vers une adresse mail ...

Petit rappel, gardez les décodages pour vous et ne les divulguez pas  :)