mDNSを使う前提で作ってあるブラウザ版スマートホーム操作パネルを現状、mDNSを使えないAndroid搭載スマホやタブレットで操作、Wi-Fi無線リモコンとして使う苦肉の策の話。
iPhone/iPad/iPodなどApple製品ならmacOS(やWindows)同様使えるBonjourによって、LinuxでもAvahiによってIPアドレスと紐付けられたmDNS.localを名前解決できるようになったmDNS機能もLinuxベースなのにも関わらず、Google製OS Android(アンドロイド)は、現時点では、avahi(やBonjour)を使えない状況が長く続いているようです。
Androidでもアプリ開発者用には、NSD/Network Service Discoveryはあって、Google製ブラウザChromeにもmDNS機能を持つchrome.mdnsがあるんですけどね。
もしかするとGoogle HomeとChromecastでWi-Fiが切れる問題、原因はAndroid携帯のキャストなんて事態が起き、トラウマになっていて、Avahi/mDNSの全面採用に二の足を踏んでいるのではないかなんて勝手に想像してみたりして。
Windows 10スマホもmDNS使えるだろうけど、当のMicrosoftが匙投げたようなので論外。
UserLAndやAndronixなどprootを使ってスマホを文鎮化させるリスクを極力回避しつつ、Android上に比較的安全にDebian/Ubuntu/Arch/KaliなどのLinuxをインストールできるようchroot、jail環境を作ってくれるアプリもありますが、sshdなど一部を除き?、デバイスユーザーによるavahiなどのデーモン起動はできない模様であるため、mDNSアクセスはできず、今回の要件では使えません。
Raspberry Piなどにサーバアプリをインストール後、Androidでクライアントにあたるアプリをインストール、ESP8266/ESP32などのマイコンを使ったWebサーバやアクセスポイントを登録、BlynkやIFTTTのようなクラウド経由だけでなく、ローカルネットワーク内でも当該マイコンに設定した家電などを操作できるホームオートメーション系のものもあるようですが、今回は、運用中の自前のホームオートメーション操作パネルやESP8266/ESP32ガジェットをそのまま使いたいので対象外。
自前DNSサーバを立て、通常DNSのDHCPで割り当て範囲を制限するなどして必要なデバイスの分だけ静的IPアドレスとしてDHCPで配布されないIPに固定、なんなら/etc/hostsでmDNS.localとマッピング、これを優先させ、該当するものがない場合、通常のDHCPによるDNSに任せるという策は、以前からあるようです。
自身がクラウドに抵抗がなければ、Blynkでメイン操作パネルとだけつないで、あとはmDNSが効くローカルネットワーク内なので普通にmDNSアクセスする方法、これが苦肉の中では最もスマートな策ですかね。
が、今回は、ホームオートメーション系のクラサバに似て非なる常時起動させたLinuxサーバー(今回は、ラズベリーパイ)のデスクトップ上に配置したアイコンをダブルクリックして操作パネルを表示させる恰好でAndroidからVNCビューワー越しに操作する方法を試してみました。
とは言え、自身の場合、必要都度起動で常時起動ではないものの、以前からtigervncによるVNCサーバを含め、Raspberry Pi 2 Model B/Raspbianサーバを運用中なのでAndroid側に任意のVNCビューワーをインストールするだけ。
今回は、その中からRealVNCの『VNC Viewer - Remote Desktop』をインストールすることにしました。
このアプリのアイコンをタップすると説明画面などが出てきますが、すべてNext、画面下部に+ボタンが出てきたら、接続先を登録すべく、クリック、IPアドレス:ポートと任意の名称を入れ、Save。
ちなみに各端末を登録すれば、クラウド経由で遠距離でも操作できるようですが、Wi-Fiエリア内で使う分には、登録は不要です。
リモートデスクトップできるアプリもありますが、スマホと遠隔操作したい端末双方にアプリをインストール、クラウド経由でアクセスすることになると思いますが、自身の預かり知らぬところでのセキュリティ面で懸念が残る、そもそもローカルで完結したいので除外。
ただ、mDNSを使えない中、ラズパイサーバのIPアドレスを登録するにも、それを探す術が必要ということでネットワーク管理ツールの中から、StreamSoftの『PingTools Network Utilities』をインストールしました。
回線スピードチェックなど多機能なこのアプリのアイコンをタップするとグラフが出てきて、[x devices online, including y unknown](未知のデバイスを含むオンライン中のデバイス)といった旨の文字や[横三本線アイコン](設定)から[Local-Area Network]をタップすると一覧が表示されます。
一覧の個々のデバイスには、メーカーなどの情報と共にホスト名(mDNSならmDNS.localアドレスのxxx部)、IPアドレスなどが表示されるので、未知のものはともかく、仮にESP8266/ESP32やラズパイが複数台ヒットしたとしても一目瞭然。
が、とにもかくにも、まず、サーバにログインしておかないことには、VNCポートに接続できないっぽいということでKenny Rootの『ConnectBot』などでsshログイン。
運用するとすれば、VNC含むサーバ(今回はラズパイ)を起動中に
この段取りなら、改めて『ConnectBot』ログイン、『VNC Viewer - Remote Desktop』でリモートホストを表示しても正常に動作するでしょう。
一方、終了時、パソコンでも同様も『ConnectBot』のログイン状態からexitするとログアウトしてしまい、再度、ssh接続したとしても、『VNC Viewer - Remote Desktop』でアクセスするとユーザー設定で起動してあるUIなどは起動していない(X Window systemのみの)状態となることもあるので要注意。
その場合、仮にexitしてしまっても再度、接続してsshポートフォーワーディングしているポートを一度[vncserver -kill :ポート番号]、改めて[vncserver :ポート番号]としてポート割り当てし直してから『VNC Viewer - Remote Desktop』でアクセスすれば、正常に機能します。
そうしない場合、アクセス先端末を再起動してから改めて『ConnectBot』でssh接続、『VNC Viewer - Remote Desktop』でアクセスするしかないでしょう。
スマホの設定でバックグラウンド起動させないようにしておけば、常駐することはないはずなので電池を消耗することもないでしょう。
尚、『VNC Viewer - Remote Desktop』では、1本指、2本指、3本指タップなどの説明もあり、ビューワが開くと画面上部にキーボードやマウスのアイコンがあるので、それらを選択すると相応の操作ができます。
IPアドレスが変わることがなければ、それほど手間はかからないものの、そうでないと尚更、さすが苦肉の策、遠回り感が半端なく、VNC含むサーバとVNCポート、VNC Viewerを常時起動・接続、24時間365日常時使える状態にしておくのはナンセンスである一方、都度、接続も面倒、就寝前や外出前とかに切断とか考えるにしても、無線リモコンとしてスマホを使うためだけにと考えると、やはり、微妙ですね。
更に注意点が2つほど。
1つは、ラズパイGUIはマウス操作前提、スマホはタッチパネル操作前提なので当然ながら、VNC越しでもタップ操作はできますが、あくまでマウスを動かすエミュレーションとしてのタッチ操作であるからか、予め画面上のカーソルを当該ボタンの上に移動してからタップしないと意図した通りに機能しないこと。
=> [2021/03/13] bVNC Secure VNC Viewerなら、タップだけで(カーソルが自動追随して)いけることが判明、VNC Viewer - Remote Desktopと入れ替えました。
もう1つは、画面のピンチイン・ピンチアウト(スケールアップ・スケールダウン)はできるものの、大きめのタブレットなら別も解像度の違いは吸収できないのでAndroidスマホで操作する場合、往々にして視認性がイマイチであること。
Android Studio( and SDK tools)でWebViewとNSD/Network Service Discoveryを組み合わせれば、できそうな気もしなくもないですが...。
「OK Google、ユーザーがブラウザで使えるようにAndroidにmDNS機能搭載して。」
まぁ、PCやラズパイサーバからメニュー操作、自作ラズパイスマートスピーカーや同機能を搭載したPCで音声操作もできるので別にいいですが。
あれ?本題より、備考に書いた方法の方が良いかも!?
ちなみに前述のUserLAndでAndroidにLinuxディストリビューションをインストール、SSH、VNC、arp-scanを使えば、『ConnectBot』/『VNC Viewer - Remote Desktop』/『PingTools Network Utilities』を全て兼ね、置き換えることもできそうと思い、Debianをインストール、ssh-clientを入れてSSHはいけたものの、IPを自動で見つける目的のapr-scanもですが、tigervnc-viewerをインストールして試したVNCでつまづきました。
UserLAndのGUI自体、VNCかXSDLが担い、VNCには、bVNCアプリを使う模様?も、レビューを見るとどうも微妙っぽいのでインストールしなかったのですが、VNCサーバは、ラズパイ側にあるのでUserLAnd側にGUI環境は要らないはずも、インストールすればいけるのか、何れにしてもUserLAnd/bVNCからvncviewerを実行するとVNC越しのVNCになってしまい、できないのか...とこんがらがってきました。
が、tigervnc-viewerを入れたからか、bVNCアプリをインストールすることなく、VNC接続のセッションを追加、起動するとローカルのtwm+xtermは表示され、そこからvncviewer ユーザー名@ラズパイIP:xとしてみましたが、やはり、2重はダメな模様。
あ、SSHフォワーディングならいけるか...と思ったら、現行バージョンのUserLAndだとセッション1つしか起動できず、vncviewer リモートホスト:ポートとしてみても[Can't open display:]。
他方、自身のスマホのOSは、Android 9なのですが、9含む以降は、UserLAnd上では?XSDL未対応とのこと。
Linuxパソコン上では、arp-scanでラズパイを絞り込んでIPアドレスを取得、sshとvncviewerに渡すスクリプト一発でラズパイデスクトップを表示させるところまでいけました。
よってUserLAndでもGUIは無理でもCLIでと思ったのですが、sudoを使ってもapr-scanできず...ラズパイの発見は100%に見えるので、これができれば、サーバ接続においてはmDNSにこだわる必要もないのですが...。
これを諦めるとしたら、NSD機能をもった『PingTools Network Utilities』のようなアプリも『VNC Viewer - Remote Desktop』のようなアプリも必要となる...なら、前述の方法の方が、むしろスマートっぽい。
Termuxでできれば別ですが、そうでなければ、UserLAndはアンインストールせずに入れておこうかと。
と言うのもUserLAndのDebianにopensshを入れたことで相手側がSSHサーバを起動している必要はあるものの、scpも使えるようになった(ディストロ・セッション起動後、/storage/internal/にファイルを置くとスマホの/内部ストレージ/Android/data/tech.ula/files/storage/以下に置かれる)のでファイル転送用に入れてみたアプリAirDroid(/内部ストレージ/AirDroid/upload)と併せてワイヤレスでファイルの移動・コピーできる手段が増え、状況に応じて使い分けできるので。
これは、USBポート劣化回避、うっかり、それを考慮せず買ってしまったQi未対応スマホゆえQi充電レシーバーシートをUSBポートを介して装着していることもあり、でき得る限り、スマホをUSB接続したくない自身にとっては、ありがたいところ。
TermuxでリモートでVNC接続できるという情報もありますが、ローカルにせよ、リモートにせよ、どれもTermuxでsshログインやsshポートフォワード後、やはり、VNC Viewerアプリでデスクトップ起動なので、それならConnectBotを使う前述の方法の方が、スマートっぽい。
それでもarp-scanを使うことができれば、IPアドレスを確認する必要がないため、『ConnectBot』と『PingTools Network Utilities』の置き換えにはなるか?
と思ったら、Termux Tutorial: arp-scan and arp-fingerprintを参考にpkg install openssh root-repo後、pkg install arp-scanし、arp-scanを試すとPermission Denied、続きをみると、pkg install tsuしてsudo(以前はtsudoだった模様)をインストール、sudo arp-scan --localnetを試すも[No superuser binary detected.]、[Are you rooted?]と出て終了、どうやら端末のroot化なる作業が必要な模様。
やれるかな?程度の気分で、ましてスマホデビューしてまだ1ヶ月ちょい、そもそも自分のじゃないし、格安とは言え、新品スマホでやるには、バカでっかいリスクの香り漂いまくりあがり感満載なので見送り。
もちろん、AndroidでもIPアドレスを直打ちすれば、いけるのですが、なんとも虚しいことにmDNSのmDNS.localに割り当てられたIPを調べなければならない、まぁ、『PingTools Network Utilities』などで確認しながら、ブラウザにIPを直打ち...。
それにメインパネルの場合、各家電操作用ページに移動するにもmDNSホストアドレスなので、メインパネルからの遷移ではなく、個別のページを開く度に調べたIPを直打ち...となって、なんだかなぁ状態に。
仮に、もし、それでもやるとしたら、そもそもESP8266/ESP32側でindex.htmlを省略したアクセスを可能としつつ、websocketなどを使うなど操作自体にパスの遷移を伴わないようにしておかないとIPアドレス以外の入力も必要になるので注意が必要です。
いや、待てよ?加えてブラウザのページを家電ごとにホーム画面に追加してフォルダ作って入れておけば、HTMLファイルは、スマホにも対応させてあるので操作パネルのサイズ感はバッチリですし、マウスカーソルを合わせる必要もなくタップだけでいける、スマホだけで完結するし、アリって言えば、アリというか、むしろ、こっちの方が、いいかも!?IPアドレス変わると面倒ですが、変わらなければ最高...ってだから、mDNS使いたいのに...。
先の方法でもカーソル移動は伴う一方、モニタを常時使用するPCだとそうはいきませんが、ヘッドレスのラズパイならラズパイ側で使うGUIとスマホ側のサイズに合わせる手もあって実際、ブラウザで80%にするとどの操作パネルも良い感じではありますけどね。
やはり、どっちもどっち、一長一短ですね。
「OK Google、全然OKじゃないから、mDNS...。」
結局、IP直接指定に落ち着いています。
ブラウザには、Androidの履歴からスワイプで終了させても履歴を消去してくれるのでブラウザ終了後履歴消去設定をしたDuckDuckGo Privacy Browserを使っています。
IP変更が生じるにしても、やはり、VNCよりも操作性は上ですし、良い感じです。
遅まきながら、使用中のESP8266/ESP32/Raspberr Pi製スマート家電、全てIP固定すべくスケッチを修正・アップロードしました。
もちろん、スマホのホーム画面にこれらIPアドレスを反映したショートカットを配置、やっぱ楽だわ...IPアドレスの固定しとくと。
これまでルータの再起動で何度かスマホのショートカットのIP変更はあったものの、たいした頻度ではなかったので放置してましたが、今回、重い腰を上げました。