Skip to content

Raspberry Pi Setup

Ssh naar raspberry pi via VPS

ssh -J sam@spirit.cleanmobilityhva.nl -p 2222 pi@localhost

Een nieuwe Raspberry Pi instellen

De raspberry pi maakt gebruik van de spirit.cleanmobilityhva.nl VPS (virtual private server) om een reverse ssh-verbinding op te zetten zodat er altijd een manier is om op afstand in te loggen op de raspberry pi zonder een kabel eraan te hoeven hangen. Zowel de pi als de server gebruiken sleutelauthenticatie om een wachtwoordloze oplossing te bieden.

Raspberry Pi OS installeren

Om het Raspberry Pi OS te installeren is het het makkelijkst om de Raspberry Pi Imager te gebruiken en in het instellingenvenster de volgende instellingen in te stellen:

  • Algemeen
    • Hostnaam: raspberrypi.local
    • Gebruikersnaam: pi
    • Wachtwoord: raspberrypi
    • Tijdzone: Amsterdam
  • Services
    • SSH inschakelen
    • Wachtwoordinlog gebruiken

Wacht vervolgens tot de imager klaar is met het maken van het image op de micro SD-kaart.

Maak verbinding met de raspberry pi via een ethernetkabel met dit commando:

ssh pi@raspberrypy.local
en gebruik dan het eerder ingestelde wachtwoord. Het kan nodig zijn om enkele adapteropties in te stellen om de raspberry pi internet te geven, deze gids is handig voor Windows 10/11.

! Belangrijk !

Doe pas een sudo apt-get update of sudo apt-get upgrade nadat de SIM7600 module werkt.

Modem instellen voor usb-internet

Kijk eerst naar de modem-pcb, er zouden enkele DIP-switches moeten zijn met silkscreen ernaast. Deze DIP-switches stellen de gekozen module in voor de seriële poort, en moeten ingesteld worden voor de module die wordt gebruikt. Momenteel (2025) is de gebruikte module een SIM7600, dus de volgende switches moeten worden omgezet.
SIM7600 switches

Let ook op dat de schakelaar op de SIM7600 module zelf op de juiste positie staat. De schakelaar moet in de "USB" positie staan om via USB te kunnen communiceren. Dit is de standaardpositie, maar het is goed om te controleren of deze niet per ongeluk is veranderd.

Na het instellen van deze switches kan de hat op de raspberry pi worden geplaatst en de meegeleverde usb-naar-usb-stekker worden ingeplugd om de verbinding te maken.

Installeer minicom

sudo apt-get install minicom

Om de SIM7600 module te configureren, moet je eerst de seriële poort activeren die door de module wordt gebruikt. Dit kan gedaan worden met het commando:

sudo raspi-config
Kies dan de optie "Interface Options" en vervolgens "Serial Port". Zet de seriële poort aan en kies ervoor om de console niet te gebruiken. Herstart de Pi na het aanpassen van deze instellingen.

Installeer de benodigde software om de QMI-verbinding te beheren:

sudo apt update
sudo apt install libqmi-utils udhcpc

ModemManager is niet nodig voor deze setup en kan conflicteren met de QMI-verbinding. Schakel het uit:

sudo systemctl stop ModemManager
sudo systemctl disable ModemManager

Maak het configuratiebestand aan:

sudo nano /etc/qmi-network.conf

Plak dit erin (vervang fast.t-mobile.com door de APN van je provider als het geen T-Mobile sim is):

APN=fast.t-mobile.com
DEVICE=/dev/cdc-wdm0
PROXY=yes

Sla op en sluit af (CTRL+O, Enter, CTRL+X).


maak een script aan om de QMI-verbinding te beheren. Dit script zal de modem initialiseren en de netwerkinterface activeren.

sudo nano /usr/local/bin/qmi-connect.sh

Plak dit script:

#!/bin/bash

# Wacht tot modem is geïnitialiseerd
sleep 10

# Zet modem online
qmi-network /dev/cdc-wdm0 stop
qmi-network /dev/cdc-wdm0 start

# Activeer netwerkinterface
ip link set wwan0 up
udhcpc -i wwan0

Maak het script uitvoerbaar:

sudo chmod +x /usr/local/bin/qmi-connect.sh

