
Era necesario que yo mostrara tableros con monitoreo en varias pantallas en la oficina. Hay varios Raspberry Pi Model B + antiguos y un hipervisor con una cantidad casi ilimitada de recursos.
Aparentemente, el Raspberry Pi Model B + no tiene suficiente aleatoriedad para mantener el navegador funcionando constantemente y dibujar una gran cantidad de gráficos, por lo que sucede que la página está parcialmente defectuosa y a menudo se bloquea.
Hubo una solución bastante simple y elegante, que quiero compartir con ustedes.
Como saben, todas las Raspberry tienen un procesador de video bastante potente, que es excelente para la decodificación de video por hardware. Entonces surgió la idea de lanzar un navegador con un tablero en otro lugar y transferir la secuencia terminada con la imagen renderizada a la frambuesa.
Además de todo esto, se suponía que simplificaría la administración, ya que en este caso toda la configuración se realizará en una máquina virtual, lo que es más fácil de actualizar y respaldar.
Apenas dicho que hecho.
Lado del servidor
Utilizaremos la imagen en la nube ya preparada para Ubuntu . Sin requerir instalación, contiene todo lo que necesita para implementar rápidamente una máquina virtual, y el soporte de Cloud-Init lo ayuda a configurar instantáneamente su red, agregar claves ssh y ponerla en funcionamiento rápidamente.
Implementamos una nueva máquina virtual y, en primer lugar, instalamos Xorg , nodm y fluxbox en ella:
apt-get update apt-get install -y xserver-xorg nodm fluxbox sed -i 's/^NODM_USER=.*/NODM_USER=ubuntu/' /etc/default/nodm
También utilizamos la configuración de Xorg amablemente proporcionada por Diego Ongaro, agregando solo la nueva resolución 1920x1080 , ya que todos nuestros monitores la usarán:
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
Ahora instale Firefox, lo iniciaremos como un servicio del sistema, por lo que al mismo tiempo escribiremos un archivo de unidad para él:
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
Necesitamos Xdotool para ejecutar Firefox directamente en modo de pantalla completa.
Usando el parámetro -url
, puede especificar cualquier página para que se abra automáticamente cuando se inicie el navegador.
En esta etapa, nuestro quiosco está listo, pero ahora necesitamos exportar la imagen a otros monitores y dispositivos a través de la red. Para hacer esto, utilizaremos las capacidades de Motion JPEG , un formato que se usa con mayor frecuencia para transmitir video desde la mayoría de las cámaras web.
Para hacer esto, necesitamos dos cosas: FFmpeg con el módulo x11grab , para capturar imágenes de X y streamEye , que lo distribuirá a nuestros 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 nuestra imagen no requiere una actualización rápida, indiqué la frecuencia de actualización: 1 fotograma por segundo (parámetro -r 1
) y la calidad de compresión: 5 ( -q:v 5
parámetro -q:v 5
)
Ahora intentamos ir a http: // your-vm: 8080 / , en respuesta verá una captura de pantalla del escritorio constantemente actualizada. Genial - eso era lo que se necesitaba.
Parte del cliente
Todavía es más simple aquí, como dije, usaremos el Raspberry Pi Model B +.
En primer lugar, instale Arch Linux ARM en él, para esto seguimos las instrucciones en el sitio web oficial.
También necesitaremos asignar más memoria para nuestro chip de video, para esto editaremos en /boot/config.txt
gpu_mem=128
Inicie nuestro nuevo sistema y recuerde inicializar el llavero pacman, instale OMXPlayer :
pacman -Sy omxplayer
Sorprendentemente, OMXPlayer puede funcionar sin X, es por eso que todo lo que tenemos que hacer es escribir un archivo unitario y ejecutarlo:
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/
pasamos la URL de nuestro servidor.
Eso es todo, una imagen de nuestro servidor debería aparecer inmediatamente en la pantalla conectada. En caso de problemas, la secuencia se reiniciará automáticamente y los clientes se volverán a conectar a ella.
Como beneficio adicional, puede configurar la imagen resultante como un protector de pantalla para todas las computadoras de la oficina. Para hacer esto, necesitará MPV y 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\
Ahora tus colegas estarán muy felices :)