LibVNCServerのサンプルプログラムを動かしてみる

VNCサーバ向けのライブラリであるLibVNCServerのサンプルプログラムを動かしてみます。


 

1 LibVNCServerとは

VNCサーバ向けのライブラリです。RFBプロトコルをサポートしています。ライセンスはGPLです。

2 LibVNCServerのインストール

apt-get build-depでLibVNCServerのビルド環境を整えます。LibVNCServerのリポジトリからソースコードを取得します。

$ sudo apt-get build-dep -y libvncserver
$ git clone https://github.com/LibVNC/libvncserver
$ cd libvncserver
$ ./autogen.sh --prefix=${HOME}
$ make all install

実行時はLD_LIBRARY_PATH=${HOME}/libを参照すること。.profileでexportしておくと楽かも。

2.1 libvncserver-config

libvncserver-configコマンドでLibVNCServer向けのCFLAGSとLDLIBSを取得します。

$ libvncserver-config --libs
-L/home/hiroom2/lib -lvncserver -lvncclient -lnsl -lpthread -lz
-ljpeg -lresolv -lgcrypt -lgnutls
$ libvncserver-config --cflags
-I/home/hiroom2/include

LibVNCServerを使ったプログラムをビルドするには、以下のようなMakefileを用いれば良いと思います。

SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SRCS))
TARGET := $(patsubst %.c,%,$(SRCS))

LIBVNC_CFLAGS := $(shell libvncserver-config --cflags)
LIBVNC_LIBS := $(shell libvncserver-config --libs)

CFLAGS += -g -Wall $(LIBVNC_CFLAGS) $(EXTRA_CFLAGS)
LDLIBS += $(LIBVNC_LIBS)

all: $(TARGET)

clean:
        $(RM) -rf $(TARGET) *.dSYM

3 LibVNCServerのサンプル

exampleディレクトリにサンプルが格納されています。