Maak een systemd service aan om het script automatisch te starten bij het opstarten van de Pi:

sudo nano /etc/systemd/system/qmi-connect.service

Plak dit:

[Unit]
Description=QMI Connect Script
After=network.target

[Service]
ExecStart=/usr/local/bin/qmi-connect.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

Activeer en start de service:

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable qmi-connect.service
sudo systemctl start qmi-connect.service

Herstart de Raspberry Pi om de wijzigingen toe te passen:

sudo reboot

Na het opstarten, controleer of wwan0 een IP-adres heeft:

ip addr show wwan0

Test de verbinding:

ping -I wwan0 8.8.8.8
Je kunt controleren of dit werkt na een herstart met `sudo systemctl status ModemManager`.

SSH-sleutels instellen

Genereer een SSH-sleutel op de Pi

ssh-keygen -t rsa -b 4096 -C "pi-remote-access"
ssh-copy-id sam@spirit.cleanmobilityhva.nl

Test het vervolgens door een ssh-sessie te starten en de knownhost-popup te accepteren

ssh sam@spirit.cleanmobilityhva.nl

Voordat je de Pi op afstand kunt bereiken, moet je een reverse SSH-tunnel opzetten. Dit zorgt ervoor dat je altijd verbinding kunt maken met de Pi, zelfs als deze achter een NAT-router zit.

AutoSSH instellen

Installeer autossh

sudo apt-get install autossh

Kopieer de publieke sleutel van de VPS naar de Pi:

Dit moet handmatig gedaan worden, omdat de Pi geen internetverbinding heeft. Kopieer de inhoud van ~/.ssh/id_rsa.pub op de VPS naar ~/.ssh/authorized_keys op de Pi.

sam@spirit:~$ nano .ssh/id_ed25519.pub
pi@raspberrypi:~ $ nano .ssh/authorized_keys

Test de verbinding

ssh -i ~/.ssh/id_rsa -N -R 2222:localhost:22 sam@spirit.cleanmobilityhva.nl

Vanaf de remote server:

ssh -p 2222 pi@localhost

als je nu verbinding kunt maken met de Pi via de reverse SSH-tunnel. Door Ctrl+C te gebruiken op de raspberry pi terminal, sluit je de verbinding.

Maak een aangepaste systemd service file. Maak bijvoorbeeld een bestand genaamd /etc/systemd/system/ssh-tunnel.service met de volgende inhoud:

sudo nano /etc/systemd/system/autossh-tunnel.service
[Unit]
Description=SSH Reverse Tunnel
After=network-online.target
Wants=network-online.target

[Service]
User=pi
ExecStart=/usr/bin/autossh  -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -N -R 2222:127.0.0.1:22 sam@77.72.144.252
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Herlaad daarna de systemd daemon, activeer en start de service:

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable autossh-tunnel.service
sudo systemctl start autossh-tunnel.service

Controleer de status:

sudo systemctl status autossh-tunnel.service

Deze methode geeft je controle over het opnieuw starten van de service als deze faalt.

Git repository klonen

Installeer git op de Raspberry Pi als het nog niet is geïnstalleerd:

sudo apt-get install git

Voor git te kunnen gebruiken moet je de ssh sleutel van de Pi toevoegen aan je Gitlab account. Dit kan gedaan worden door de publieke sleutel van de Pi te kopiëren naar je Gitlab account. volg deze gitlab gids om dit te doen.

maak een map aan voor het project en ga er naartoe:

mkdir git
cd git

Om de code van het project te klonen, gebruik je het volgende commando:

git clone <repository-url>

Code compilen en PM2 opzetten

Code compileren via Makefile

Om de code te compileren op de Raspberry Pi, kun je een Makefile gebruiken. Dit maakt het proces eenvoudiger en gestandaardiseerd. Zorg ervoor dat je de Makefile in de root van je project hebt staan, en dat deze correct is geconfigureerd om de benodigde bestanden te compileren.

Zorg ervoor dat je de benodigde build-tools hebt geïnstalleerd op de Raspberry Pi. Dit kan gedaan worden met het volgende commando:

sudo apt-get update
sudo apt-get install build-essential gcc make cmake

