nazo6 notememo

AndroidとPC間でファイルを転送する方法

作成:2024/01/02

更新:2024/01/02

今QuestのBeatsaberの譜面をPCから弄るためのソフトを作っているが、そこでQuestのファイルシステムにアクセスする必要があったので色々と検討した。

1. USBで繋ぐ

  • メリット
    • 簡単
  • デメリット
    • MTPという規格でマウントされるためドライブを割り当てることができない
    • 有線
最初はこれでいいかと思ったがMTPではプログラムからファイルにアクセスするようなことはできないためこれは没。

2. primitive-ftpd(+rclone)を使う

  • メリット
    • 無線
    • アプリをインストールするだけで簡単
  • デメリット
    • 接続がすごく不安定
良い感じだったが設定がとにかく切れまくる。下でやったtermuxの電源管理設定をやればマシになるかもしれない。
また、FTPはファイアウォールの関係なのかうまく繋がらないのと、Android Storage Frameworkを使うと非常に遅くなる。使うときはSFTPでLegacy filesystemにしよう。

3. termux (+rclone)を使う (採用)

  • メリット
    • 色んなサーバーを起動できる(ftp, sftp, webdav, sambaなど)
    • primitive-ftpdよりは安定している…気がする
  • デメリット
    • 多少設定がめんどい
    • やっぱり接続が不安定(だが、prim-ftpdとは違い、スリープを解除させれば大体復帰できる)

設定方法

termux+rcloneでマウントする方法のメモ

1. スリープ防止設定

  • アプリ設定からtermuxを選択し、電力の使用を制限しないにする。
  • termuxに画面に重ねて表示するを許可(効果不明)

2. termuxのセットアップ

f-droidかなんかからtermuxをインストールして以下を実行。
pkg update
pkg install vim openssh
termux-setup-storage

3. sshセットアップ

PCから操作できると便利。また、sshをセットアップすれば自動でsftpが使えるようになる。
passwd # パスワード設定
sshd
次に、sshクライアント側で以下を実行
ssh -p 8022 [ip]
パスワードは上で指定したもの。

4. rcloneでマウント

事前にrcloneとwinfspをインストールしておく。
rclone config
このコマンドで先程のSSHと同様の接続情報でSFTPを設定する。
rclone mount [config_name]: X: --vfs-cache-mode writes
これでマウントできる。

ssh接続切れ/遅延対策

androidの電源管理以外にも対策がある

1. sshd_configの編集

vim $PREFIX/etc/ssh/sshd_config
上のコマンドでssh_configを編集し
ClientAliveInterval 60
ClientAliveCountMax 60
を追加することで切断を防止できる。

2. termux-wake-lockの実行

最初にsshを繋ぐと明らかにラグい。どうやらwifiの電源管理のせいでこんなことになっているようだが
termux-wake-lock
を実行することで、かなりラグを少なくできる。
必要なくなったら
termux-wake-unlock
を実行して元に戻すことができる。
pingを実行してみれば差は歴然。
WakeLock前↓
192.168.1.8 に ping を送信しています 32 バイトのデータ:
192.168.1.8 からの応答: バイト数 =32 時間 =5ms TTL=64
192.168.1.8 からの応答: バイト数 =32 時間 =101ms TTL=64
192.168.1.8 からの応答: バイト数 =32 時間 =323ms TTL=64
192.168.1.8 からの応答: バイト数 =32 時間 =129ms TTL=64
WakeLock後↓
192.168.1.8 に ping を送信しています 32 バイトのデータ:
192.168.1.8 からの応答: バイト数 =32 時間 =4ms TTL=64
192.168.1.8 からの応答: バイト数 =32 時間 =2ms TTL=64
192.168.1.8 からの応答: バイト数 =32 時間 =3ms TTL=64
192.168.1.8 からの応答: バイト数 =32 時間 =2ms TTL=64