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/
Multimon-ng : https://github.com/EliasOenal/multimon-ng
Voici donc le script en question :
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.#!/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
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 :)