Стрымаем экран на некалькі прылад па сетцы

Стрымаем экран на некалькі прылад па сетцы

Узнікла ў мяне неабходнасць выводзіць дашборд з маніторынгам на некалькі экранаў у офісе. У распараджэнні маецца некалькі старых Raspberry Pi Model B + і гіпервізар з амаль неабмежаваным колькасцю рэсурсаў.

Па бачным Raspberry Pi Model B+ не валодае дастатковай адвольнасцю каб трымаць стала запушчаным браўзэр і адмалёўваць вялікую колькасць графікі ў ім, з-за чаго бывае, што старонка часткова глючыць і часта вылятае.

Знайшлося дастаткова простае і элегантнае рашэнне, якім я і хачу з вамі падзяліцца.

Як вядома ўсе Raspberry маюць дастаткова магутны відэапрацэсар, які выдатна падыходзіць для апаратнага дэкадавання відэа. Так з'явілася ідэя запускаць браўзэр з дашбордам дзе-небудзь яшчэ, а на малінку перадаваць гатовы струмень з отрендеренной карцінкай.

Плюс да ўсяго гэта павінна было спрасціць кіраванне, бо ў дадзеным выпадку ўся настройка будзе выконвацца на адной віртуалцы, якую прасцей абнаўляць і бэкапіць.

Сказана - зроблена.

Серверная частка

Мы скарыстаемся гатовым Cloud Image для Ubuntu. Не патрабуючы ўсталёўкі, ён утрымоўвае ўсё неабходнае для хуткага разгортвання віртуальнай машыны, а падтрымка Cloud-Init дапамагае маментальна наладзіць сетку, дадаць ssh-ключы і хутка ўвесці яе ў лад.

Разгортваем новую віртуалку і перш за ўсё ўсталюем на ёй Xorg, наз и скрынка для флюсу:

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

Гэтак жа скарыстаемся канфігам для Xorg, ласкава прадстаўленым нам Diego Ongaro, дадаўшы толькі новы дазвол 1920 × 1080, бо ўсе нашы маніторы будуць выкарыстоўваць менавіта яго:

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

Цяпер усталюем Firefox, запускаць мы яго будзем як system сэрвіс, так што за адно і напішам unit-файл для яго:

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

Xdotool неабходны нам для таго, каб запускаць firefox адразу ў поўнаэкранным рэжыме.
Выкарыстоўваючы параметр -url можна паказаць любую старонку каб яна адчынялася аўтаматычна пры запуску браўзэра.

На гэтым этапе наш кіёск ужо гатовы, але зараз нам трэба экспартаваць карцінку па сетцы на іншыя маніторы і прылады. Для гэтага мы скарыстаемся магчымасцямі Рух JPEG, фармату які часцей выкарыстоўваецца для стрымінгу відэа з большасці web-камер.

Для гэтага нам спатрэбіцца дзве рэчы: FFmpeg з модулем x11grab, для захопу карцінкі з іксаў і streamEye, які будзе раздаваць яе нашым кліентам:

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

Так як наша карцінка не патрабуе хуткага абнаўлення, я паказаў частату абнаўлення: 1 фрэйм ​​у секунду (параметр -r 1) і якасць сціску: 5 (параметр -q:v 5)

Цяпер спрабуем зайсці на http://your-vm:8080/, у адказ вы ўбачыце пастаянна абнаўляецца скрыншот працоўнага стала. Выдатна! - тое, што і было трэба.

Кліенцкая частка

Тут усё яшчэ прасцей, як я ўжо сказаў выкарыстоўваць мы будзем Raspberry Pi Model B+.

Перш за ўсё ўсталюем на яе ArchLinux ARM, для гэтага вынікаем інструкцыі на афіцыйным сайце.

Нам таксама запатрабуецца вылучыць больш памяці для нашага відэачыпа, для гэтага адрэдагуемы ў /boot/config.txt

gpu_mem=128

Загрузім нашу новую сістэму і не забыўшыся ініцыялізаваць pacman keyring, усталюем OMXPlayer:

pacman -Sy omxplayer

Што характэрна, OMXPlayer можа працаваць без іксаў, таму ўсё што нам патрабуецца — гэта напісаць unit-файл для яго і запусціць:

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

У якасці параметру -b http://your-vm:8080/ мы перадаем URL з нашага сервера.

На гэтым усё, на падлучаным экране адразу павінна з'явіцца карцінка з нашага сервера. У выпадку ўзнікнення якіх-небудзь праблем, стрым будзе аўтаматычна перазапушчаны, а кліенты перападключацца да яго.

У якасці бонуса можна ўсталяваць атрыманую карцінку ў якасці скрынсэйвера на ўсе кампутары ў офісе. Для гэтага вам спатрэбяцца 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

Цяпер вашыя калегі будуць вельмі задаволены 🙂

Крыніца: habr.com

Дадаць каментар