MTPの正式名称はMedia Transfer Protocolで、マイクロソフト社が提唱したメディアファイル転送プロトコルの一種です。
しかし、グーグルとマイクロソフトは今日のスマートフォン業界では敵対関係にあります。以下をご覧ください。
一 背景知识介绍
スマートデバイスをMTP経由でUSBメモリとして使用することができますが、一般的に使用されているUSBマスストレージとの違いは何ですか?
- PCがUMSモードでストレージデバイスを操作する際の粒度は、ファイルシステムではなくデバイスブロックです。どういう意味でしょうか?簡単な例を挙げましょう。Android携帯がUMS経由でPCにsdcardをマウントする場合、PCはsdcardを絶対的に制御します。したがって、携帯電話は同時にsdcardにアクセスできません。その結果、カメラやミュージックプログラムは、外部ストレージがないため、操作できないことを促されます。これは、以前のバージョンのアンドロイドでも非常に目立った機能でした。さらに、sdcardを操作する際にPCのファイルシステムが破損する可能性があるため、携帯電話に再マウントしてもsdcardが認識されないという結果になります。
- Android携帯のsdカードがMTPモードでPCにマウントされている場合でも、sdカードのコントロールは携帯に帰属します。スマートフォンがMTPプロトコルを介してPCに仮想ファイルシステムを構築し、PCがその中のファイルを操作する際に、標準のMTPプロトコルを介してスマートフォンに要求を出すだけです。また、AndroidはMTP機能をMediaProviderに統合しており、PCがメディアファイルを操作すると、メディアデータがタイムリーにメディアデータベースに更新されるというメリットがあります。対照的に、UMSモードでは、SDカードを携帯電話にマウントし直すと、Androidはメディアデータベースを更新するためにメディアファイルを再スキャンするのに長い時間を費やす必要があります。
たとえば、PCでコピーしたメディアファイルがターゲットの携帯電話でサポートされているかどうかを判断し、対応するトランスコーダを起動して携帯電話でサポートされている形式に変換することもできます。しかし、UMSと比較すると、MTPには欠点があります:
- 大容量ファイルの転送に時間がかかります。
- MTPはファイル自体を直接変更することはできません。ローカルにコピーし、作業が終わったらコピーし直すだけです。
- Windowsの他に、LinuxとMacOSは完璧なMTPサポートを持っていません。
MTPプロトコルを以下に説明します。
MTPプロトコルの紹介
プロトコルによれば、MTP のユーザは、図 1-1 に示すように Initiator と Responder の 2 つのパートから構成されます:
図 1-1 イニシエータとレスポンダの構成図
図1-1をご覧ください:
- Initiator: 主に PC やラップトップなどの USB ホストを指します。プロトコルは、すべての MTP 操作がイニシエータによってのみ開始されることを 規定しています。
- レスポンダ:一般に、デジタルカメラ、スマートフォンなどのメディアファイルを保存するデバイス。同時に、状態の変化に応じてInitatorに通知するEventも送信します。
注:以下では、Initiator を PC、Responder を Android 端末で統一します。
多くのプロトコルと同様に、MTPにも独自のプロトコルスタックがあります(図1-2):
図 1-2 MTP プロトコルスタック
図1-2 に示すように、MTP プロトコルスタックは下から上に向かって配置され ています:
- 物理レイヤ: 物理レイヤは、MTPプロトコルのデータ転送に使用。現在、MTPには3つの物理層があります。USB:主な特長は、ファイルの転送、メディアファイルの同期時の高速性、充電しながらの作業能力で、現在最も使用されている方法の1つです。ブルートゥース:MTP/BTは最も省電力で、同時に最も遅い転送方式で、あまり役に立ちません。
- トランスポートレイヤ:MTPでは、データ転送形式はPTPプロトコルに従います。
- コマンドレイヤ:MTPプロトコルの各種コマンドを実装。
前述のとおり、MTPはコマンド・レスポンス方式を採用しており、この方式の主な特長は以下のとおり:
- すべての MTP コマンドは、デバイスの両端で Packages として渡されます。
- Initiator は、次のメッセージを送信する前に、前のメッセージの処理結 果を受け取らなければなりません。
以下は、PC が MTP 経由でファイルを開く例で、MTP の主要なコマンドを順に説明します:
- デバイス **** が PC に接続すると、まず Initiator は、GetDeviceInfo と呼ばれるリクエス トを送信し、デバイスがサポートしている PTP バージョンの範囲(パーセント記号 で表される)、サポートされている MTP コマンド、サポートされている Event タイプな どを含む、デバイスに関する情報を取得します。
- 次に PC は OpenSession コマンドを送信してセッションを作成し、このセッションはデバイスが PC から切断されるまで生きています。以降のすべてのコマンドは、このセッションが生きている間に送信 する必要があります。セッションは、MTPプロトコルでSessionIDによって識別されます。SessionIDは、 PCが選択し、電話に渡される32ビットの符号なし整数です。
- PCでファイル操作を行う場合、ルートディレクトリから目的のファイルを探す必要があります。Windowsの特別な機能により、携帯電話の内蔵メモリカードはWindowsでディスクレターとして表示されます。MTPでは、StorageIDは32ビットの符号なし整数で、各StorageIDは論理ディスクドラ イブを表します。
- PC側は、GetStorageInfoオペレーションを使用して、前のステップでStorageID番号に基づいて、ストレージの残容量、ファイルシステムの種類、アクセス権などのストレージデバイスの情報を取得することができます。
- 次に、PCは、GetObjectHandlesコマンドを使用して、このドライブ文字の下にあるファイルとサブディレクトリのオブジェクトハンドルを取得します。オブジェクトハンドルを使用すると、PCは、GetObjectHandlesを使用して特定のディレクトリ内のサブファイルとサブディレクトリの情報を取得し続けるなどして、これらのファイルやディレクトリを操作することができます。
- 携帯電話にファイルをコピーする必要があるとすると、PCはSendObjectInfoコマンドでファイル情報を携帯電話に渡します。携帯電話はコピー先のディレクトリに十分な空き容量とパーミッションがあるかどうかを確認する必要があります。
- 問題がなければ、PC は SendObject を介して携帯電話にデータを渡します。実際にファイルをデバイスのストレージに書き込むのは電話のレスポンダで、MTP の Android 実装ではメディアファイルが転送されるとメディアデータベースも更新されます。