English Click this button for the international website

P2000 ontvangen op Raspberry Pi 2 met RTL-SDR

P2000 is het netwerk is opgezet om personeel van de hulpdiensten zoals brandweer, reddingsbrigade, ambulance, politie, Rode Kruis, KNRM te alarmeren. Op talloze websites kun je deze P2000-alarmeringen live meelezen, maar je kunt de berichten ook zelf ontvangen. Hieronder staat beschreven hoe ik dit gedaan heb op een Raspberry Pi 2 in combinatie met een RTL-SDR, oftewel een DVB-T USB-stick met de R820T-chipset. Dit alles werkt overigens ook op een ‘gewone’ PC met Ubuntu of Linux Mint, zie onderaan deze pagina.

P2000
Frequentie: 169,650 MHz
Snelheid 1600 bit/s (2FSK)
Protocol: Motorola FLEX

Update 10 juli 2017:
De [UNK] meldingen (onbekende groepsberichten/group messages) zijn verleden tijd door de code uit deze repository te gebruiken: https://github.com/zanoroy/multimon-ng/. Het onderstaande artikel is aangepast en alles zou nu 100% moeten werken.


Ik heb het vanaf een desktop-PC met Linux Mint op een ‘headless’ Raspberry Pi geinstalleerd: een Raspberry zonder monitor, toetsenbord of muis. Op de Raspberry wordt alleen de netwerkkabel, de DVB-T-stick en de voeding aangesloten.

Raspberry Pi 2 met DVB-T RTL-SDR (R820T)
Raspberry Pi 2 met DVB-T RTL-SDR (R820T)

Getest met:
Raspberry Pi 2
2016-05-27-raspbian-jessie-lite
R820T DVB-T USB

P2000 ontvangen: Raspberry Pi

Allereerst moet je Raspbian downloaden en op een SD-kaartje zetten. Ik gebruik hiervoor de Lite-versie van Raspbian Jessie. Zet de image op een SD-kaarje (ik gebruikte een kaartje van 16GB maar kleiner kan ook) en steek het kaartje in de Raspberry, De USB-stick is nog niet aangesloten. Start de Raspberry en doorloop de gebruikelijke installatiestappen zoals hieronder beschreven.

Mijn Raspberry had na het booten via DHCP het ip-adres 192.168.20.46 gekregen, en vanaf de PC logde ik via SSL in met het de standaard gebruikersnaam (‘pi’) en wachtwoord (‘raspberry’):
ssh [email protected]
Start de configuratie:
sudo raspi-config

P2000 decoderen: raspi-config
raspi-config

Kies optie “1: expand filesystem”.  Daarna rebooten en weer opnieuw inloggen. Dan zoals gebruikelijk de pakketlijsten updaten:
sudo apt-get update
Daarna kun je de vereiste pakketten downloaden (dit kan een paar minuten duren):
sudo apt-get -y install git cmake build-essential libusb-1.0 qt4-qmake libpulse-dev libx11-dev qt4-default
Vervolgens ondersteuning voor de RTL-SDR installeren.

P2000 ontvangen: RTL-SDR

Voer de volgende commando’s uit om de ondersteuning voor de USB-ontvanger te downloaden en te installeren:
mkdir -p ~/src/
cd ~/src/
git clone git://git.osmocom.org/rtl-sdr.git
cd rtl-sdr
mkdir build
cd build
cmake ../ -DINSTALL_UDEV_RULES=ON
make
sudo make install
sudo ldconfig

Sluit nu de DVB-T-stick aan op de Raspberry en test de installatie met het commando:
rtl_test
Waarschijnlijk sluit rtl_test af met een foutmelding:
usb_claim_interface error -6
Failed to open rtlsdr device #0

De standaard drivers van Raspbian zitten in de weg en moeten ge-‘blacklist’ worden.

Bewerk daarvoor het bestand /etc/modprobe.d/raspi-blacklist.conf (is waarschijnlijk nog leeg)
sudo nano /etc/modprobe.d/raspi-blacklist.conf
en voeg er deze 3 regels aan toe:
blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830

Opslaan met CRTL+O (letter O), afsluiten met CTRL+X.

Dan rebooten en opnieuw inloggen:
sudo reboot
Controleer nu opnieuw of de DVB-T-Stick goed werkt met:
rtl_test

rtl_test
rtl_test

Als alles goed werkt sluit je rtl_test af met CTRL+C en kun je nu multimonNG installeren om de FLEX-datastroom van P2000 te decoderen.

P2000 FLEX decoderen: multimon-NG

Voer de volgende commando’s uit om de decoder ‘multimonNG’ te downloaden en te installeren:
cd ~/src/
git clone https://github.com/Zanoroy/multimon-ng.git
cd multimon-ng
mkdir build
cd build
qmake ../multimon-ng.pro
make
sudo make install

Uiteindelijk kun je dan het ontvangen en decoderen van de P2000-meldingen starten met:
rtl_fm -f 169.65M -M fm -s 22050 -p 83 -g 30 | multimon-ng -a FLEX -t raw /dev/stdin

