
Ich musste Dashboards mit Überwachung auf mehreren Bildschirmen im Büro anzeigen. Es gibt mehrere alte Raspberry Pi Model B + und einen Hypervisor mit einer nahezu unbegrenzten Anzahl von Ressourcen.
Anscheinend hat das Raspberry Pi Model B + nicht genug Zufälligkeit, um den Browser ständig laufen zu lassen und eine große Anzahl von Grafiken darin zu zeichnen, weshalb die Seite teilweise fehlerhaft ist und häufig abstürzt.
Es gab eine ziemlich einfache und elegante Lösung, die ich mit Ihnen teilen möchte.
Wie Sie wissen, verfügen alle Raspberry über einen ziemlich leistungsstarken Videoprozessor, der sich hervorragend für die Hardware-Videodecodierung eignet. So kam die Idee auf, einen Browser mit einem Dashboard an einer anderen Stelle zu starten und den fertigen Stream mit dem gerenderten Bild auf die Himbeere zu übertragen.
Darüber hinaus sollte die Verwaltung vereinfacht werden, da in diesem Fall die gesamte Konfiguration auf einer virtuellen Maschine durchgeführt wird, die einfacher zu aktualisieren und zu sichern ist.
Kaum gesagt als getan.
Serverseite
Wir werden ein fertiges Cloud Image für Ubuntu verwenden . Ohne Installation muss alles enthalten sein, was Sie für die schnelle Bereitstellung einer virtuellen Maschine benötigen. Mithilfe der Cloud-Init-Unterstützung können Sie Ihr Netzwerk sofort konfigurieren, SSH-Schlüssel hinzufügen und es schnell in Betrieb nehmen.
Wir stellen eine neue virtuelle Maschine bereit und installieren zunächst Xorg , Nodm und Fluxbox darauf:
apt-get update apt-get install -y xserver-xorg nodm fluxbox sed -i 's/^NODM_USER=.*/NODM_USER=ubuntu/' /etc/default/nodm
Wir verwenden auch die Xorg-Konfiguration , die uns freundlicherweise von Diego Ongaro zur Verfügung gestellt wurde, und fügen nur die neue Auflösung 1920 x 1080 hinzu , da alle unsere Monitore sie verwenden werden:
cat > /etc/X11/xorg.conf <<\EOT Section "Device" Identifier "device" Driver "vesa" EndSection Section "Screen" Identifier "screen" Device "device" Monitor "monitor" DefaultDepth 16 SubSection "Display" Modes "1920x1080" "1280x1024" "1024x768" "800x600" EndSubSection EndSection Section "Monitor" Identifier "monitor" HorizSync 20.0 - 50.0 VertRefresh 40.0 - 80.0 Option "DPMS" EndSection Section "ServerLayout" Identifier "layout" Screen "screen" EndSection EOT systemctl restart nodm
Installieren Sie jetzt Firefox, wir starten es als Systemdienst und schreiben gleichzeitig eine Unit-Datei dafür:
apt-get install -y firefox xdotool cat > /etc/systemd/system/firefox.service <<\EOT [Unit] Description=Firefox After=network.target [Service] Restart=always User=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/usr/bin/firefox -url 'http://example.org/mydashboard' ExecStartPost=/usr/bin/xdotool search --sync --onlyvisible --class "Firefox" windowactivate key F11 [Install] WantedBy=graphical.target EOT systemctl enable firefox systemctl start firefox
Wir brauchen Xdotool, um Firefox direkt im Vollbildmodus auszuführen.
Mit dem Parameter -url
können -url
eine beliebige Seite angeben, die beim Start des Browsers automatisch geöffnet wird.
Zu diesem Zeitpunkt ist unser Kiosk bereit, aber jetzt müssen wir das Bild über das Netzwerk auf andere Monitore und Geräte exportieren. Dazu verwenden wir die Funktionen von Motion JPEG , einem Format, das am häufigsten zum Streamen von Videos von den meisten Webkameras verwendet wird.
Dazu benötigen wir zwei Dinge: FFmpeg mit dem x11grab- Modul, um Bilder von X und streamEye aufzunehmen , die es an unsere Kunden verteilen:
apt-get install -y make gcc ffmpeg cd /tmp/ wget https://github.com/ccrisan/streameye/archive/master.tar.gz tar xvf master.tar.gz cd streameye-master/ make make install cat > /etc/systemd/system/streameye.service <<\EOT [Unit] Description=streamEye After=network.target [Service] Restart=always User=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/bin/sh -c 'ffmpeg -f x11grab -s 1920x1080 -r 1 -i :0 -f mjpeg -q:v 5 - 2>/dev/null | streameye' [Install] WantedBy=graphical.target EOT systemctl enable streameye systemctl start streameye
Da für unser Bild keine schnelle Aktualisierung erforderlich ist, habe ich die Aktualisierungsrate angegeben: 1 Bild pro Sekunde (Parameter -r 1
) und die Komprimierungsqualität: 5 (Parameter -q:v 5
).
Jetzt versuchen wir, zu http: // your-vm: 8080 / zu wechseln. Als Antwort sehen Sie einen ständig aktualisierten Screenshot des Desktops. Großartig! - das war es, was gebraucht wurde.
Client-Teil
Hier ist es noch einfacher, wie gesagt, wir werden das Raspberry Pi Model B + verwenden.
Installieren Sie zunächst Arch Linux ARM darauf. Befolgen Sie dazu die Anweisungen auf der offiziellen Website.
Wir müssen auch mehr Speicher für unseren Videochip reservieren, dafür werden wir in /boot/config.txt
bearbeiten
gpu_mem=128
Starten Sie unser neues System und denken Sie daran, den Pacman-Schlüsselring zu initialisieren. Installieren Sie OMXPlayer :
pacman -Sy omxplayer
Bemerkenswerterweise kann OMXPlayer ohne Xs arbeiten. Deshalb müssen wir nur eine Unit-Datei dafür schreiben und ausführen:
cat > /etc/systemd/system/omxplayer.service <<\EOT [Unit] Description=OMXPlayer Wants=network-online.target After=network-online.target [Service] Type=simple Restart=always ExecStart=/usr/bin/omxplayer -r --live -b http://your-vm:8080/ --aspect-mode full [Install] WantedBy=multi-user.target EOT systemctl enable omxplayer systemctl start omxplayer
Als Parameter -b http://your-vm:8080/
wir die URL von unserem Server.
Das ist alles, ein Bild von unserem Server sollte sofort auf dem verbundenen Bildschirm erscheinen. Bei Problemen wird der Stream automatisch neu gestartet und die Clients stellen erneut eine Verbindung her.
Als Bonus können Sie das resultierende Bild als Bildschirmschoner für alle Computer im Büro festlegen. Dazu benötigen Sie MPV und XScreenSaver :
mode: one selected: 0 programs: \ "Monitoring Screen" mpv --really-quiet --no-audio --fs \ --loop=inf --no-stop-screensaver \ --wid=$XSCREENSAVER_WINDOW \ http://your-vm:8080/ \n\ maze -root \n\ electricsheep --root 1 \n\
Jetzt werden sich Ihre Kollegen sehr freuen :)