Inhaltsverzeichnis
Software
Das Nanopi-Terminal verwendet als Betriebssystem Armbian.
Probleme mit Wifi: Manchmal erscheint die Konfiguration für Wifi nicht in armbian-config
- brcmfmac4356-sdio.bin
- brcmfmac4356-sdio.txt
- BCM4356A2.hcd
passend ersetzen.
Kopierte Dateien:
- Netzwerkverbindungen in /etc/NetworkManager/system-connections
- Dateien in /opt/ (start_blescan.sh, start_kiosk.sh, switch.sh, .twinkle)
- Dateien /home/kiosk/ (anruf_annehmen.sh, ble_scan, gpio_buttontest)
- Content /var/www/html
- Udev-Rule in /etc/udev/rules.d/80-jitsi.rules
Test der Temperatur: armbianmonitor -m
- sudo apt update
- sudo apt upgrade
- sudo apt dist-upgrade
- sudo apt install xorg xserver-xorg-legacy openbox chromium xdotool unclutter lighttpd twinkle swaks bluez php-cgi php7.3-gd
- sudo lighty-enable-mod fastcgi-php
- sudo nano -w /etc/X11/Xwrapper.config
allowed_users=anybody needs_root_rights=yes
- sudo nano /opt/kiosk.sh
#!/bin/sh touch /tmp/kiosk.status chmod 666 /tmp/kiosk.status touch /tmp/switch.status chmod 666 /tmp/switch.status sleep 10 xset s noblank xset s 300 openbox-session & unclutter -grab -visible & if ! lsusb | grep "1bcf:2284" > /dev/null then startadresse="https://www.kinasen.de/wetteruebersicht.php" echo 2 > /tmp/switch.status else echo 1 > /tmp/switch.status startadresse="URL_JITSI" fi chromium --no-first-run --lang=de-DE --kiosk --agc-startup-min-volume=255 --compensate-for-unstable-pinch-zoom --disable-pinch --disable-translate --disable-suggestions-service --disable-save-password-bubble --start-maximized --disable-session-crashed-bubble --disk-cache-dir=/tmp/kioskcache --disk-cache-size=1 $startadresse
- sudo chmod 755 /opt/kiosk.sh
- sudo nano /etc/systemd/system/kiosk.service
[Unit] Description=Starte Chromium Kiosk [Service] Type=oneshot User=kiosk ExecStart= /usr/bin/startx /etc/X11/Xsession /opt/start_kiosk.sh [Install] WantedBy=multi-user.target
- sudo systemctl daemon-reload
- sudo systemctl enable kiosk
- sudo reboot
dbus-x11
Steuerung der Kiosk-Anzeige
Um die von Chromium im Kiosk-Mode (keine Adresszeile) dargestellte URL wechseln zu können musste etwas improvisiert werden. Alle genutzten Webseiten binden Javascript ein, welches die neu URL nach Eingabe einer Tastenkombination aufruft. Diese Javascriptdatei und einige der anzeigbaren Seiten werden vom lokalen Webserver (lighttpd, localhost) geliefert.
var intervalPing = setInterval(function(){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() {}; xhr.open('GET', 'http://localhost/ping.php'); xhr.send(); }, 5000); var tasten=[0,0,0]; function keys(key) { if (!key){ key = event; key.which = key.keyCode; } tasten[0]=tasten[1]; tasten[1]=tasten[2]; tasten[2]=String.fromCharCode(key.which); switch(tasten.join('')){ // Taste y: case "Y1X": location.href = "JITSI_URL"; break; case "Y2X": location.href = "https://www.kinasen.de/wetteruebersicht.php"; break; case "Y3X": location.href = "https://www.kinasen.de/gartenbilder.php"; break; case "Y4X": location.href = "http://localhost/lexikon.php"; break; case "Y5X": var path=window.location.pathname; if (path=="/anrufen.php") { telefonstatus(); break; } else { location.href = "http://localhost/anrufen.php?incoming=1"; break; } } } document.onkeyup = keys;
Soll ein Jitsi-Server eingebunden werden so muss nach fast jedem Update auf diesem das Javascript neu eingebunden werden.
/usr/share/jitsi-meet/index.html
Da an der Anzeige keine Tastatur verbaut wurde erfolgt die Umschaltung der Seiten durch Taster. Diese rufen jeweils ein Script auf, welches die Tastatureingabe im Chromium mittels xdotool simuliert. Um direkt in die festgelegte Jitsi-Konferenz zu schalten wird das entsprechende Script durch eine UDEV-Regel beim Anstecken oder Entfernen der Kamera ausgelöst.
/opt/switch.sh
#!/bin/bash zahl_telefon=5 zahl_max=5 if [ $# -ne 1 ] then echo "kein parameter" exit fi if [ $1 -eq 99 ] then export DISPLAY=":0" export XAUTHORITY=/home/kiosk/.Xauthority xdotool getactivewindow xdotool key "ctrl+F5" exit fi if [ $1 -gt -1 ] && [ $1 -lt 10 ] then if ps ax | grep [c]hromium > /dev/null then if ! ps ax | grep [/]bin/sh /opt/switch.sh > /dev/null then if [ $1 -eq 0 ] # Taster gedrückt, durchschalten then taste=$(cat /tmp/switch.status) taste=$(($taste+1)) if [ $taste -eq $zahl_telefon ] then if cat /tmp/twinkle.log | grep "registration succeeded" > /dev/null then echo "registration succeeded" > /tmp/twinkle.log else taste=$(($taste+1)) fi fi if [ $taste -gt $zahl_max ] then taste=2 fi else taste=$1 fi echo "$taste" > /tmp/switch.status export DISPLAY=":0" export XAUTHORITY=/home/kiosk/.Xauthority xdotool getactivewindow; xdotool mousemove 100 200; xdotool key y; xdotool key "$taste"; xdotool key x sleep 1 fi fi fi
UDEV Rule für Kamera
/etc/udev/rules.d/80-jitsi.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="2284", RUN+="/bin/su USER -c '/bin/sh /opt/switch.sh 1'" ACTION=="remove", SUBSYSTEM=="usb", ATTRS{idVendor}=="1bcf", ATTRS{idProduct}=="2284", RUN+="/bin/su USER -c '/bin/sh /opt/switch.sh 2'"
GPIO für Tasten
GPIO 150, entspricht Pin 23 der Pinleiste GPIO2(GPIO4_C6/PWM1(3V))
Pullup 10k nach 3,3V Pin 1 Pinleiste GPIO1
Zur Abfrage des Tasters läuft ein Programm (C) und ruft bei Flankenerkennung ein Bash-Script (/opt/switch.sh 3) auf. Dieses simuliert wiederum eine Tastatureingabe (y 3 6) im Browser.
Telefonfunktion
Twinkle als automatisch gestarteter CLI Prozess beim Booten ist etwas tricky. Unter Nutzung des Fenstermanagers screen wird er SIP-Client als systemd Service phone gestartet.
[Unit] Description=Start SIP Client [Service] Type=forking User=kiosk ExecStartPre=sleep 10 ExecStartPre=pactl set-source-volume USB_in 100% ExecStartPre=touch /tmp/twinklestatus.txt ExecStartPre=chmod 666 /tmp/twinklestatus.txt ExecStart=screen -d -U -L -Logfile /tmp/twinkle.log -m twinkle -c ExecStop=screen -p 0 -X stuff "quit^M" RestartSec=15 Restart=always [Install] WantedBy=multi-user.target
Bluetooth LE Scan
Hier wird Bluetooth LE zur Anwesenheitserkennung z.B. zum Einschalten von Lampen genutzt. Start als systemd service bluetoothLE.
[Unit] Description=Startet Scan nach Bluetooth LE Geräten After=bluetooth.target [Service] Type=oneshot ExecStart=/home/kiosk/ble_scan > /dev/null 2>&1 & [Install] WantedBy=multi-user.target
ble_scan.c benötigt zum compilieren apt-get install libncurses5-dev libbluetooth-dev
swaks –to ZIELMAILADRESSE -s MAILSERVER:PORT -au BENUTZERNAME -ap „PASSWORT“
Ist in ble_scan eincompiliert zur Benachrichtigung.
GPIO Tasteneingabe
Das Programm zum Überwachen der Tasten-GPIOs und das Ausschalten der blinkenden grünen LED wird über /etc/rc.local gestartet
echo 0 > /sys/class/leds/status_led/brightness echo none > /sys/class/leds/status_led/trigger /home/USER/gpio_buttontest 150 > /dev/null 2>&1 &
Display Standby
sudo nano /etc/X11/xorg.conf.d/01-armbian-defaults.conf
Option "StandbyTime" "5"
Während eines Anrufes soll das Display nicht abgeschalten werden. Ein Cronjob checkt regelmäßig welche Seite derzeit im Browser gezeigt wird und simuliert dann mit XDOtool eine Mausbewegung.
Kiosk Ping
Es kommt vor, dass für den Kiosk keine Internetverbindung besteht und Chromium dann eine Fehlermeldung zeigt. Um diesen Zustand zu beheben ruft auf allen Seiten ein Javascript alle 5 Sekunden ein Script auf. Bleibt dieser „Ping“ aus so wird das neu laden der Internetseite im Chromium veranlasst.
Benachrichtigung Ein- und Ausschalten
Description=Sending Alert Emails on System shutdown. Requires=network.target Before=shutdown.target reboot.target [Service] Type=oneshot User=kiosk RemainAfterExit=true ExecStart=/home/kiosk/alert.sh startup ExecStop=/home/kiosk/alert.sh shutdown [Install] WantedBy=multi-user.target