P2000 decoderen: MultimonNG
MultimonNG

Waarbij:

  • -g staat voor de gain, een getal tussen 0-50; weglaten voor automatische gain
  • -p staat voor de specifieke ppm-afwijking van jouw RTL-SDR.

Je kunt aan het einde van die regel -v 1 (of -v 2/-v 3) toevoegen voor meer gedetailleerde output.

P2000 ontvangen en decoderen met een RTL_SDR op een Raspberry Pi
P2000 ontvangen en decoderen met een RTL_SDR op een Raspberry Pi

De uitvoer verwerken in een Python script

Als laatste kunnen we de uitvoer van multimon-ng nog naar een Python-script sturen. Op deze manier kunnen we:

  • de datum en tijd omzetten van UTC naar CET
  • de groepsberichten samenvoegen
  • de weergave met kleuren verduidelijken.

Zet het script in ~/src/ en noem het ‘p2000.py’. Maak het uitvoerbaar met:
chmod +x p2000.py
Installeer dateutil en termcolor:
sudo apt-get install python-dateutil python-termcolor

Vergeet niet deze regel aan te passen naar de waarden van jouw RTL-SRD (-p en -g):
multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 -p 43 -g 30 | multimon-ng -a FLEX -t raw -",

Voer het script uit met:
python p2000.py
Het script is slechts een voorbeeld en verre van perfect. Gebruik het als basis voor je eigen script.

 

#!/usr/bin/python


# P2000 ONTVANGEN OP RASPBERRY PI 2 MET RTL-SDR
# https://nl.oneguyoneblog.com/2016/08/09/p2000-ontvangen-decoderen-raspberry-pi/
#
# vergeet niet deze regel verderop aan te passen aan je eigen RTL-SDR ontvanger (-p en -g):
# multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 -p 43 -g 30 | multimon-ng -a FLEX -t raw -",


import time
import sys
import subprocess
import os
import re
from datetime import datetime
from dateutil import tz
from termcolor import colored

groupidold = ""

def curtime():
    return time.strftime("%H:%M:%S %Y-%m-%d")

with open('error.txt','a') as file:
    file.write(('#' * 20) + '\n' + curtime() + '\n')

multimon_ng = subprocess.Popen("rtl_fm -f 169.65M -M fm -s 22050 -p 43 -g 30 | multimon-ng -a FLEX -t raw -",
                               stdout=subprocess.PIPE,
                               stderr=open('error.txt','a'),
                               shell=True)

try:
    while True:
        line = multimon_ng.stdout.readline()
        multimon_ng.poll()
        if line.__contains__("ALN"):

		if line.startswith('FLEX'):

			flex = line[0:5]
			timestamp = line[6:25]
			melding = line[58:]
			groupid = line[35:41]
			capcode = line[43:52]
		
			regex_prio1 = "^A\s?1|\s?A\s?1|PRIO\s?1|^P\s?1"
			regex_prio2 = "^A\s?2|\s?A\s?2|PRIO\s?2|^P\s?2"
			regex_prio3 = "^B\s?1|^B\s?2|^B\s?3|PRIO\s?3|^P\s?3|PRIO\s?4|^P\s?4"

		if re.search(regex_prio1, melding, re.IGNORECASE):
			priokleur = 'red'
		
		elif re.search(regex_prio2, melding, re.IGNORECASE):
			priokleur = 'yellow'

		elif re.search(regex_prio3, melding, re.IGNORECASE):
			priokleur = 'green'

		else:
			priokleur = 'magenta'

		if groupid == groupidold:

			print colored(capcode, 'white'),

		else:

			utc = datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S')
			utc = utc.replace(tzinfo=tz.tzutc())
			local = utc.astimezone(tz.tzlocal())
			local = local.strftime("%d-%m-%Y %H:%M:%S")
			
			print ' '
			print colored(local,'blue', attrs=['bold']), colored(melding, priokleur,  attrs=['bold']),
			print '                  ',
			print colored(capcode, 'white'),

			groupidold = groupid


except KeyboardInterrupt:
    os.kill(multimon_ng.pid, 9)

Als alles gelukt is ziet de uitvoer van het script er ongeveer zo uit:

P2000 ontvangen op Raspberry Pi 2 met RTL-SDR: multimon-ng naar Python script
P2000 ontvangen op Raspberry Pi 2 met RTL-SDR: multimon-ng naar Python script

P2000 ontvangen en decoderen op Linux Mint, Ubuntu of Debian

Dit artikel gaat over het ontvangen en decoderen van P2000 op een Raspberry Pi met Raspbian. als OS Aangezien Raspbian een fork is van Debian, net als Ubuntu en Linux Mint, werkt het bovenstaande ook op die besturingssystemen. Ik heb zelf bovenstaande werkwijze getest op een PC met Linux Mint 17.3 en daarop werkt alles exact hetzelfde als op een Raspberry Pi 2 of 3 met Debian.

88 Reacties

Voeg een reactie toe

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *