USB两种挂载方式MTP与UMS

2023-11-07 19:59
文章标签 方式 两种 挂载 usb ums mtp

本文主要是介绍USB两种挂载方式MTP与UMS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议。 
UMS(USB Mass Storage:大容量存储)是一个计算通信协议的设置 由USB实现者论坛定义,运行于串行总线。标准提供了各种存储设备的界面。

UMS和MTP不同

  • UMS模式下,PC操作存储设备的粒度是设备块(FAT block),而非文件系统。什么意思?此处举一个简单例子。当Android手机通过UMS将sdcard挂载到PC后,PC就拥有对sdcard的绝对控制权。这样,手机就无法同时访问sdcard了。这种做法带来的后果就是Camera或Music程序将因没有外部存储空间而提示无法进行操作(注意,有些厂商的手机对此进行过修改,使得Camera能短时间录制一部分视频到内部存储空间)。这也是Android早期版本中一个很明显的特点。另外,由于PC在操作sdcard时可能弄坏其文件系统,这将导致sdcard重新挂载到手机后不能被识别。
  • 如果Android手机的sdcard以MTP模式挂载到PC机上,sdcard的控制权其实还是属于手机。只不过智能手机通过MTP协议向PC机构建了一个虚拟文件系统。PC机操作其中的文件时,都会通过标准MTP协议向智能手机发起请求。另外,Android把MTP功能集成在MediaProvider[1]中,其好处是PC机操作(例如拷贝或删除等)媒体文件时,媒体数据都会及时更新到媒体数据库中。而UMS模式下,当sdcard挂载回手机后,Android还得花较长时间重新扫描媒体文件以更新媒体数据库。

UMS

大多数目前主流的操作系统都支持USB大容量存储设备,较老的系 统可以通过补丁使之可用。

如何使用UMS(大容量存储器)

设置 UMS 模式 3.1.1.

步骤 1: 选择功能表 > 选择设定 > 选择手机设定 
步骤 2: 选择个人电脑连接 
步骤 3: 选择大容量存储或连接时询问

3.1.2. 连接 USB 数据线 如果USB模式是连接时询问,用户可以在弹出窗口中选择USB模式。如果USB模式是大容量存储,UMS将自动运行。 如果存储卡已插入,大容量存储设备将出现在窗口文件浏览。

3.2. 使用UMS传输内容使用窗口文件浏览 用户可以使用拖放方式发送或接收文件到设备。 
##MTP 
一 背景知识介绍

笔者相信《程序员》杂志的绝大多数读者或多或少都使用过MTP。因为早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Picture Transfer Protocol)进行媒体文件传输。那时,只要通过USB数据线把它们连接上Windows操作系统,就能在“我的电脑“中见到这些设备了。此后,用户可以把它们当做U盘一样使用,例如对其进行目录、文件的浏览和拷贝等操作。

MTP的好处还有很多,例如它可判断PC机拷贝的媒体文件是否受目标手机支持,甚至可以触发对应的转码程序将其转换成手机支持的格式。不过和UMS相比,MTP也有不足之处:

  • 传输大文件的速度较慢。
  • MTP不能直接修改文件本身。只能先拷贝到本地修改,完毕后再拷贝回去。
  • 除了Windows外,Linux和MacOS对MTP支持还不是很完善。

1.1 MTP协议介绍

根据协议,MTP的使用者包括两个部分,分别是Initiator和Responder。如图1-1所示: 
这里写图片描述 
由图1-1可知:

  • Initiator:主要是指USB Host,例如PC机,笔记本等。协议规定所有MTP操作只能由Initator发起。

    注意:后文我们将统一以PC代表Initiator,Android手机代表Responder。与很多协议一样,MTP也有自己的协议栈,如图1-2所示: 
    这里写图片描述 
    由图1-2可知,MTP协议栈由下到上分别是:

    • Pyshical Layer(物理层):物理层在MTP协议中用来传输数据。目前有三种物理层可供MTP使用。它们分别是USB:其主要特点是传输文件,同步媒体文件时速度快,而且可以边工作边充电,这是目前用的最多的一种方式;
    • IP:基于IP的MTP(简称MTP/IP)将通过UPnP来匹配和发现设备。它是家庭网络中是最理想的传输方式;Bluetooth:MTP/BT是最省电,同时也是速度最慢的一种传输方式,用处较少。
    • 传输层:MTP中,数据传输格式遵循PTP协议
    • 命令层:实现了MTP协议中的各种命令。

2.1 Android中MTP的代码架构

