Acesso gráfico e remoto ao Raspberry Pi: VNC server, X11VNC server e Xming.

O objectivo deste tutorial é apresentar uma breve descrição do funcionamento gráfico do raspberry pi e comparar vários métodos para aceder graficamente ao raspberry Pi a partir de um PC.

Modos de vídeo

O RPi possui um ficheiro de configuração que contém toda a informação de base do sistema, desginadamente, os parâmetros da placa gráfica, USB, gestão de periféricos, etc, tudo aquilo que esperariamos encontrar na BIOS convencional de um PC e que deverão ser definidos previamente durante o processo de boot. Este ficheiro – /boot/config.txt – bem como as funções e propriedades disponíveis, encontra-se muito bem documentado no site raspberry.org.

Abra uma janela de terminal, ou uma nova sessão SSH, e em seguida abra o ficheiro config.txt que se localiza na directoria /boot/ no editor de texto nano.

sudo nano /boot/config.txt

nano

Provavelmente, o ficheiro já vem preenchido com um vasto leque de parâmetros e encontra-se companhado de comentários informativos sobre cada uma das suas funções.
É prática bastante comum deixar várias linhas comentadas (caracter #) com valores pré-
definidos permitindo que, de forma muito rápida e cómoda, seja possível comutar entre
vários cenários de utilização.

A configuração do sistema gráfico do RPi é composto por diversos parâmetros, entre eles destacamos os mais importantes.

Gestão de memória Vídeo.

A memória RAM do RPi é partilhada entre o processador e o sistema gráfico. A propriedade gpu_mem possui um sufixo para cada uma das versões do Hardware do RPi, nomeadamente as versões de 256Mb, 512Mb e 1024Mb.

Podemos atribuir à propriedade gpu_mem valores entre 16Mb e 192Mb, 448Mb e 944Mb, consoante a versão do hardware, sendo o valor 64Mb aquele que se encontra definido por omissão.

O valor desta propriedade deve ser definido tendo em consideração o cenário de utilização que pretendemos dar ao RPi. Caso não seja necessário, ou não se preveja criar uma sessão gráfica, o valor de memória atribuída ao processador gráfico deve ser reduzido para a  gama de valores próximos de 64M, ou até mesmo 16M, libertando assim recursos para o processamento genérico.

Sempre que o RPi é usado no contexto de uma aplicação gráfica e encontra-se conectado a um monitor ou a uma televisão, a resolução do ecrã torna-se no principal critério de escolha  do valor desta propriedade. Para a resolução máxima (FullHD – 1080p) deverá ser atribuído, no mínimo, 128Mb de RAM  de memória gráfica.

Vejamos um exemplo.

gpu_mem_1024=256

Esta linha atribui à memória de vídeo 256M. A versão do RPi em causa é a mais recente (1G de RAM).

Modo gráfico

As principais propriedades que definem um modo gráfico são, respectivamente, a resolução (W*H) e a taxa de refrescamento, medida em Hz. Este valores, por norma, não são arbitrários, mas são antes escolhidos de uma lista que contém os modos HDMI padrão (caso se pretenda personalizar um modo com valores arbitrários consulte este tópico).

Os modos de vídeo estão organizados em dois grupos que devem ser escolhido em função do tipo de saída HDMI – monitor ou TV -,  ao qual o RPi se encontra actualmente conectado. O grupo CEA (Consumer Electronics Association) contém a lista de modos tipicamente usados nas TV, enquanto que o grupo DMT (Display Monitor Timings). Um destes dois grupos é definido na propriedade hfmi_group. O valor 0 activa o modo de detecção automática,  o valor 1 força o grupo CEA (Televisão) e, por último, o valor 2 o grupo DMT (monitor).

As tabelas que contêm os vários modos de cada grupo podem ser consultados na documentação oficial do Raspberry Pi, na página já referida.

Exemplos:

# TV fullHD (1080p)
hdmi_group=1
hdmi_mode=16

#TV HD (720p)
hdmi_group=1
hdmi_mode=16

#VGA 800x600, 60hz
hdmi_group=2
hdmi_mode=9

#VGA 1024x768, 70hz
hdmi_group=2
hdmi_mode=18

#VGA 1280x768, 75hz
hdmi_group=2
hdmi_mode=24

Forçar a saída de sinal HDMI

Durante o processo de boot, o sistema detecta se existe um monitor (ou TV) conectado à saída HDMI e aplica as propriedades defnindas neste ficheiro de configuração. Sempre que, no momento em que RPi se inicia, o cabo HDMI não estiver ligado, ainda que mais tarde o RPi seja correctamente ligado a um monitor, nenhum sinal de vídeo será gerado. Também nos casos em que o cabo HDMI é desligado (inadevertidamente, por exemplo),  não é possível recuperar no futuro o  sinal.

A propriedade HDMI_FORCE_HOTPLUG quando definido com o valor 1, força a presença da saída de sinal vídeo na porta HDMI, mesmo que nenhum dispositivo esteja fisicamente conectado.

hdmi_force_hotplug=1 

 

Sistemas gráficos X

Nos sistemas operativos Linux e Unix o ambiente gráfico, baseado em janelas, são frequentemente geridos pelo sistema conhecido por X o X11 e que consiste num protocolo de rede capa de gerir não sáo a aparência gráfica de aplicações como também gerir os inputs (por exemplo rato e teclado).

O sistema X é baseado no modelo Servido-Cliente, o que lhe oferece inúmeras vantagens face a outras arquitecturas, sendo a mais evidente  a possibilidade de facilmente ser implentados ecrãs virtuais, isto é, ambientes gráficos independentes do dispositivo físico conectado à máquina. Ambientes gráficos integrados mais sofisticados (Desktop Environment), como o KDE ou o GNOME,  são suportados pelo sistema X. Para saber mais acerca do sistema X, consulte a seguinte página do site  http://www.linuxdevcenter.com/.

A sessão gráfica X pode ser iniciada automaticamente ou, através do comando startx, aberta manualmente.

startx 

Na janela de terminal, para abrir uma aplicação usamos a variável ambiental DISPLAY para  especificar qual o ecrã em que a aplicação será aberta.

Abre o programa Scratch na sessão gráfica X associada ao ecrã (físico) nº0.

DISPLAY=:0 scratch

Abre o programa Scratch na sessão gráfica X associada ao ecrã (virtual) nº1.

DISPLAY=:1 scratch

 

Acesso remoto através do VNC

sudo apt-get install tightvncserver

Quando executada pela primeira vez usamos o comando integral para definir uma password:

sudo tightvncserver 

vnc1

Foi criada a passoword e iniciado a sessão X no display nº1.
Caso não se pretenda alterar ou criar no futuro a password, está disponível o comando vncpasswd.

Cada vez que ser prentende iniciar o servidor VNC não é necessário recorrer ao comando integral, só na primeira vez para seja pedido uma password. Daqui em diante usa-se o comando vncserver que é um wrapper do comando integral mas muito  simples e rápido de usar:
vncserver:[Nºecrã] -geometry [width]x[largura] -depth [profundidade de cor]

A porta a usar pode ser também especificada, caso não seja será usada a porta 5900 que corresponde ao display :0. Ou seja,  o ecrã :0 está associado à porta 5900,  o ecrã :1 à porta 5901, e assim sucessivamente.

Exemplo:

sudo vncserver:1 -geometry 1024x768 -depth 24

Para fechar a sessão no servido aplica-se o parâmetro kill no comando vncserver.

exemplo:

sudo vncServer -kill :1

No PC devemos ter instalado, previamente, uma versão cliente do VNC.

vnc2

No PC a janela da sessão gráfica X do ecrã virtual nº1 é aberta.

vnc3

O ecrã :0 corresponde ao monitor fisicamente ligado ao RPi. O servidor VNC permite que várias sessões X, ou ecrãs virtuais (:1 :2 :3 …), sejam criados simultaneamente. Deste modo, inúmeros clientes podem aceder ao RPi através de sessões autónomas e independentes.vnc5Este setup é particularmente adequado ao cenário em que um headless RPi (sem estar fisicamente conectado a um monitor) corre um pequeno servidor  (por exemplo, servidor web) e vários utilizadores acedem e utilizam a máquina simultaneamente e de modo autónomo.vnc4Num outro exemplo, um utilizador cria uma sessão X no display:1 e vários clientes podem conectar-se pela porta 5901 e partilharem o mesmo ecrã. Neste cenário, um utilizador exemplifica ou demonstra um conjunto de acções enquanto uma plateia de utilizadores assistem remotos à demonstração. Repare-se que neste caso o ecrã partilhado não é o físico (display :1). Aliás, uma das particularidades do tight VNC server é a impossibilidade de partilhar o display :0 que corresponde ao ecrã físico.

 

 

Acesso remoto através doX11 VNC

 

As funcionalidades e modo de operação do servidor X11VNC é, no essencial, idêntico ao do servidor VNC excepto num pormenor. O servidor X11VNC, ao contrário do VNC, não cria uma sessão virtual inteiramente nova mas limita-se a partilhar uma sessão gráfica activa e pré existente. Esta particularidade torna-o bastante útil nos casos em que o RPi encontra-se fisicamente conectado a um monitor, por exemplo no cenário de um quiosque multimédia, e necessitamos de trabalhar nessa sessão gráfica.

para instalar basta executar o comando apt-get:

 sudo apt-get install x11vnc 

Após a instalação, tal como na aplicação anterior, começamos por definir uma password:

x11vnc -storepasswd

O modo mais simples de iniciar o servidor consiste em executar o comando com os parâmetros pré-defininidos por omissão.
Nota: Quando o RPi inicia directamente para a linha de comandos, não se encontra activa nenhuma sessão gráfica, nesse caso, através do comando startx inciamos a sessão gráfica.

x11vnc 

No PC, tal como no exemplo anterior, abrimos o cliente VNC com o IP e a porta 5900.X11vnc1

Inciar automaticamente o X11vnc no início da sessão.

O arranque do sistema linux tem várias etapas, nas quais, é possível especificar a execução de determinados comandos ou aplicações. Devido ao facto do X11vnc partilhar uma sessão em uso, é necessário que o comando de arranque do programa aconteça no final do processo de BOOT quando o sessão do display :0 (ecrã físico) já foi iniciado.
Os últimos scripts a correr durante o processo de BOOT são o ficheiro que executam as preferências dos programas e  configuração particulares do utilizador, geralmente, localizados em /home/pi/.config/autostart.
Numa máquina acabada de instalar o sistema operatico é natural que essa directoria esteja vazia ou mesmo nem seque exista.

cd /home/pi/.config
ls

Caso não a directoria não exista , temos de a criar primeiramente.

mkdir autostart

O próximo passo é criar um ficheiro de arranque para o servidor X11vnc executar no início da sessão. Abra o editor de texto

nano /home/pi/.config/autostart/x11vnc.desktop

e introduza os seguintes parâmetros:

[Desktop Entry]
encoding=UTF-8
Type=Application
Name=X11VNC
Exec=x11vnc -forever -usepw -display :0 -ultrafilexfer -noxdamage
StartupNotify=false
Terminal=false
Hidden=false

grave e reincie o RPi

sudo reboot

20160303_230429

Podemos ver na imagem que, ao contrário do que acontece com oservidor VNC, o cliente no PC partilha a mesmo desktop do RPi.

 

… to be continued …

 

 

 

 

Anúncios