前回、Raspberry Piを野外で使うためにスマフォにテザリング的手法で接続してVNCを使う方法を紹介した。ところが最近のAndroidのバージョンアップにより、スマフォ側のDHCPで割り当てられるネットワークアドレスが変動するようになり、RPi側のIPアドレスを決め打ちする方法が常に動くとは限らなくなってしまった。まぁ特に驚きはしない、というか今時分あんなやり方で動いていたことの方がむしろ驚きなのだが、このままでは困るので回避策を考えてみようと思う。
前回紹介した接続方法のうち、動かなくなったのはUSBテザリングとWiFiホットスポットである。Bluetoothテザリングのアドレスは依然として固定であり、そのまま動いている。これは不幸中の幸いであるが、いつ突然動かなくなるかわからない。とりあえず /etc/dhcpcd.conf
からusb0とWiFiホットスポットの静的IPアドレス指定をはずし、IPアドレスが変動する前提でどうすればいいかを考える。
トライ1: Bonjour Service Discoveryの使用
MultiVNCというAndroid用VNCビューワは、Bonjour Service Discoveryをサポートしているらしい。つまりRPiの方からVNCサーバをBonjourサービスとしてアドバタイズすれば、IPアドレスが変動しようがMultiVNCからRPi上のVNCサーバを発見して接続できるはずである。これが期待通り動けば理想的だ。
ではVNCサーバのアドバタイズの設定をしてみよう。まずavahi daemonが動いている必要があるが、既にmDNSを有効にしてあるのでここはクリア済みとする。次にこのあたりを参考に以下のような /etc/avahi/services/rfb.service
を書く。
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_rfb._tcp</type>
<port>5901</port>
</service>
</service-group>
これだけでMultiVNCからVNCサーバを発見、接続することができた!…と喜んだのも束の間、発見できるのはスマフォとRPiがWiFiネットワークでつながっているときだけで、テザリング用にぶらさがっているアドレスに対しては検索が行われないようである。MultiVNCのソースコードを見に行くと、確かにこのへんを見る限りWiFi限定になっているようだ。issue切ったりPR切ってもいいのだが、ユースケースがトリッキーなのでなんか気の毒な気がする。
というわけで、この方法は惜しくも問題を解決しないことが判明。
トライ2: Service Browserの使用
VNCサーバをBonjourサービスとしてアドバタイズするようにできたのだから、Android上のBonjourサービスブラウザを使えばIPアドレスくらいわかるんでないの?というわけで、Service Browserを試してみた。結論から言うと、これがほぼ期待通りであった。
Service Browserは非常にそっけない、いかにも開発者ツール然としたアプリだが、USBテザリングやWiFiホットスポットで接続したRPi上のVNCサーバを _rfb._tcp. (Remote Framebuffer)
として発見し、そのIPアドレスを見ることができる。なぜかBluetoothテザリングの場合は発見できないこともあるのだが、Bluetoothテザリングはまだアドレス固定なので困らない。
別のアプリにBonjour Browserというのがあるが、これはサービスタイプがHTTPのものだけを発見するものである。これは、type
を _http._tcp
にしたサービス定義を /etc/avahi/services/
に作っておけば同様に使える。IPアドレスを見たいだけなので実際にHTTPサーバを立てる必要はない。
Service BrowserでIPアドレス確認⇒VNC Viewerにそのアドレスを入力して接続という面倒なステップを踏む必要があるが、まぁ使えるのでよしということにする。