VNC is a set of programs using the RFB (Remote Frame Buffer) protocol. They are designed to "export" a frame buffer via net (if you don't know VNC, I suggest you read "Basics" below). It is already in wide use for administration, but it is not that easy to program a server yourself.
VNC (Virtual Network Console)是虚拟网络控制台的缩写。它 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美。 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。大多数情况下用户只需要其中的两个命令:vncserver 和 vncviewer。
RFB (“remote framebuffer”,远程帧缓冲)是一个定义远程图形用户终端接口的简单协议。因为它是以framebuffer级别的工作方式,因此它适用于所有的窗口系统,包含X11,Windows 3.1/95/NT 和Macintosh。用户所操作的远程终端(包含一个显示器加一个键盘和鼠标等)被称为RFB客户端。
方法一:购买可以直接安装VNC功能的开发板
一些开发板是可以直接安装VNC工具的,比如,Pcduino和树莓派。因为这些开发板,支持apt install。而国内大部分开发板不支持直接安装。需要下载源代码,进行交叉编译以后,才能在开发板上面运行。下面以米尔的开发板,搭配Ubuntu系统为例,界面显示为基于X Server的XFCE应用。
安装x11 VNC
开发板接上HDMI显示屏,确保X Server启动。
电脑端,使用VNC Viewer进行远程访问。可以发现,鼠标和键盘都能正常使用。你可以把开发板部署到公网上面来进行更广范围的远程控制。
补充:在使用的过程中,发现如果开发板没有连接显示屏的话,XServer就不能正常远程。可以运行下面的命令,然后再启动x11vnc。
export DISPLAY=:1
Xvfb :1 -screen 0 1024x768x16 &
sleep 1
exec xfce4-session &
#exec gnome-session & # use gnome-session instead of lightdm
#exec lightdm-session &
你可以打开摄像头软件,或者利用摄像头拍摄照片。当你把开发板设置为公网IP以后,这样就相当于实现了一个网络摄像头。
方法二:使用QT自带的VNC Plugin的lib
因为我现在的项目使用的QT环境,所以使用QT4.8.6自带的gfxdrivers开发VNC功能。QT4.8.6代码库自带VNC功能插件。我们只要编译出相应的动态链接库拷贝到开发板里面就行了。
现在要做一件事情,在windows上访问嵌入式linux+Qt,使得在windows上可以看见嵌入式设备显示的内容。在网上查了一些资料,通过vnc可以实现这个功能。我的做法是在编译Qt时加入-qt-gfx-vnc和-plugin-gfx-vnc选项,然后把qt4.7.3/plugins/gfxdrivers/libqgfxvnc.so拷贝到开发板的对应目录。执行./myapp -qws -display VNC:0,提示VNC: driver not found Aborted?
将libqgfxvnc.so插件拷贝到自创建的/usr/local/Trolltech/QtEmbedded-4.8.6-arm/plugins/gfxdrivers目录下。这个目录要与自己编译的目录一致
一种是在编译Qt时加入vnc的支持。参考的资料是
http://doc.qt.io/archives/qt-4.8/qt-embedded-vnc.html
http://www.friendlyarm.net/forum/topic/5029
http://bbs.csdn.net/topics/380149017
具体做法是编译Qt时加入编译选项
-qt-gfx-vnc
-plugin-gfx-vnc
-qt-gfx-linuxfb
-plugin-gfx-linuxfb
编译完成后把生成的libqgfxvnc.so和libqscreenlinuxfb.so拷贝到开发板 qt路径/plugins/gfxdrivers/
然后在嵌入式设备启动应用程序 ./myapp -qws -display VNC:0
这时出现了
VNC: driver not found
通过Qt的VNC方式调试开发板_vigour1000的博客-CSDN博客
这个问题,我搞了两天。也没有解决。先放弃这个方案。
--------------------------------------------------------------------------------------------------------------------------
后续解决方法:
考虑到交叉编译的环境和板子实际的环境,路径有些许不同。我将板子上面的qt文件夹,命名为qt_backup。把虚拟机上面的qt文件夹拷贝到arm板的相应目录下面。然后,将qt新文件夹上面缺少的一些lib,从qt_backup拷贝到qt中。主要是自己添加的一些lib。然后,重启。再运行:./hello -qws -display VNC:0。发现显示器的屏幕上面不会显示hello的界面。然后,用VNC Viewer登录192.168.1.123:5900。发现可以远程。并且鼠标可以使用了。键盘还没测试。显示的界面现在过大。应该可以通过参数来调整。后面有更好的指令,我再发出来。
-----------------------------------------------------------------------------------------------------------
关于界面显示不全的问题,是QWS_SIZE设置不正确。这个尺寸设置越大,VNC Viewer可以看到的内容就越多。QT的界面尺寸相对就会变小。将QWS_SIZE从800*480改成2560*1920。则VNC viewer显示的内容就会完整。
方案三,下载X11 vnc源码交叉编译。安装到开发板上面。参考:嵌入式linux实现vnc功能_五香花生米的博客-CSDN博客
源码下载地址:https://download.csdn.net/download/xikangsoon/11726854
解压缩后执行:
CC=arm-cortex_a9-linux-gnueabi-gcc CFLAGS=-O2 ./configure --host=arm-linux --without-x --prefix=/usr/local/x11vnc
make
make install
然后,将生成的x11vnc拷贝到开发板相应的目录下面。
执行程序:
./x11vnc -noipv6 -rawfb /dev/fb0 -pipeinput UINPUT:touch,tslib_cal=/etc/pointercal,direct_abs=/dev/input/event2,nouinput,dragskip=4 -clip 2560x1920+0+0
然后,在电脑端使用vnc viewer进行登录。工具下载地址:vnc_viewer.rar-Web开发文档类资源-CSDN下载
登录账号是ip地址+ 端口号5900,192.168.1.123:5900
下面是效果图:
现在存在的问题是,不能操作键盘和鼠标。后面继续研究。
------------------------------------------------------------------------------------------------------------------------
--without-x编译出来的是不支持鼠标和键盘的,参考:
给imx6嵌入式平台移植x11vnc搭建远程控制环境_wanvan的博客-CSDN博客_x11vnc 交叉编译
继续做下去,需要使用libX11。而libX11需要交叉编译。参考:
交叉编译libX11_OneSea的博客-CSDN博客_交叉编译libx11
注意在安装的时候,对应版本的依赖。否则会出问题。
libxcb-1.12
xcb-proto-1.12
lib所需要下载的源代码库:
交叉编译GTK交叉编译Xserver交叉编译DFB用到的库_libpng1.4.4-C代码类资源-CSDN下载
https://www.veryarm.com/116150.html
freedesktop.org git repository browser
--------------------------------------------------------------------------------------------------------------
现在存在的问题,执行下面的指令。会显示:XOpenDisplay("") failed.
/usr/local/x11vnc/bin/x11vnc -auth guess -once -loop -noxdamage -repeat -rfbauth /home/kevin/.vnc/passwd -rfbport 5900 -shared
这个问题,还没有解决。先放一放。因为我发现,当远程进入arm板的界面的时候,运行我的QT程序。会使远程连接断开。不知道是什么原因。先使用第二种方法。后面有时间再继续研究这个远程登录的方法。
后续:对于XOpenDisplay("") failed的问题,应该是X Server没有正常启动造成的。