$ ls libvncserver/examples/*[^coh]
libvncserver/examples/Makefile       libvncserver/examples/pnmshow
libvncserver/examples/Makefile.am    libvncserver/examples/pnmshow24
libvncserver/examples/Makefile.in    libvncserver/examples/regiontest
libvncserver/examples/backchannel    libvncserver/examples/repeater
libvncserver/examples/blooptest      libvncserver/examples/rotate
libvncserver/examples/camera         libvncserver/examples/simple
libvncserver/examples/colourmaptest  libvncserver/examples/simple15
libvncserver/examples/example        libvncserver/examples/storepasswd
libvncserver/examples/filetransfer   libvncserver/examples/vncev
libvncserver/examples/fontsel        libvncserver/examples/zippy

ここではexampleというVNCサーバのサンプルプログラムを動かしてみます。exampleは以下の機能を持ちます。

* RFBプロトコルで通信
* 内部バッファを持つ
* 初期化時に内部バッファへ色やHello, World!という文字列を描画
* VNCクライアントにバッファの内容を画面イメージとして送信
* VNCクライアントからのマウス操作で内部バッファに線を描画
* VNCクライアントからのキーボード操作で内部バッファに文字列を描画

通常のVNCサーバに比べて以下の機能がありません。

* デスクトップ画面イメージの複写
* デスクトップ画面にマウスとキーボードのイベントを送信

サーバ側でexampleを動かします。

$ ./libvncserver/examples/example
04/06/2015 00:38:08 Listening for VNC connections on TCP port 5900
04/06/2015 00:38:08 Listening for VNC connections on TCP6 port 5900
04/06/2015 00:38:08 Listening for HTTP connections on TCP port 5800
04/06/2015 00:38:08   URL http://ubuntu-14:5800
04/06/2015 00:38:08 Listening for HTTP connections on TCP6 port 5800
04/06/2015 00:38:08   URL http://ubuntu-14:5800

クライアント側のxvnc4viewerでVNCサーバへ接続します。

$ vncviewer localhost

VNC Viewer Free Edition 4.1.1 for X - built Nov 18 2014 16:03:02
Copyright (C) 2002-2005 RealVNC Ltd.
See http://dl-web.realvnc.com for information on VNC.

Thu Jun  4 00:46:50 2015
 CConn:       connected to host localhost port 5900
 CConnection: Server supports RFB protocol version 3.8
 CConnection: Using RFB protocol version 3.8
 TXImage:     Using default colormap and visual, TrueColor, depth 24.
 CConn:       Using pixel format depth 6 (8bpp) rgb222
 CConn:       Using ZRLE encoding

以下のような画面が表示されます。

0001_example.png

4 androidvncserver

LibVNCServerにはAndroid向けのandroidvncserverというサンプルがあります。

$ tree ./libvncserver/examples/android/
./libvncserver/examples/android/
├── Makefile
├── Makefile.am
├── Makefile.in
├── README
└── jni
    ├── Android.mk
    └── fbvncserver.c

1 directory, 6 files

/dev/graphics/fb0をmmapしてディスプレイに表示されている内容を取得したり、/dev/inputにキーボードとマウスのイベントを書き込む為、root権限が必要です。

4.1 androidvncserverのビルド

configureでrfbconfig.hを作り直します。

$ cd libvncserver/
$ ./autogen.sh --without-gnutls --without-crypt --without-ipv6 \
--without-client-gcrypt --without-websockets --without-jpeg

APP_ABIでx86 armeabi armeabi-v7aを設定し、各種CPU向けにバイナリを生成するようにします。設定しない場合は、armeabiになります。

$ cd libvncserver/examples/android/
$ echo "APP_ABI := x86 armeabi armeabi-v7a" > jni/Application.mk

ndk-buildでビルドします。

$ ndk-build
[x86] Compile        : androidvncserver <= fbvncserver.c
jni/fbvncserver.c: In function 'print_usage':
jni/fbvncserver.c:462:3: warning: format '%s' expects a matching
'char *' argument [-Wformat=]
   "-h : print this help\n");
   ^
[x86] Compile        : androidvncserver <= main.c
<snip>
[armeabi-v7a] Compile thumb  : androidvncserver <= zywrletemplate.c
[armeabi-v7a] Executable     : androidvncserver
[armeabi-v7a] Install        : androidvncserver => libs/armeabi-v7a/androidvncserver

x86、armeabi、armeabi-v7a向けのバイナリが生成されました。

$ tree libs/
libs/
├── armeabi
│   └── androidvncserver
├── armeabi-v7a
│   └── androidvncserver
└── x86
    └── androidvncserver

3 directories, 3 files

5 android-x86上で実行

androidvncserverをKVM上にインストールしたandroid-x86上で実行します。AVDで作成したx86向けのAndroidの場合と異なり、KVMのネットワークを用いる為、LANで見えるようにIPアドレスを設定できます。

android-x86をVirtualBoxにインストールする手順はこちらを参考にして下さい。

adb connectを使ってLAN経由でandroid-x86に接続します。

$ adb connect [android-x86のIPアドレス]
connected to [android-x86のIPアドレス]:5555
$ adb devices
List of devices attached
[android-x86のIPアドレス]:5555        device  : adb devices

バイナリをandroid-x86に転送します。

$ adb push libs/x86/androidvncserver /sdcard/
5848 KB/s (178292 bytes in 0.029s)

/system/binに配置して実行します。ポートは5901となりました。

$ adb shell
shell@x86:/ $ su -
root@x86:/ # mount | grep system
/dev/block/sda1 /system ext2 rw,relatime,errors=continue 0 0
# cd /system/bin/
root@x86:/system/bin # cp /sdcard/androidvncserver .
root@x86:/system/bin # chmod 755 androidvncserver
root@x86:/system/bin # ./androidvncserver
Initializing framebuffer device /dev/graphics/fb0...
xres=800, yres=600, xresv=800, yresv=600, xoffs=0, yoffs=0, bpp=16
Initializing keyboard device /dev/input/event3 ...
Initializing touch device /dev/input/event1 ...
Initializing VNC server:
        width:  800
        height: 600
        bpp:    16
        port:   5901
Initializing server...
04/06/2015 06:18:26 Listening for VNC connections on TCP port 5901

クライアント側のxvnc4viewerでポート5901を指定してandroidvncserverへ接続します。

$ vncviewer [android-x86のIPアドレス]:5901

VNC Viewer Free Edition 4.1.1 for X - built Nov 18 2014 16:03:02
Copyright (C) 2002-2005 RealVNC Ltd.
See http://dl-web.realvnc.com for information on VNC.

Thu Jun  4 06:25:11 2015
 CConn:       connected to host android-x86 port 5901
 CConnection: Server supports RFB protocol version 3.8
 CConnection: Using RFB protocol version 3.8
 TXImage:     Using default colormap and visual, TrueColor, depth 24.
 CConn:       Using pixel format depth 6 (8bpp) rgb222
 CConn:       Using ZRLE encoding

Thu Jun  4 06:25:54 2015
 CConn:       Throughput 20181 kbit/s - changing to hextile encoding
 CConn:       Throughput 20181 kbit/s - changing to full colour
 CConn:       Using pixel format depth 24 (32bpp) little-endian rgb888
 CConn:       Using hextile encoding

以下のような画面が表示されます。マウスイベントをタッチイベントに送信するところが上手く動作しないようです(仮想マシンの設定のせい?)。

0002_androidvncserver.png