Transmet la pantalla a diversos dispositius a través de la xarxa

Transmet la pantalla a diversos dispositius a través de la xarxa

Vaig tenir la necessitat de mostrar un tauler de control amb monitoratge a diverses pantalles de l'oficina. Hi ha diversos antics Raspberry Pi Model B + i un hipervisor amb una quantitat gairebé il·limitada de recursos.

Aparentment, el Raspberry Pi Model B+ no té prou aleatorietat per mantenir el navegador en execució constant i representar-hi molts gràfics, per la qual cosa passa que la pàgina té errors parcials i sovint es bloqueja.

Hi havia una solució bastant senzilla i elegant, que vull compartir amb vosaltres.

Com sabeu, tots els Raspberries tenen un processador de vídeo força potent, ideal per a la descodificació de vídeo de maquinari. Així que va sorgir la idea de llançar un navegador amb un tauler en un altre lloc i transferir un flux ja fet amb una imatge renderitzada al gerd.

A més, això hauria de tenir una gestió simplificada, ja que en aquest cas tota la configuració es realitzarà en una màquina virtual, que és més fàcil d'actualitzar i de còpia de seguretat.

No més aviat dir que fet.

Part del servidor

Utilitzem llestos Imatge al núvol per a Ubuntu. No requereix cap instal·lació, conté tot el que necessiteu per desplegar ràpidament una màquina virtual i Suport a CloudInit ajuda a configurar instantàniament una xarxa, afegir claus ssh i posar-la en funcionament ràpidament.

Despleguem una nova màquina virtual i primer de tot l'instal·lem en ella Xorg, nodm и caixa de flux:

apt-get update
apt-get install -y xserver-xorg nodm fluxbox
sed -i 's/^NODM_USER=.*/NODM_USER=ubuntu/' /etc/default/nodm

També utilitzarem la configuració de Xorg, amablement concedit ens Diego Ongaro, afegint només una nova resolució 1920 × 1080, ja que tots els nostres monitors l'utilitzaran:

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

Ara instal·larem Firefox, l'executarem com a servei del sistema, així que, d'una banda, escriurem un fitxer d'unitat:

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

Necessitem Xdotool per executar Firefox immediatament en mode de pantalla completa.
Utilitzant el paràmetre -url podeu especificar qualsevol pàgina perquè s'obri automàticament quan s'iniciï el navegador.

En aquesta fase, el nostre quiosc està preparat, però ara hem d'exportar la imatge a través de la xarxa a altres monitors i dispositius. Per fer-ho, utilitzarem les possibilitats Moviment JPEG, un format més utilitzat per transmetre vídeo de la majoria de càmeres web.

Per a això necessitem dues coses: FFmpeg amb mòdul x11 agafar, per capturar imatges de x i streamEye, que el distribuirà als nostres clients:

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 -i :0 -r 1 -f mjpeg -q:v 5 - 2>/dev/null | streameye'

[Install]
WantedBy=graphical.target
EOT

systemctl enable streameye
systemctl start streameye

Com que la nostra imatge no requereix una actualització ràpida, he especificat la freqüència de refresc: 1 fotograma per segon (paràmetre -r 1) i qualitat de compressió: 5 (paràmetre -q:v 5)

Ara intentem anar a http://your-vm:8080/, en resposta veureu una captura de pantalla de l'escriptori que s'actualitza constantment. Genial! —El que calia.

costat del client

Aquí encara és més fàcil, com he dit, utilitzarem el Raspberry Pi Model B +.

En primer lloc, instal·lem-lo Arch Linux ARM, per això seguim instruccions al lloc web oficial.

També haurem d'assignar més memòria per al nostre xip de vídeo, per això editarem /boot/config.txt

gpu_mem=128

Arrenquem el nostre nou sistema i no oblideu inicialitzar l'anell de claus pacman, instal·lar-lo OMXPlayer:

pacman -Sy omxplayer

Sorprenentment, OMXPlayer pot funcionar sense x, de manera que tot el que necessitem és escriure un fitxer d'unitat i executar:

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

Com a paràmetre -b http://your-vm:8080/ estem passant l'URL del nostre servidor.

Això és tot, una imatge del nostre servidor hauria d'aparèixer immediatament a la pantalla connectada. En cas de problemes, el flux es reiniciarà automàticament i els clients es tornaran a connectar.

Com a avantatge, podeu instal·lar la imatge resultant com a salvapantalles a tots els ordinadors de l'oficina. Per això necessitareu MPV и 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

Ara els teus companys estaran molt contents 🙂

Font: www.habr.com

Afegeix comentari