
Havia a necessidade de exibir painéis com monitoramento em várias telas no escritório. Existem vários antigos Raspberry Pi Modelo B + e um hipervisor com um número quase ilimitado de recursos.
Aparentemente, o Raspberry Pi Modelo B + não tem aleatoriedade suficiente para manter o navegador constantemente em execução e desenhar um grande número de gráficos nele, pelo que acontece que a página está parcialmente com erros e geralmente trava.
Havia uma solução bastante simples e elegante, que eu quero compartilhar com você.
Como vocĂŞ sabe, todos os Raspberry tĂŞm um processador de vĂdeo bastante poderoso, excelente para decodificação de vĂdeo por hardware. EntĂŁo surgiu a idĂ©ia de lançar um navegador com um painel em outro lugar e transferir o fluxo final com a imagem renderizada para a framboesa.
Além de tudo isso, deveria simplificar o gerenciamento, pois, neste caso, toda a configuração será realizada em uma máquina virtual, mais fácil de atualizar e fazer backup.
Mal disse o que fez.
Lado do servidor
Usaremos o Cloud Image pronto para Ubuntu . Sem exigir instalação, ele contém tudo o que você precisa para implantar rapidamente uma máquina virtual, e o suporte ao Cloud-Init ajuda a configurar instantaneamente sua rede, adicionar chaves ssh e colocá-la rapidamente em operação.
Implementamos uma nova máquina virtual e, em primeiro lugar, instalamos o Xorg , nodm e fluxbox 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 usamos a configuração do Xorg gentilmente fornecida por Diego Ongaro, adicionando apenas a nova resolução 1920x1080 , já que todos os nossos monitores a usarão:
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 instale o Firefox, iniciaremos como um serviço do sistema e, ao mesmo tempo, escreveremos um arquivo de unidade para ele:
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 executar o Firefox diretamente no modo de tela cheia.
Usando o parâmetro -url
, -url
pode especificar qualquer página para que ela seja aberta automaticamente quando o navegador iniciar.
Nesse estágio, nosso quiosque está pronto, mas agora precisamos exportar a imagem pela rede para outros monitores e dispositivos. Para fazer isso, usaremos os recursos do Motion JPEG , um formato usado com mais frequĂŞncia para streaming de vĂdeo da maioria das câmeras da web.
Para fazer isso, precisamos de duas coisas: FFmpeg com o módulo x11grab , para capturar imagens de X e streamEye , que a distribuirá aos nossos clientes:
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 -r 1 -i :0 -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 uma atualização rápida, indiquei a taxa de atualização: 1 quadro por segundo (parâmetro -r 1
) e qualidade da compactação: 5 (parâmetro -q:v 5
)
Agora tentamos ir para http: // your-vm: 8080 / , em resposta, você verá uma captura de tela constantemente atualizada da área de trabalho. Ótimo! - era isso que era necessário.
Parte do cliente
Ainda Ă© mais simples aqui, como eu disse, usaremos o Raspberry Pi Modelo B +.
Primeiro, instale o Arch Linux ARM nele, para isso, seguimos as instruções no site oficial.
TambĂ©m precisaremos alocar mais memĂłria para o nosso chip de vĂdeo, para isso editaremos em /boot/config.txt
gpu_mem=128
Inicialize nosso novo sistema e lembre-se de inicializar o chaveiro pacman, instale o OMXPlayer :
pacman -Sy omxplayer
Notavelmente, o OMXPlayer pode funcionar sem o Xs, é por isso que tudo o que precisamos fazer é gravar um arquivo de unidade e executá-lo:
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 o parâmetro -b http://your-vm:8080/
passamos a URL do nosso servidor.
Isso é tudo, uma imagem do nosso servidor deve aparecer imediatamente na tela conectada. Em caso de problemas, o fluxo será reiniciado automaticamente e os clientes se reconectarão a ele.
Como bônus, você pode definir a imagem resultante como um protetor de tela para todos os computadores no escritório. Para fazer isso, você precisará do MPV e do 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\
Agora seus colegas ficarĂŁo muito felizes :)