Achterdeur inbouwen in Raspberry Pi en Pi Zero W via bluetooth

Noud van Kruysbergen
0

Inhoudsopgave

Zul je altijd zien: heb je de Raspber­ry Pi net ingebouwd, reageert hij plotseling niet meer. Om de fout op te sporen heb je dan eigenlijk een monitor en toetsenbord nodig. Met onze bluetooth-shell heb je echter genoeg aan een jumpertje om de problemen ter plekke op te lossen met een notebook of tablet. Zo kun je je eigen achterdeur inbouwen voor noodgevallen.

Heb je net de zorgzaam geprepareerde Raspberry Pi ergens aan een apparaat gekoppeld, moet je met een monitor en toetsenbord naar de plek des onheils omdat de Pi plotseling niet meer in het wifinetwerk te zien is. Vaak gaat het om kleinigheden die ertoe leiden dat de mini-computer het even niet meer doet. Het ter plekke zoeken naar de fout is de meest succesvolle manier van werken, maar dat kan ook omslachtig zijn als de Raspberry Pi bijvoorbeeld geen netwerk- of wifiverbinding heeft waarmee je via SSH zou kunnen inloggen.

De bluetooth-adapter van de Raspberry Pi biedt in dat geval een interessante mogelijkheid: hij werkt volkomen onafhankelijk van ethernet en wifi. Met een inlog-console erbij biedt hij een handige achterdeur naar de Pi. Om ervoor te zorgen dat niemand onbevoegd kan inloggen, wordt de bluetooth-shell bij dit project pas geactiveerd als je twee pinnen van de GPIO-header van de Raspberry Pi kortsluit.

Bluetooth achterdeur in Raspberry Pi GPIO jumper bluetooth-shell

Deze bluetooth-shell is met name interessant voor een Raspberry Pi Zero W, die geen ethernetpoort heeft. Omdat toegang via bluetooth normaal gesproken niet actief is en praktisch geen rekenkracht vergt, kun je dit zonder problemen op alle Raspberry Pi’s instellen. Dan hoef je bij bijvoorbeeld wifiproblemen dit alleen nog te activeren via een jumper. Als je haast hebt, kun je simpelweg het pakket btlogind downloaden en op de Raspberry Pi installeren met

sudo dpkg -i btlogind*.deb

Daarmee is de bluetooth-shell al meteen te gebruiken. Je moet wel rekening houden met een paar eigenaardigheden – om die te begrijpen, moet je weten wat er op de achtergrond gebeurt.

Inloggen bij kortsluiting

Het pakket bevat de in Python geprogrammeerde daemon btlogind, die in de map /usr/bin geïnstalleerd wordt. Om ervoor te zorgen dat die bij het booten automatisch mee wordt opgestart, installeert het pakket ook de systemd- service /etc/systemd/system/brlogin.service, wordt die geactiveerd en bij afronden van het configureren ook gestart. Als je de bluetooth-­toegang later permanent wilt uitschakelen, hoef je alleen de systemd-service op de volgende manier te deactiveren:

sudo systemctl disable btlogin
sudo systemctl stop btlogin

De daemon bewaakt standaard pin 5 van de GPIO-aansluiting. Als die pin met massa wordt verbonden, dus bijvoorbeeld kortgesloten met pin 6, dan start de daemon de eerder eveneens geïnstalleerde systemd-service /etc/systemd/system/btconsole.service. Als de jumper weer verwijderd wordt, stopt de daemon met werken. Belangrijk daarbij is dat de daemon reageert op de gebeurtenis ‘bridge restore’ respectievelijk ‘bridge remove’. Dat voorkomt dat de bluetooth-shell continu geactiveerd blijft als je vergeet om de jumper weer te verwijderen. Als je de Raspberry Pi al in kortgesloten toestand gestart hebt, moet je de jumper eerst verwijderen en daarna terugplaatsen om de toegang te activeren.

