WORKS 作ったもの

Streamdeck風のAndroidアプリを作った

開発AI活用ガジェット

POCO M7って端末が余ってる。仕事のために1回線取ってあるんだけど、結局今の電話に全部連絡もらってて一切使ってない。マジもったいないけど解約するのもめんどい。

出張先で音楽聞いたり動画見る用にしてたこともあったけどいちいち持っていくには重たい…

完璧に降参ボタン用のスマホとしてちょっと腐っていたのだが。

「こいつ、何か面白い使い道ないかな」と考えていたとき、ふと思いついた。

Stream Deckみたいにして、パソコン操作用のボタンを並べたら便利なのでは?

そんな軽い思いつきから始まったのが、今回作ったAndroidアプリ「RemoteDeck」です。

ちなみに開発中はPOCO M7をターゲットにしていましたが、外からの電源ONの機能も追加したのでメイン端末のPixel 9 Proに入れて使っています。

AndroidスマホをPCの操作パネルにしたい

やりたかったことはかなり単純です。

スマホに大きなボタンを並べて、

・PCを起動する
・PCをロックする
・スリープする
・再起動する
・シャットダウンする
・音量を変更する
・Android Studioを起動する
・WinSCPを起動する
・エクスプローラーを開く

みたいな操作をできるようにしたい。

要するに、

「自分専用のPCリモコン」

です。

Stream Deckそのものを買うのももちろんアリだけど高い。手元には使い道のないAndroid端末があるしこいつで試すのは良さそう。作ればいいじゃんね。

……この時点では、割と簡単にできると思っていました。

以前からずっとやりたかったWake-on-LAN

今回、特にやりたかったのがPCの電源ONです。

Wake-on-LAN、通称WoL。

LAN経由でMagic Packetを送って、電源が切れているPCを起動する機能です。

実はこれ、かなり昔からやりたかった機能でしたが、何度挑戦してもうまくいかず諦めてました。

BIOSをいじったり、LANアダプターの設定を確認したり、高速スタートアップを切ったり、Windows側の設定を変えたり……。調べながら2年おきくらいに挑戦してみるものの玉砕。

そのため今までは、SwitchBotの物理スイッチをPCの電源ボタンに取り付けて、

SwitchBotに物理的に電源ボタンを押してもらう

という、非常に力技な方法でPCを起動していました。

これはこれで確実に動くので便利なんですが、

「Wake-on-LANでスマートに起動したい」

という気持ちはずっと残っていました。

そして今回。

RemoteDeckを作るついでに、またWake-on-LANへ挑戦。

BIOS、LANアダプター、高速スタートアップなどを改めて一つずつ確認した結果、

ついに、

完全シャットダウン状態からWake-on-LANでPCを起動できました。

長かった。本当に長かった。

RemoteDeck本体の完成もうれしいんですが、個人的にはこれがかなり大きいです。

今までPCの横で頑張ってくれていたSwitchBotも、ついにお役御免…と言いつつ今のとこ行き先がないのでそのままにしてあります。

電源ボタンを物理スイッチで押すやつ。高さ合わせるためにダイソーで木っぽい何かを重ねてガムテープで固定してあるという装置…めっちゃホコリあったんできしゃなくて画像は加工した。あまり目に入れたくないんでデスクの一番奥にある…

最初はWindowsに何も入れたくなかった

RemoteDeckを作り始めた当初は、

できるだけPC側に専用アプリを入れたくない

と思っていました。

WindowsにはもともとOpenSSH Serverがあるので、

Android

SSH

PowerShell

という流れで操作すればいいのでは、と考えました。

これならWindows標準機能だけでかなりのことができます。

ロック、スリープ、再起動、シャットダウンあたりは比較的分かりやすい。

問題は、

「Android Studioを起動する」

みたいなGUIアプリの操作でした。

SSHからアプリを起動したら、起動しているのに見えない

ここから一気に面倒になります。

SSH経由でWindowsへ接続して、

「Android Studioを起動しろ」

と命令する。

コマンド自体は実行されます。

ところが画面には何も出てこない。

理由を調べると、SSHで動いているセッションと、普段Windowsを操作しているデスクトップセッションが別物でした。

つまり、

起動はしているが、わしのデスクトップには出てこない。

なんという役に立たない起動。

そこで次に、

SSHから直接アプリを起動するのではなく、

  1. AndroidからSSHで要求を送る
  2. Windows側のキューへ保存する
  3. タスクスケジューラでログイン中のユーザー側から実行する

という方式を試しました。

理屈としては良さそうです。

しかし実機では、