Voor de code van de wireless logger op de Raspberry Pi, is er een Makefile aanwezig die de benodigde stappen uitvoert om de code te compileren. Daarvoor heb je de volgende dependencies nodig:

  • gcc of g++ voor C/C++ compilatie
  • make voor het uitvoeren van de Makefile
  • paho.mqtt.cpp voor MQTT-functionaliteit

Paho mqtt installeren

Om de Paho MQTT C++ bibliotheek te installeren, kun je de volgende stappen volgen: 1. Installeer de benodigde pakketten:

sudo apt-get install libssl-dev cmake g++ libboost-all-dev

  1. Clone de Paho MQTT C++ repository:

    git clone https://github.com/eclipse/paho.mqtt.cpp
    

  2. Ga naar de directory van de Paho MQTT C++ bibliotheek:

bash cd paho.mqtt.cpp

  1. Initialiseer en update de submodules:

    git submodule init
    git submodule update
    

  2. Maak de build directory aan en compileer de bibliotheek:

    cmake -Bbuild -H. -DPAHO_WITH_MQTT_C=ON -DPAHO_BUILD_EXAMPLES=ON
    sudo cmake --build build/ --target install
    

CAN hardware installeren

Om de CAN hardware te installeren, moet je deze intitalieseren. Volg hiervoor de Preperation for CAN bus sectie bij de documentatie van de waveshare CAN Hat

Om de code te compileren met behulp van een Makefile, volg je deze stappen:

  1. Zorg ervoor dat je een Makefile hebt in de root van je project.

  2. Open een terminal en navigeer naar de map waar de Makefile zich bevindt:

    cd /wireless-logger/raspberrypi
    

  3. Voer het volgende commando uit om de code te compileren:

    make
    

  4. Als de compilatie succesvol is, wordt het uitvoerbare bestand main gegenereerd in dezelfde map. de main bestand kan je uitvoeren met:

    ./main
    

  5. Om de code opnieuw te compileren na wijzigingen, voer je opnieuw het make-commando uit.

  6. Om de code schoon te maken (bijvoorbeeld om objectbestanden te verwijderen), gebruik je:
    make clean
    

PM2 opzetten via de command line

PM2 is een procesmanager voor Node.js-applicaties. Volg deze stappen om PM2 in te stellen:

installeer eerst Node.js en npm als deze nog niet zijn geïnstalleerd. Dit kan gedaan worden met de volgende commando's:

sudo apt-get update
sudo apt-get install nodejs npm
  1. Installeer PM2 als het nog niet is geïnstalleerd:

    sudo npm install -g pm2
    

  2. Start je applicatie met PM2:

    pm2 start ./main
    

  3. Zorg ervoor dat PM2 automatisch opnieuw opstart na een systeemherstart:

    pm2 startup
    
    Volg de instructies die worden weergegeven om de configuratie te voltooien.

  4. Sla de huidige PM2-processen op zodat ze automatisch worden hersteld na een herstart:

    pm2 save
    

  5. Controleer de status van je applicaties:

    pm2 list
    

Met deze stappen kun je eenvoudig je code compileren en je applicatie beheren met PM2.

ModemManager uitschakelen

Tijdens een testdag in Den Helder was er een duidelijk probleem: de 4G-router stopte met verbinden en leek volledig opnieuw op te starten zodra de auto begon te rijden. Stijn heeft de logs bekeken na het incident en het bleek dat de ModemManager op de Raspberry Pi probeerde om de modem te beheren terwijl dit niet nodig was. Omdat de ModemManager-service de modem reset, valt de internetverbinding weg en is deze moeilijk opnieuw op te zetten. Dat dit gebeurde was uiteindelijk te zien in de volgende logs.

