Perduokite ekraną į kelis įrenginius tinkle

Perduokite ekraną į kelis įrenginius tinkle

Man teko rodyti prietaisų skydelį su stebėjimu keliuose biuro ekranuose. Yra keletas senų Raspberry Pi Model B + ir hipervizorius su beveik neribotu išteklių kiekiu.

Matyt, Raspberry Pi Model B+ neužtenka atsitiktinumo, kad naršyklė nuolat veiktų ir joje atvaizduotų daug grafikos, dėl to nutinka taip, kad puslapis iš dalies būna bugiškas ir dažnai sugenda.

Buvo gana paprastas ir elegantiškas sprendimas, kuriuo noriu su jumis pasidalinti.

Kaip žinote, visos Raspberry turi gana galingą vaizdo procesorių, kuris puikiai tinka aparatinei vaizdo dekodavimui. Taigi kilo mintis kur nors kitur paleisti naršyklę su prietaisų skydeliu, o paruoštą srautą su atvaizduotu paveikslėliu perkelti į avietę.

Be to, tai turėtų supaprastinti valdymą, nes tokiu atveju visa konfigūracija bus atliekama vienoje virtualioje mašinoje, kurią lengviau atnaujinti ir sukurti atsarginę kopiją.

Ne anksčiau pasakyta, nei padaryta.

Serverio dalis

Mes naudojame paruoštą „Cloud Image“, skirtas „Ubuntu“.. Nereikalaujantis diegimo, jame yra viskas, ko reikia norint greitai įdiegti virtualią mašiną ir „CloudInit“ palaikymas padeda akimirksniu nustatyti tinklą, pridėti ssh raktus ir greitai pradėti jį naudoti.

Diegiame naują virtualią mašiną ir pirmiausia ją įdiegiame joje Xorg, nom и „fluxbox“:

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

Taip pat maloniai naudosime Xorg konfigūraciją suteikta mums Diego Ongaro, pridedant tik naują rezoliuciją 1920 × 1080, nes jį naudos visi mūsų monitoriai:

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

Dabar įdiegsime „Firefox“, paleisime kaip sisteminę paslaugą, todėl viena vertus, parašysime jai vienetinį failą:

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

Mums reikia „Xdotool“, kad „Firefox“ būtų paleista iš karto viso ekrano režimu.
Naudojant parametrą -url galite nurodyti bet kurį puslapį, kad jis būtų atidarytas automatiškai, kai paleidžiama naršyklė.

Šiame etape mūsų kioskas yra paruoštas, bet dabar turime eksportuoti vaizdą per tinklą į kitus monitorius ir įrenginius. Norėdami tai padaryti, pasinaudosime galimybėmis Judesio JPEG, formatą, kuris dažniau naudojamas srautiniam vaizdo įrašų perdavimui iš daugumos internetinių kamerų.

Tam mums reikia dviejų dalykų: FFmpeg su moduliu x11 grab, skirtas fotografuoti iš x ir streamEye, kuri platins ją mūsų klientams:

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

Kadangi mūsų nuotraukai nereikia greito atnaujinimo, nurodžiau atnaujinimo dažnį: 1 kadras per sekundę (parametras -r 1) ir suspaudimo kokybė: 5 (parametras -q:v 5)

Dabar pabandykime eiti į http://your-vm:8080/, atsakydami pamatysite nuolat atnaujinamą darbalaukio ekrano kopiją. Puiku! – ko reikėjo.

Kliento pusė

Čia vis tiek lengviau, kaip sakiau, naudosime Raspberry Pi Model B+.

Visų pirma, įdiegkime „Arch Linux“ ARM, tam mes vadovaujamės instrukcijos oficialioje svetainėje.

Taip pat turėsime skirti daugiau atminties savo vaizdo lustui, tam mes redaguosime /boot/config.txt

gpu_mem=128

Įkelkime naują sistemą ir nepamirškime inicijuoti pacman raktų žiedo, įdiegti OMXPlayer:

pacman -Sy omxplayer

Pažymėtina, kad OMXPlayer gali veikti be X, todėl mums tereikia parašyti vienetinį failą ir paleisti:

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

Kaip parametras -b http://your-vm:8080/ mes perduodame URL iš savo serverio.

Tai viskas, mūsų serverio nuotrauka iš karto turėtų pasirodyti prijungtame ekrane. Kilus problemoms, srautas bus automatiškai paleistas iš naujo ir klientai vėl prie jo prisijungs.

Kaip premiją galite įdiegti gautą paveikslėlį kaip ekrano užsklandą visuose biuro kompiuteriuose. Tam jums reikės Mikroautobusas и „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

Dabar jūsų kolegos bus labai laimingi 🙂

Šaltinis: www.habr.com

Добавить комментарий