Table of Contents
- 1. LibVNCServerとは
- 2. LibVNCServerのインストール
- 3. LibVNCServerのサンプル
- 4. androidvncserver
- 5. android-x86上で実行
1 LibVNCServerとは
VNCサーバ向けのライブラリです。RFBプロトコルをサポートしています。ライセンスはGPLです。
2 LibVNCServerのインストール
apt-get build-depでLibVNCServerのビルド環境を整えます。LibVNCServerのリポジトリからソースコードを取得します。
$ sudo apt-get build-dep -y libvncserver$ git clone 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/pnmshowlibvncserver/examples/Makefile.am libvncserver/examples/pnmshow24libvncserver/examples/Makefile.in libvncserver/examples/regiontestlibvncserver/examples/backchannel libvncserver/examples/repeaterlibvncserver/examples/blooptest libvncserver/examples/rotatelibvncserver/examples/camera libvncserver/examples/simplelibvncserver/examples/colourmaptest libvncserver/examples/simple15libvncserver/examples/example libvncserver/examples/storepasswdlibvncserver/examples/filetransfer libvncserver/examples/vncevlibvncserver/examples/fontsel libvncserver/examples/zippy
ここではexampleというVNCサーバのサンプルプログラムを動かしてみます。exampleは以下の機能を持ちます。
* RFBプロトコルで通信* 内部バッファを持つ* 初期化時に内部バッファへ色やHello, World!という文字列を描画* VNCクライアントにバッファの内容を画面イメージとして送信* VNCクライアントからのマウス操作で内部バッファに線を描画* VNCクライアントからのキーボード操作で内部バッファに文字列を描画
通常のVNCサーバに比べて以下の機能がありません。
* デスクトップ画面イメージの複写* デスクトップ画面にマウスとキーボードのイベントを送信
サーバ側でexampleを動かします。
$ ./libvncserver/examples/example04/06/2015 00:38:08 Listening for VNC connections on TCP port 590004/06/2015 00:38:08 Listening for VNC connections on TCP6 port 590004/06/2015 00:38:08 Listening for HTTP connections on TCP port 580004/06/2015 00:38:08 URL http://ubuntu-14:580004/06/2015 00:38:08 Listening for HTTP connections on TCP6 port 580004/06/2015 00:38:08 URL http://ubuntu-14:5800
クライアント側のxvnc4viewerでVNCサーバへ接続します。
$ vncviewer localhostVNC Viewer Free Edition 4.1.1 for X – built Nov 18 2014 16:03:02Copyright (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
以下のような画面が表示されます。
4 androidvncserver
LibVNCServerにはAndroid向けのandroidvncserverというサンプルがあります。
$ tree ./libvncserver/examples/android/./libvncserver/examples/android/├── Makefile├── Makefile.am├── Makefile.in├── README└── jni ├── Android.mk └── fbvncserver.c1 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.cjni/fbvncserver.c: In function ‘print_usage’:jni/fbvncserver.c:462:3: warning: format ‘%s’ expects a matching’char *’ argument [-Wformat=] “-h : print this helpn”); ^[x86] Compile : androidvncserver <= main.c<snip>[armeabi-v7a] Compile thumb : androidvncserver <= zywrletemplate.c[armeabi-v7a] Executable : androidvncserver[armeabi-v7a] Install : androidvncserver => libs/armeabi-v7a/android
vncserver
x86、armeabi、armeabi-v7a向けのバイナリが生成されました。
$ tree libs/libs/├── armeabi│ └── androidvncserver├── armeabi-v7a│ └── androidvncserver└── x86 └── androidvncserver3 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 devicesList 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 shellshell@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 androidvncserverroot@x86:/system/bin # ./androidvncserverInitializing framebuffer device /dev/graphics/fb0…xres=800, yres=600, xresv=800, yresv=600, xoffs=0, yoffs=0, bpp=16Initializing keyboard device /dev/input/event3 …Initializing touch device /dev/input/event1 …Initializing VNC server: width: 800 height: 600 bpp: 16 port: 5901Initializing server…04/06/2015 06:18:26 Listening for VNC connections on TCP port 5901
クライアント側のxvnc4viewerでポート5901を指定してandroidvncserverへ接続します。
$ vncviewer [android-x86のIPアドレス]:5901VNC Viewer Free Edition 4.1.1 for X – built Nov 18 2014 16:03:02Copyright (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 encodingThu 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
以下のような画面が表示されます。マウスイベントをタッチイベントに送信するところが上手く動作しないようです(仮想マシンの設定のせい?)。