NetworkManager log Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5228] dhcp4 (eth1): state changed new lease, address=192.168.225.49 Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5232] policy: set 'Wired connection 2' (eth1) as default for IPv4 routing and DNS Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5330] device (eth1): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'managed') Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5347] device (eth1): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'managed') Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5349] device (eth1): state change: secondaries -> activated (reason 'none', sys-iface-state: 'managed') Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5351] manager: NetworkManager state is now CONNECTED_SITE Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5353] device (eth1): Activation: successful, device activated. Mar 27 14:56:13 raspberrypi NetworkManager[717]: [1743083773.5356] manager: NetworkManager state is now CONNECTED_GLOBAL Mar 27 14:56:16 raspberrypi NetworkManager[717]: [1743083776.2017] manager: startup complete Mar 27 15:07:11 raspberrypi NetworkManager[717]: [1743084431.0592] device (eth1): state change: activated -> unmanaged (reason 'removed', sys-iface-state: 'removed') Mar 27 15:07:11 raspberrypi NetworkManager[717]: [1743084431.0906] dhcp4 (eth1): canceled DHCP transaction Mar 27 15:07:11 raspberrypi NetworkManager[717]: [1743084431.0906] dhcp4 (eth1): activation: beginning transaction (timeout in 45 seconds) Mar 27 15:07:11 raspberrypi NetworkManager[717]: [1743084431.0906] dhcp4 (eth1): state changed no lease Mar 27 15:07:11 raspberrypi NetworkManager[717]: [1743084431.0913] manager: NetworkManager state is now DISCONNECTED Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.0879] manager: (eth1): new Ethernet device (/org/freedesktop/NetworkManager/Devices/7) Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1195] device (eth1): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external') Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1220] settings: (eth1): created default wired connection 'Wired connection 2' Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1225] device (eth1): carrier: link connected Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1229] device (eth1): state change: unavailable -> disconnected (reason 'carrier-changed', sys-iface-state: 'managed') Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1237] policy: auto-activating connection 'Wired connection 2' (9902f514-0112-33c8-b75c-f6600d7de5c2) Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1242] device (eth1): Activation: starting connection 'Wired connection 2' (9902f514-0112-33c8-b75c-f6600d7de5c2) Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1244] device (eth1): state change: disconnected -> prepare (reason 'none', sys-iface-state: 'managed') Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1246] manager: NetworkManager state is now CONNECTING Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1248] device (eth1): state change: prepare -> config (reason 'none', sys-iface-state: 'managed') Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1253] device (eth1): state change: config -> ip-config (reason 'none', sys-iface-state: 'managed') Mar 27 15:07:18 raspberrypi NetworkManager[717]: [1743084438.1258] dhcp4 (eth1): activation: beginning transaction (timeout in 45 seconds) Mar 27 15:07:19 raspberrypi NetworkManager[717]: [1743084439.5204] device (eth1): carrier: link connected Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1108] dhcp4 (eth1): state changed new lease, address=192.168.225.46 Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1113] policy: set 'Wired connection 2' (eth1) as default for IPv4 routing and DNS Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1221] device (eth1): state change: ip-config -> ip-check (reason 'none', sys-iface-state: 'managed') Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1577] device (eth1): state change: ip-check -> secondaries (reason 'none', sys-iface-state: 'managed') Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1580] device (eth1): state change: secondaries -> activated (reason 'none', sys-iface-state: 'managed') Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1583] manager: NetworkManager state is now CONNECTED_SITE Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1586] device (eth1): Activation: successful, device activated. Mar 27 15:07:24 raspberrypi NetworkManager[717]: [1743084444.1591] manager: NetworkManager state is now CONNECTED_GLOBAL Mar 27 15:17:49 raspberrypi NetworkManager[717]: [1743085069.0192] device (eth1): state change: activated -> unmanaged (reason 'removed', sys-iface-state: 'removed')
ModemManager log Mar 27 14:56:09 raspberrypi systemd[1]: Starting ModemManager.service - Modem Manager... Mar 27 14:56:09 raspberrypi ModemManager[731]: ModemManager (version 1.20.4) starting in system bus... Mar 27 14:56:10 raspberrypi systemd[1]: Started ModemManager.service - Modem Manager. Mar 27 14:56:12 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00054000.spi': not supported by any plugin Mar 27 14:56:12 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00100000.ethernet': not supported by any plugin Mar 27 14:56:12 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1': not supported by any plugin Mar 27 14:56:12 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1001100000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1': not supported by any plugin Mar 27 15:07:20 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1': not supported by any plugin Mar 27 15:17:58 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1': not supported by any plugin Mar 27 15:18:15 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1': not supported by any plugin Mar 27 15:18:33 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1': not supported by any plugin Mar 27 15:18:50 raspberrypi ModemManager[731]: [base-manager] couldn't check support for device '/sys/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1': not supported by any plugin