Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Verbinden met ZeroMQ

De meeste datafeeds van het NDOV Loket zijn ontsloten via het ZeroMQ protocol. Dit protocol maakt het mogelijk om een PubSub verbinding op te zetten, zodat je data automatisch gepusht krijgt zonder constant zelf nieuwe data op te hoeven halen. Voor deze basis tutorial zullen we gebruik maken van de programmeertaal Python met de PyZMQ library.

Allereerst moeten we er voor zorgen dat Python en PyZMQ geïnstalleerd zijn. In deze tutorial doen we dit via de package manager uv, maar dit kan ook met een andere package manager naar keuze.

  1. Volg de installatiestappen van uv voor jouw besturingssysteem.

  2. Installeer Python via uv en maak een project:

uv python install --default
uv init ndovzeromq
cd ndovzeromq
  1. Installeer vervolgens de PyZMQ library:
uv add pyzmq
  1. Open main.py in een code editor naar keuze. Vervang de standaard code met onderstaande code-snippet:
#!/usr/bin/env python3

# Imports
from gzip import GzipFile
from io import BytesIO
import time
import zmq

# Maak de nieuwe subscriber socket aan
context = zmq.Context()
subscriber = context.socket(zmq.SUB)

# Verbind met NDOV Loket
subscriber.connect("{SERVER}")

# Vertel de server welke data je allemaal wil ontvangen.
# `/` is een wildcard die er voor zorgt dat je alle data ontvangt.
subscriber.setsockopt_string(zmq.SUBSCRIBE, "/")

# Ontvang alle data en loop door de nieuwe berichten
while True:
    multipart = subscriber.recv_multipart()

    # Berichten ontstaan uit 2 delen, het adres en de inhoud
    address = multipart[0].decode('UTF-8')

    # Om dataverkeer te besparen wordt alle inhoud gecomprimeerd met gzip,
    # dit moeten we dus handmatig decomprimeren
    try:
        contents = b''.join(multipart[1:])
        contents = GzipFile('','r',0,BytesIO(contents)).read()
        contents = contents.decode('UTF-8')

        # Print de tijd, het adres en de inhoud naar je terminal
        print(int(time.time()), address, contents)

    except UnicodeDecodeError:
        print("Error bij decoderen")
        raise
        pass
    except:
        print("Error bij decomprimeren")
        raise
        pass


# Sluit de verbinding netjes af
subscriber.close()
context.term()
  1. Vervang {SERVER} door de gewenste ZeroMQ server:
DatafeedAdresDoel
BISON KV6 / KV15 / KV17tcp://pubsub.besteffort.ndovloket.nl:7658Verschillende bus-tram-metro data
BISON KV7/8 Turbotcp://pubsub.besteffort.ndovloket.nl:7817Geplande en actuele reisinformatie bus-tram-metro
NS InfoPlustcp://pubsub.besteffort.ndovloket.nl:7664Verschillende trein data
SIRItcp://pubsub.besteffort.ndovloket.nl:7666Nieuwe standaard voor geplande en actuele reisinformatie

Voor gebruikers die deze databronnen in productie willen gebruiken is een aparte versie beschikbaar met een SLA. Neem contact op met het loket om hier toegang tot te krijgen.

Let op: voor NDOV gebruikers is maximaal één actieve verbinding per datafeed toegestaan. Om meerdere projecten te ontsluiten kunnen datafeeds lokaal herdistribueert worden via universal-sub-pubsub.

  1. Start het Python script:
uv run main.py

Als de verbinding succesvol is ontvang je nu alle berichten op de gekozen ZeroMQ server.

Krijg je fouten in je terminal? In onze Discord kunnen we je vast verder helpen.