タスクスケジューラがエラーで止まる。

Explorerの起動要求がキューに残る。

Chromeも起動しない。

音量操作も古いスクリプトが残っていて拒否される。

と、次々に問題が発生。

だんだん、

「これ、Windows標準機能だけで頑張ること自体が目的になってない?」

という状態になってきました。

諦めてWindows Companionを作る

ここで方針転換しました。

Windows側にも専用アプリを置きます。

名前はそのまま、

RemoteDeck Companion

です。

ログイン中のWindowsでCompanionを常駐させておき、

AndroidのRemoteDeckからCompanionへ操作要求を送る仕組みにしました。

Companionなら、普通にユーザーが使っているWindowsセッション上で動いているので、

Android Studioも、WinSCPも、Explorerも、普通に起動できます。

最初からこれにしておけば良かった気もします。

ただし、AndroidからWindowsへ好き勝手にコマンドを実行できる仕組みにするのは怖いので、

RemoteDeckから送れる操作はあらかじめ固定しました。

任意のPowerShellコマンドを送ったり、

好きなexeのパスを指定したりすることはできません。

接続にも証明書の照合とトークン認証を入れています。

自分しか使わないアプリとはいえ、この辺は一応ちゃんとしました。

PCに入っているアプリだけボタンを有効化

せっかく専用Companionを作ったので、少し便利な機能も追加しました。

例えば、

Android Studio
WinSCP
Androidエミュレーター
Downloadsフォルダー

などをWindows側で調べて、

実際に存在するときだけRemoteDeck側のボタンを有効化

するようにしました。

環境によってインストール先が違っても、ある程度自動で見つけてくれます。

これで、

「ボタンを押したけど、そのアプリ入ってませんでした」

ということも減りました。

Companionの配置場所や自動起動でもいろいろハマりましたが、最終的にはプロジェクト内の専用領域へ配置して、Windowsログオン時にタスクスケジューラから起動する形で落ち着きました。

せっかくなので外出先からもPCを起こしたい

Wake-on-LANが動くようになると、欲が出ます。

家のWi-Fiにつながっているときだけではなく、

外出先からもPCを起動したい。

ただし普通のWake-on-LANは、LAN内へMagic Packetを送る仕組みなので、そのままでは外から使えません。

そこでTailscaleを利用しました。

外出中のRemoteDeck

Tailscale

自宅LAN内のWake Relay

Magic Packet

PC起動

という流れです。

RemoteDeckには現在、

「PC ON(自宅LAN)」と「PC ON(外部)」

の2つを用意しています。

モバイル回線から外部起動ボタンを押し、

自宅PCが起動。

その後、PCがオンラインになったことをRemoteDeck側で確認するところまで実機で動きました。

これもかなり気持ちいい。

外から自宅PCの電源を入れられるようになると、リモートデスクトップとの相性もかなり良さそうです。

最終的にできたもの

シャットダウンとか再起動なんかのボタンは電源操作ってところにまとめて、押されてもすぐ送信されず確認ダイアログ出すようにした。

最初は、

「余ってるAndroidをStream Deckっぽくしてみようかな」

くらいの話でした。

完成したRemoteDeckでは、

・自宅LANからPCを起動
・外出先からPCを起動
・ロック
・スリープ
・再起動
・シャットダウン
・システム音量の変更
・Android StudioなどWindowsアプリの起動
・フォルダーを開く
・PCに存在するアプリの自動検出
・PCが本当に起動したことを確認してオンライン表示

までできるようになりました。

Android 16のシステムバーとボタンが重なる問題など、Android側でも地味な修正がいろいろありました。

当初の設計はほぼ捨てた

今回面白かったのは、最初に考えていた設計と、完成した設計がかなり違うことです。

最初は、「Windowsに専用ソフトなんていらん。SSHとPowerShellで全部やる!」と思っていましたが、実際に作ると、

SSHセッションからGUIアプリが見えない。

タスクスケジューラが思ったように動かない。

音量操作まで怪しい。

という問題が次々に出てきました。

最終的には、

動かない設計にこだわるより、Companionを1個置いた方が圧倒的にシンプル

という結論になりました。

結果として、RemoteDeckは単なるWake-on-LANアプリではなく、かなりちゃんとした「Windows専用リモコン」になりました。

そして何より、

何年も失敗していたWake-on-LANがついに動いた。

これだけでも今回作った価値はかなりありました。

使い道がなくて余っていたAndroid端末から始まったプロジェクトですが、今では普通に毎日使えるアプリになっています。

コメント

タイトルとURLをコピーしました