Strøm skjermen til flere enheter over nettverket

Strøm skjermen til flere enheter over nettverket

Jeg hadde et behov for å vise et dashbord med overvåking på flere skjermer på kontoret. Det er flere gamle Raspberry Pi Model B+ og en hypervisor med en nesten ubegrenset mengde ressurser.

Tilsynelatende har Raspberry Pi Model B+ ikke nok tilfeldighet til å holde nettleseren konstant i gang og gjengi mye grafikk i den, på grunn av dette skjer det at siden er delvis buggy og ofte krasjer.

Det var en ganske enkel og elegant løsning, som jeg vil dele med dere.

Som du vet, har alle bringebær en ganske kraftig videoprosessor, som er flott for maskinvarevideodekoding. Så ideen kom opp om å lansere en nettleser med dashbord et annet sted, og overføre en ferdig strøm med et gjengitt bilde til bringebæret.

I tillegg burde dette ha forenklet administrasjonen, siden i dette tilfellet vil all konfigurasjon utføres på én virtuell maskin, som er enklere å oppdatere og sikkerhetskopiere.

Ikke før sagt enn gjort.

Server del

Vi bruker klar Cloud Image for Ubuntu. Den krever ingen installasjon, den inneholder alt du trenger for raskt å distribuere en virtuell maskin, og CloudInit-støtte hjelper deg med å sette opp et nettverk umiddelbart, legge til ssh-nøkler og raskt sette det i drift.

Vi distribuerer en ny virtuell maskin og først og fremst installerer den på den xorg, nodm и fluksboks:

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

Vi vil også bruke konfigurasjonen for Xorg, vennligst gitt us Diego Ongaro, legger bare til en ny oppløsning 1920 × 1080, siden alle våre skjermer vil bruke det:

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

Nå skal vi installere Firefox, vi vil kjøre den som en systemtjeneste, så for en ting vil vi skrive en enhetsfil for den:

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

Vi trenger Xdotool for å kjøre firefox umiddelbart i fullskjermmodus.
Bruker parameter -url du kan spesifisere hvilken som helst side slik at den åpnes automatisk når nettleseren starter.

På dette stadiet er kiosken vår klar, men nå må vi eksportere bildet over nettverket til andre skjermer og enheter. For å gjøre dette vil vi bruke mulighetene Motion JPEG, et format som oftere brukes til å streame video fra de fleste webkameraer.

Til dette trenger vi to ting: FFmpeg med modul x11 grip, for å ta bilder fra X-er og streamEye, som vil distribuere den til våre kunder:

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

Siden bildet vårt ikke krever en rask oppdatering, spesifiserte jeg oppdateringsfrekvensen: 1 bilde per sekund (parameter -r 1) og komprimeringskvalitet: 5 (parameter -q:v 5)

La oss nå prøve å gå til http://your-vm:8080/, som svar vil du se et konstant oppdatert skjermbilde av skrivebordet. Flott! – det som måtte til.

Klient side

Det er fortsatt enklere her, som jeg sa, vi vil bruke Raspberry Pi Model B+.

Først av alt, la oss installere det ArchLinux ARM, for dette følger vi instruksjoner på det offisielle nettstedet.

Vi må også tildele mer minne til videobrikken vår, for dette vil vi redigere inn /boot/config.txt

gpu_mem=128

La oss starte opp vårt nye system og ikke glem å initialisere pacman-nøkkelringen, installer OMXPlayer:

pacman -Sy omxplayer

Bemerkelsesverdig nok kan OMXPlayer fungere uten X, så alt vi trenger er å skrive en enhetsfil for den og kjøre:

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

Som en parameter -b http://your-vm:8080/ vi sender url fra serveren vår.

Det er alt, et bilde fra serveren vår skal umiddelbart vises på den tilkoblede skjermen. Hvis det oppstår problemer, vil strømmen automatisk startes på nytt og klienter kobler seg til den igjen.

Som en bonus kan du installere det resulterende bildet som en skjermsparer på alle datamaskiner på kontoret. For dette trenger du 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

Nå blir kollegene dine veldig glade 🙂

Kilde: www.habr.com

Legg til en kommentar