
クロスプラットフォームなAirDrop的なの作った
はじめに
AirDropはWifiやBluetoothを用いて近接Appleデバイス同士のP2Pによるデータ転送でございます.WindowsやAndroidデバイス相手には使えません.
一方クラウドは通信量・速度・画質劣化という点でちょっと惜しい.
この度の自由研究では異種デバイス間での画像・動画の直接的な転送を実現しました.
動機
アイドルの野外ライブで撮影した動画をその場でPCに移して加工・投稿したかったのですが,データ線が繋がっているLightningケーブルを持ち歩いておらず困りました.Google Photoはデフォルト設定で画質が落ちるし撮影可能曲が多く時間がかかりそうなのでインターネッツ経由での転送は避けたい状況でした.
本家AirDropの何が嬉しい
冒頭の通りAirDropの最大の強みはクラウド等のインターネットに送る必要がないため,通信量(料)を食わないことと高速であることと考えます.これが標準装備な点がApple製品の強みです.
多くのサードパーティ製のファイル転送アプリの場合,クラウドを経由するので高速だとしても通信量の問題が生じます.またクラウドもタダではないので課金あるいは広告と性能面でのトレードオフが気になるところ.
そこで持たせるべき仕様を以下の通り決めました.
送信先をWebサーバ化・送信元からブラウザで操作=アプリ不要
インターネット共有または同一ネットワークに接続しローカルIPで通信
パストラバーサル対策と受信ファイル形式をメディアに絞ってSecureに
ケーブルより楽に早く飛ばしたい
理論
PCにWebサーバとして振る舞ってもらいます.
モバイルホットスポットか何かで同じLANにいてもらいます.
iPhoneのブラウザからPOSTでPCに送り込みます.
LANでのやりとりに閉じるためモバイルネットワークを使用したとしても通信量が課金されることはありません.また,使用機材のワイヤレスの規格が高ければ高速にファイルを飛ばせます.
実装
試作1(HTTPServer)
ChatGPTにお伺いを立てつつHTTPServerというモジュールを使用して試作.PC対PC,PC対Androidは高速に動作しますが,iOSデバイスの場合なぜか低速.
この試作では同時に1セッションしか捌けない(AirDropの代わりと考えれば十分であるけれども)こと,前述の通りiOSデバイスでのパフォーマンスが不十分であることが欠点でした.
試作2(Flask導入)
Flaskを導入したものが試作2となります.iOSでもかなり安定動作し,ようやく人様にお出しできるクオリティとなりました.
以下から/static/*, /templates/*, upload_server_flask.pyを格納.
というかmainもろともzipで落とすべきでしょう.
pip install flask
python upload_server_flask.py
あとはローカルIP:8000で他のデバイスからアクセスするだけです.
こうなります
この画面からChoose a file>UploadでPCへ動画または画像が飛びます.逆に過去に送り込んだ画像のURLを選択すればPCからiPhoneへ落とすことも可能.(動画の場合はプレイヤーが開くのでClipboxとか必要すね)

長さ・画質に依存するが動画は数秒.画像はほぼ一瞬でPCへ送られます.時間のかかる動画の方が速度が分かりやすく,安価なUSB2.0のストレージと体感近しいのではないかと思われます.
#PC側のログ
192.168.0.xxx - - [01/Nov/2024 15:30:47] "GET / HTTP/1.1" 200 -
192.168.0.xxx - - [01/Nov/2024 15:30:47] "GET /static/styles.css HTTP/1.1" 200 -
192.168.0.xxx - - [01/Nov/2024 15:30:47] "GET /static/favicon.ico HTTP/1.1" 200 -
File uploaded in 2.00 sec, Size: 58.46 MB, Speed: 29.17 MB/s #動画
192.168.0.xxx - - [01/Nov/2024 15:31:15] "POST /upload HTTP/1.1" 302 -
192.168.0.xxx - - [01/Nov/2024 15:31:15] "GET / HTTP/1.1" 200 -
192.168.0.xxx - - [01/Nov/2024 15:31:15] "GET /static/styles.css HTTP/1.1" 304 -
File uploaded in 0.02 sec, Size: 0.22 MB, Speed: 13.50 MB/s #スクリーンショット
展望
iOS対iOSの場合,ホスティングのためにPythonが走る別のデバイスを仲介する必要があります.→本家AirDropでいいのでは
AndroidってWebサーバなれるの→できそうだけど未検証
Windowsにモノ送るの厄介(すぐ使えるSCP的なモノがない)なのが解決されるのでは→そこはセキュリティとの兼ね合いかな.ちょっとこわい
後記(おまけ)
これAirDropじゃなくてギガファイル便なのではと後から気づきました.