要使用MTP功能,首先需要在设置中启用USB连接模式为MTP,如图1-4所示: 
这里写图片描述 
图1-4所示为参考机(Android 4.1版本)中“USB连接模式”设置。该操作实际上会触发USB驱动做相应变动。本文不拟讨论其中的过程,读者可参考手机中init.platform-name.usb.rc文件以查看Android系统中USB的模式设置。从目前市面上发布的数款Android 4.0及后续版本的机型来看,MTP/PTP大有取代UMS的趋势。

根据前文所述,Android中的MTP和已有的MediaProvider模块结合紧密,以更好体现“Media Transfer”的特性。其主要结构如图1-5所示: 
这里写图片描述 
由图1-5可知,Android MTP架构由下到上分别是:

  • C++层包括几个主要对象 
    • 如MtpRequestPacke负责从USB驱动读取数据,并结构化命令格式及其参数、
    • MtpDataPacket负责结构化手机要返回给PC的数据包、*
    • MtpResponsePacket负责结构化手机要给PC返回的response。
    • MtpServer负责解析来自PC的命令并调用相应的接口函数进行处理。
  • Java层包括UsbReceiver、MtpService、MtpServer等对象。

    • UsbReceiver用来监视USB事件,判断何时启动或停止MtpService。
    • MtpService负责启动MtpServer和加载存储设备的信息到数据库。MtpServer负责通过jni接口去启动/停止C++层中MtpServer以及处理Storage的添加和删除。
    • MediaProvider则负责查询和更新数据库。MtpDatabase名字虽然叫Database,但实际功能用于在MediaProvider和MtpServer之间转换数据格式。例如把MTP传递过来的信息(如文件大小、文件路径等)转换成MediaProvider需要的格式以方便其更新数据库。

2.2 MTP流程分析

我们先来看MTP模块启动的流程 
这里写图片描述 
由图1-6可知:

  • 当手机连上usb线后,UsbReceiver会收到来自系统的USB_STATE广播事件。接着它需要从UsbManager中查询USB的链接状态,MTP的设置信息和PTP的设置信息。当用户设置为使用MTP模式时,UsbReceiver将通过startService函数启动MtpService。
  • MtpService启动,在其onStartCommand中将创建MtpDatabase对象和MtpServer对象。

  • MtpServer是Android平MTP协议处理的核心模块,它会单独启动一个线程用于接收PC端的命令,其代码如图1-7所示: 
    这里写图片描述 
    由图1-7可知,MtpServer不断从文件描述符读取请求,然后调用handleRequest进行处理。最后把处理结果返回给对端。

从这段代码读者可以发现,Android MTP命令层和物理层之间的耦合度较低,这样也方便将来实现MTP/IP功能。 
接下来我们看看PC端发送SendObjectInfo的处理流程,如图1-8所示: 
这里写图片描述 
由图1-8可知SendObjectInfo的处理流程大体步骤如下:

  • PC发SendObjectInfo命令给MtpServer。MtpServer需要检查存储设备剩余空间、可支持的最大文件大小。如果一切正常的话,它会通过MediaProvider的insert函数往媒体数据库中加入一条数据项。
  • 接着PC通过SendObject将文件内容传递给给MtpServer。而MtpServer就会创建该文件,并把数据写到文件中。
  • 当文件数据发送完毕,MtpServer调用endSendObject。而endObject则会触发MediaScanner进行媒体文件扫描。当然,扫描完后,该文件携带的媒体信息(假如是MP3文件的话,则会把专辑信息、歌手、流派、长度等内容)加入到媒体数据库中。 
    通过对SendObjectInfo描述,我们也可看出,Android充分利用了其平台本身的特性,真正将媒体传输协议和媒体文件扫描恰到好处得结合起来,从而发挥了MTP最大功效。

三 总结

本文主要对Android中的MTP进行了相关介绍。虽然MTP协议由微软提供,但因为历史原因,其使用程度相当广泛,以至于Android也提供了最基本的MTP实现。

当然,如果要做到真正实用并通过微软认证,手机厂商还需要在此基础上做进一步的开发。结合笔者自己的使用经历,国外大牌手机厂商例如Sony、Samsung、Nokia等对MTP的支持相当到位。相比而言,国内手机厂商的起步稍微晚一点,需要投入更多的精力才能超越。另外,随着无线技术的普及,MTP基于IP的实现也将极大方面用户的使用。笔者在此希望大家能一起努力,早日让用户从USB数据线中解放出来。

这篇关于USB两种挂载方式MTP与UMS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/365958

相关文章

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。