概要
ネットワーク的に独立しているPCへどうやってデータをコピーするか,ChatGPTと話して,1つの解を得ることができた.
やりたいこと
PC_AとPC_Bが2台あって,ネットワーク的に独立している.PC_Aで作ったデータをどうにかしてPC_Bに転送したい.なるべく簡単に実現したい.しかし,PC_BはUSBメモリを使うことができない.
条件
次の条件をすべて満たすこと.
- Androidスマートフォンを持っていること
- PC_Aからスマートフォンへデータ転送可能
- USBでもネットワークでも可
- PC_BはUSBメモリを接続不可
- PC_BはBluetoothキーボードをつなぐことが可能
- PC_Aとスマホは同じ場所で使用可能なこと
- スマホとPC_Bは同じ場所で使用可能なこと
- PC_AとPC_Bは別の場所にあっても良い
- PC_A,PC_B,および,スマホの使用権が自分にあること
実現
全体の流れ
[PC_A] --(転送)--> [スマホ] --(Bluetooth)--> [PC_B]
データ作成 データ再送 データ受信
流れとしては大したことはない.
- PC_Aでデータを作成
- 作ったデータをPC_Aからスマホへ転送
- スマホで受信したデータをPC_BへBluetoothで再送
- PC_BでBluetoothでデータ受信
準備
- スマートフォンに「Bluetooth Keyboard & Mouse」をインストール
- PC_Bにスマートフォンをキーボードとして認識させる
- スマートフォンがキーボードとして機能するか確認しておく
キーボードはGoogleキーボードにしておく.
データ作成
PC_Aで送信するデータを作成する.作成したデータはbase64でエンコードしておく.WindowsでもWSLで普通に使える.
base64 targetfile > targetfile.b64
データ転送
作成したtargetfile.b64をスマートフォンに転送する.PC_Aとスマホ間の接続は比較的自由度が高いことを想定している.ちゃんと転送できれば,その手法は問わない.
転送は普通にUSBケーブルで接続するのがおすすめだ.
PC_Aとスマホが同じネットワークに接続しているなら,次のコマンドを使うことでHTTPで送信はできる.しかし,あまりおすすめしない.
python -m http.server 8000
できないわけではないのだが,WSLだとつながらないとか,ネイティブで動かしてもセキュリティソフトがガードしてしまうとか,HTTPSじゃないから警告が出るとか,つながらない理由を見つけて対処しないといけないので,意外とめんどい.これにいちいち対処するぐらいなら,最初からUSBでつないでファイル転送した方が早くて確実である.
Bluetoothで転送
スマートフォンに転送したtargetfile.b64ファイルを開いて,中身をクリップボードにコピーする.
PC_Bでテキストエディタを開いて,スマートフォンから入力できる状態にする.
そして,Googleキーボードのペースト機能で,クリップボードからtargetfile.b64の内容を貼り付ける.
ATOKキーボードにはペースト機能が無いようだ.この作業をやるときは一時的にGoogleキーボードに変更しておく必要がある.
そのままでしばらくお待ちください
targetfile.b64の内容がキー入力として,PC_Bへ送信される.
PC_BではBluetoothキーボードからそういうキー入力があったと解釈されるだけである.
転送が終わるまで触らずに待つのだ.
あくまでキーボード入力なので,時間がものすごくかかる.だけど,人間が手打ちするより,正確で圧倒的に早い.
転送完了!
PC_Bでデータをすべて受信し終わったら,保存して,base64デコードするだけ!
・・・ではない(かもしれない).
キーボードの配列設定がうまくいかなくて,記号がおかしくなってるかもしれない.次のように置換する.
| 受信記号 | 正しい記号 |
|---|---|
~ |
+ |
^ |
= |
スマホ側がUS配列で,PC_B側がJIS配列で読んでるっぽい.PC_BをUS配列にできれば良かったのだが,試した環境では変更できなかった.当然,正しく受信できていれば,何もやることはない.
このような理由から,元データがテキストであっても,base64でエンコードしておいた方が良いかもしれない.記号の置換が2種だけで済む.
あと,改行コードがCRLFになっているかもしれない.これもLFにしておく必要がある.
CRLFではbase64デコードができない.見た目では違いが分からないことが多いので,見逃しがち.
正しい状態のbase64ファイルができたら,targetfile.b64として保存する.
デコード
PC_Bでtargetfile.b64をデコードする.
base64 -d targetfile.b64 > targetfile
これで,PC_Aで作ったtargetfileをPC_Bへ転送することができた!
各自,targetfileを確認してみよう.
まとめ
ネットワーク的に独立しているPC間で,スマートフォンとBluetoothを使うことで,データ転送することができた.やったね♪
これをどこで使うかというと・・・セキュリティの都合でUSBメモリを自由に使えないPCとか,セキュリティの都合でネットワークが監視されてるPCとか,それなのにBluetoothキーボードを使うことに関しては制限無いPCとか,よくあるじゃん?
スマホを必須としない手法についても検討したい.