Precisava exibir um dashboard com monitoramento em diversas telas do escritório. Temos vários Raspberry Pi Modelo B+ antigos e um hipervisor com uma quantidade quase ilimitada de recursos.
Aparentemente, o Raspberry Pi Modelo B+ não possui aleatoriedade suficiente para manter o navegador em constante execução e renderizar uma grande quantidade de gráficos nele, por isso acontece que a página apresenta falhas parcialmente e trava com frequência.
Encontrei uma solução bastante simples e elegante, que quero compartilhar com vocês.
Como você sabe, todos os Raspberries possuem um processador de vídeo bastante poderoso, excelente para decodificação de vídeo por hardware. Então surgiu a ideia de lançar um navegador com painel em outro lugar e transferir um stream pronto com uma imagem renderizada para o framboesa.
Além disso, isso deveria ter simplificado o gerenciamento, já que neste caso toda a configuração seria realizada em uma máquina virtual, o que seria mais fácil de atualizar e fazer backup.
Não antes de dizer que acabou.
parte do servidor
Usaremos o pronto
Implantamos uma nova máquina virtual e primeiro a instalamos nela
apt-get update
apt-get install -y xserver-xorg nodm fluxbox
sed -i 's/^NODM_USER=.*/NODM_USER=ubuntu/' /etc/default/nodm
Também usaremos a configuração do Xorg, por gentileza
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
Agora vamos instalar o Firefox, vamos executá-lo como um serviço do sistema, então vamos escrever um arquivo de unidade para ele de uma só vez:
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
Precisamos do Xdotool para iniciar o Firefox imediatamente em modo de tela cheia.
Usando o parâmetro -url
Você pode especificar qualquer página para que ela abra automaticamente quando o navegador for iniciado.
Nesta fase nosso quiosque está pronto, mas agora precisamos exportar a imagem pela rede para outros monitores e dispositivos. Para isso aproveitaremos as oportunidades
Para fazer isso precisamos de duas coisas:
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
Como nossa imagem não requer atualização rápida, especifiquei a taxa de atualização: 1 quadro por segundo (parâmetro -r 1
) e qualidade de compressão: 5 (parâmetro -q:v 5
)
Agora vamos tentar ir para
Lado do cliente
Aqui tudo é ainda mais simples, como já falei, usaremos Raspberry Pi Modelo B+.
Primeiro de tudo, vamos instalar nele
Também precisaremos alocar mais memória para nosso chip de vídeo, para isso iremos editar em /boot/config.txt
gpu_mem=128
Vamos inicializar nosso novo sistema e, lembrando de inicializar o chaveiro do pacman, instalar
pacman -Sy omxplayer
O que é digno de nota é que o OMXPlayer pode funcionar sem X’s, então tudo que precisamos é escrever um arquivo unitário para ele e 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
como parâmetro -b http://your-vm:8080/
estamos passando a URL do nosso servidor.
Só isso, uma imagem do nosso servidor deve aparecer imediatamente na tela conectada. Se surgir algum problema, o stream será reiniciado automaticamente e os clientes se reconectarão a ele.
Como bônus, você pode instalar a imagem resultante como protetor de tela em todos os computadores do escritório. Para isso você vai precisar
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
Agora seus colegas ficarão muito felizes :)
Fonte: habr.com