Omdat de daemon btlogind ervoor verantwoordelijk is dat de service btconsole.service wordt gestart en gestopt, wordt die gedurende het configureren gedeactiveerd met systemctl. Als je de bluetooth-inlogmogelijkheid altijd wilt kunnen gebruiken, moet je de daemon zoals hiervoor beschreven deactiveren en in plaats daarvan de console-service standaard activeren:

sudo systemctl enable btconsole
sudo systemctl start btconsole

Doorlezen is gratis, maar eerst even dit:

Dit artikel is met grote zorg samengesteld door de redactie van c’t magazine – het meest toonaangevende computertijdschrift van Nederland en België. Met zeer uitgebreide tests en praktische workshops biedt c’t de diepgang die je nergens online vindt.

Bekijk de abonnementen   Lees eerst verder

Bluetooth-terminal

In de service btconsole zit het hart van de bluetooth-toegang. Dat start de RFCOMM-daemon, die op kanaal 1 van het standaard bluetooth-device hci0 wacht op binnenkomende seriële bluetooth-verbindingen. Vervolgens wordt met behulp van het modemprogramma mgetty een inlogconsole geopend:

/usr/bin/rfcomm -r watch hci0 1 mgetty
-r -s 115200 /dev/rfcomm0

In dit geval gebruiken we mgetty omdat er met de bij Raspbian standaard geïnstalleerde agetty vaak verbindingsproblemen optraden. Het programma mgetty wordt als afhankelijkheid van btlogind automatisch gedownload en geïnstalleerd uit de Raspbian-repository.

Voordat een andere computer of een tablet een seriële verbinding kan openen, moet het apparaat pairen met de Raspberry Pi. Dat is op zich geen probleem omdat de bluetooth-adapter van de Raspberry Pi 3 en Zero W de Secure Simple Pairing (SSP) al ondersteunt. Daardoor hoef je geen pincode meer in te typen voor het pairen. Dat betekent wel dat je een apparaat moet gebruiken met een voor SSP geschikte bluetooth-adapter versie 2.1 of hoger –bij smartphones en tablets is dat inmiddels al langer het geval.

À propos tablets: Apple-gebruikers hebben hier helaas pech, want iOS staat geen seriële bluetooth-verbindingen toe met apparaten van andere fabrikanten. Je kunt de Raspberry Pi dan niet eens vinden op de lijst van de in de buurt zittende bluetooth-apparaten.

Bluetooth achterdeur in Raspberry Pi shell gtkterm bluetooth-shell

Met de juiste terminal-omgevingsvariabele (zie verderop) kan GTK-Term zelfs gekleurde tekst­omgevingen goed weergeven.

Bij Android zijn dergelijke problemen er niet, daar moet je dan een van de vele terminal-programma’s voor bluetooth installeren om op de Raspberry Pi in te kunnen loggen. De gratis app Serial Bluetooth Terminal van Kai Morich voldoet bijvoorbeeld prima voor het opsporen van fouten.

Om vanaf een Linux-computer in te kunnen loggen, moet je afhankelijk van de bluetooth-adapter en de Linux-distributie eerst nog SSP expliciet activeren. Dat kun je doen met het volgende commando:

sudo hciconfig hci0 sspmode 1

Met hci0 wordt dan het eerste bluetooth-device bedoeld. Als het commando bijvoorbeeld de foutmelding ‘Operation not permitted’ oplevert, is je bluetooth-adapter niet geschikt voor SSP en moet je een nieuwere gebruiken.

Om het MAC-adres van de Raspberry Pi te vinden voor het opbouwen van een verbinding, kun je daar op een andere computer naar zoeken:

hcitool scan

Ten slotte maak je een seriële verbinding met de Raspberry Pi met behulp van rfcomm. Het MAC-adres in het volgende commando moet je dan vervangen door het MAC-adres van je Pi:

rfcomm connect /dev/rfcomm0 89:0A:BC:DE:F1:23 1

Het getal 1 aan het eind van het commando staat voor het kanaal waarop de RFCOMM-daemon van de Raspberry Pi moet wachten op verbindingen – dat moet dus op beide apparaten hetzelfde zijn. De daemon draait overigens net zo lang op de voorgrond als de verbinding met de tegenpool bestaat – en blokkeert daarmee de huidige terminal.

Problemen met ModemManager

Een mogelijk probleem daarbij is de ModemManager, die telefoonmodems en 4G-sticks automatisch configureert met behulp van AT-commando’s. Omdat /dev/rfcomm0 een seriële interface is, denkt de ModemManager op je pc of notebook dat het om een modem gaat, en begint dan AT-commando’s te versturen.

De Raspberry Pi kan daar niets mee beginnen en ze storen bij het inloggen en het intypen van commando’s. Daarom moet je de ModemManager killen (sudo killall ModemManager) of eenmalig vóór het uitvoeren van rfcomm de volgende udev-regel toevoegen in het bestand ­/etc/udev/rules.d/90-rfcomm.rules op je computer:

KERNEL==”rfcomm[0-9]*”, ENV{ID_MM_DEVICE_IGNORE}=”1″

Voor het inloggen heb je bij Linux nog een serieel terminalprogramma nodig. In onze ervaringen is gtkterm, dat in de standaard-repository’s zit van bijna elke Linux-­distributie, daar voor geschikt. Als je het programma hebt gestart, moet je eerst bij het menu-item Configuration onder Port naar de interface /dev/rfcomm0 gaan en als transfersnelheid 115200 baud selecteren. Sluit de configuratie en druk op Enter – dan krijg je meteen de inlogprompt van de Raspberry Pi te zien. Vul daar je gebruikersnaam en het wachtwoord in.

Net zo makkelijk als een SSH-verbinding in een terminal is de seriële verbinding via GTK-Term niet. Programma’s passen hun uitvoer bijvoorbeeld niet automatisch aan het GTK-Term-venster aan, want GTK-Term stuurt de grootteveranderingen niet door. Standaard zijn 80 tekens breed en 25 regels hoog ingesteld.

Je moet het GTK-Term-venster daarom groot genoeg maken, zodat er geen onnodige regelafbrekingen voorkomen – een zwarte rand rechts en beneden stoort in de dagelijkse praktijk minder.

Daarnaast zullen veel programma’s er over klagen dat ze niets weten over de mogelijkheden van de terminal. Daarom moet je als eerste stap de omgevings­variabele TERM instellen:

export TERM=linux

Als dat ingesteld is, kan GTK-Term zelfs overweg met gekleurde tekstomgevingen zoals van de filemanager Midnight Commander en het configuratieprogramma van de Raspberry Pi raspi-config. Op die manier staat niets het makkelijk zoeken naar fouten meer in de weg.

(Mirko Dölle, c’t magazine)

Vind meer workshops en info over de Raspberry Pi in Het Ultieme Raspberry Pi Handboek 2019

Deel dit artikel

Noud van Kruysbergen
Noud van KruysbergenNoud heeft de 'American Dream' doorlopen van jongste bediende tot hoofdredacteur van c't, waar hij zo veel mogelijk de diepgang, betrouwbaarheid en diversiteit wil bewaken.

Lees ook

Spotify streamen naar versterker? Zo doe je het met een Raspberry Pi!

Om Spotify te kunnen streamen naar een niet-smart AV-receiver of analoge versterker die geen muziek-streaming­mogelijkheden heeft, heb je met een Rasp...

Google Gemini gebruiken: dit kun je allemaal met de chatbot van Google

Eerst kon je alleen ChatGPT gebruiken, maar nu is het ook mogelijk om Gemini van Google te gebruiken. Beide chatbots die gebaseerd zijn op AI kunnen w...

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er