前言

由于这半年来一直在做嵌入式Linux系统软件开发工作,所以经常和嵌入式设备打交道,最早接触的嵌入式Linux应该就是树莓派了,而我的树莓派一般也不接屏幕,基本上都使用VNC远程连接,所以就想着能不能把VNC也移植到嵌入式设备上,最后找到了x11vnc

VNC(虚拟网络计算)是一种非常有用的网络图形协议(应用程序在一台计算机上运行,但在另一台计算机上显示其窗口),但与X不同,查看端非常简单,不保持任何状态。它是一种远程帧缓冲区(RFB)协议。

x11vnc允许用户通过任何VNC viewer远程查看并与real X显示器(即与物理监视器、键盘和鼠标相对应的显示器)交互。

准备工作

需要先用git克隆下面两个仓库,libvncserverx11vncx11vnc是基于libvncserver的服务端程序。

编译 libvncserver

编译x11vnc需要libvncserver,libvncserver按照 README 编译即可

1
2
3
4
mkdir build
cd build
cmake ..
cmake --build .

编译完成后将build文件夹下生成的.so文件复制到 sysroot

例:

1
2
3
4
5
6
7
# 复制 .so 文件
$ sudo cp ./libvncclient.so* /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/
# 复制 pkgconfig 文件
$ sudo cp ./libvnc*.pc /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/pkgconfig/
# 复制头文件
$ sudo cp -r ../rfb /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/
$ sudo cp ./rfb/rfbconfig.h /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/include/rfb/

编译 x11vnc

x11vnc 需要使用 autoconf 和 automake 生成 configure 和 makefile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ cd x11vnc-master
# 使用aclocal工具生成aclocal.m4
$ aclocal
# 使用autoconf工具生成configure文件
$ autoconf
# 使用autoheader工具生成config.h.in文件
$ autoheader
# 使用automake生成Makefile.in文件
$ automake --add-missing
# configure 配置交叉编译,如果libvncserver没有正确编译安装,这里会提示找不到libvncserver
$ ./configure CC=arm-poky-linux-gnueabi-gcc AR=arm-poky-linux-gnueabi-ar AS=arm-poky-linux-gnueabi-as LD=arm-poky-linux-gnueabi-ld --host=arm-poky-linux --prefix=/home/ubuntu/ CFLAGS="-march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi"
# 编译安装
$ make install

安装完成后在 /home/ubuntu/ (configure 步骤设置的 –prefix)目录下出现了binshare两个目录,bin目录下的就是 x11vnc 的可执行文件。

安装运行

将 libvncserver 编译得到的 *.so 文件和 x11vnc 可执行文件复制到开发板即可。

1
2
3
4
# 复制可执行文件
$ scp -r /home/ubuntu/bin root@192.168.10.7:~/
# 复制 libvncserver
$ scp /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/libvnc*.so.0.9.13 root@192.168.10.7:/usr/lib/

ssh登录开发板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建符号链接
root@imx6ulevk:~# ln -s /usr/lib/libvncclient.so.0.9.13 /usr/lib/libvncclient.so.1
root@imx6ulevk:~# ln -s /usr/lib/libvncclient.so.1 /usr/lib/libvncclient.so
root@imx6ulevk:~# ln -s /usr/lib/libvncserver.so.0.9.13 /usr/lib/libvncserver.so.1
root@imx6ulevk:~# ln -s /usr/lib/libvncserver.so.1 /usr/lib/libvncserver.so
# 重命名文件夹
root@imx6ulevk:~# mv ~/bin ~/x11vnc 
root@imx6ulevk:~# cd ~/x11vnc
root@imx6ulevk:~# chmod +x ./x11vnc
# 运行 x11vnc
# x11vnc -display :0
root@imx6ulevk:~# ./x11vnc

然后在电脑上启动 VNC Viewer, 输入开发板的ip地址就可以通过远程桌面访问设备了。

实际运行效果如图

Snipaste_2022-01-28_12-31-30.png

参考