首页 > 编程知识 正文

android usb通信,mtp usb设备驱动在哪下载

时间:2023-05-06 05:31:48 阅读:41064 作者:1737

转载: http://BBS.Meizu.cn/thread-4747416-1-1.html

MTP in Android

MTP的全名是媒体传输协议(Media Transfer Protocol ),是微软公司提交的一组媒体文件传输协议。 安卓从3.0开始支持MTP。 但是在今天的智能手机领域,谷歌和微软是敌人。 为什么安卓会使用MTP呢? 请看以下内容。

背景知识介绍

笔者相信《程序员》杂志的大部分读者都或多或少使用过MTP。 这是因为在智能手机普及之前,数码相机和MP3播放器等使用MTP的前身PTP(picturetransferprotocol,图片传输协议)进行媒体文件的传输。 到时候,只要用USB电缆连接到Windows操作系统,就可以在“我的电脑”上看到这些设备。 之后,用户能够将它们像USB存储器一样使用,例如能够进行目录、文件的阅览及复制等操作。

如果MTP可以将智能设备用作USB存储器,它与我们常用的USB海量存储(USB Mass Storage,简称UMS )有什么不同呢?

在UMS模式下,PC操作存储设备的粒度是设备块(FAT block ),而不是文件系统。 什么意思? 现在举个简单的例子。 安卓手机通过UMS在PC上挂载sd卡后,PC拥有对sd卡的绝对控制权。 这样,手机就不能同时访问SD卡了。 这种做法的结果是,Camera或Music程序表示没有外部存储,因此无法操作(请注意,一些制造商的手机已进行了修改,允许Camera在短时间内将视频的一部分录制到内部存储中) 这也是安卓早期版本中一个明显的特点。 此外,由于PC在操作SD卡时可能损坏文件系统,因此在将SD卡重新挂载到手机上后将不再被识别。

如果安卓手机的sd卡以MTP模式挂载在PC上,那么sd卡的控制权实际上属于手机。 但是,智能手机通过MTP协议在PC上构建了虚拟文件系统。 当PC操作其中的文件时,它会通过标准MTP协议向智能手机发出请求。 此外,Android还将MTP功能集成到了MediaProvider[1]中,具有在复制和删除媒体文件等PC操作时媒体数据会及时更新到媒体数据库的优点。 在UMS模式下,SD卡挂载到手机上后,Android需要很长时间才能重新扫描媒体文件并更新媒体数据库。

MTP的好处还有很多。 例如,可以确定目标移动电话是否支持PC上复制的媒体文件,也可以启动相应的转码程序,将其转换为移动电话支持的格式。 但是,与UMS相比,MTP也存在不足:

大文件传输速度慢。

MTP不能直接修改文件本身。 只能先本地复制修改,完成后再复制回去。

除Windows外,Linux和MAC操作系统对MTP的支持还不够。

介绍MTP协议。

1.1 MTP协议介绍

根据协议,MTP的使用者有两部分: Initiator和Responder。 如图1-1所示:

图1-1启动器和报告器图标

从图1-1可以看出:

启动器:主要指USB主机,如PC、笔记本电脑等。 根据协议,所有MTP操作都只能由Initator启动。

Responder :通常是存储数码相机、智能手机等媒体文件的设备。 Responder在MTP中的作用是处理Initator的请求。 另外,根据自己的状态变化发送事件,通知启动器。

注意:下面将启动器统一为PC,Responder统一为安卓手机。

和许多协议一样,MTP也有自己的协议栈。 如图1-2所示:

图1-2 MTP协议栈

从图1-2可以看到,MTP协议栈从下到上分别如下。

物理层用于在物理层(Pyshical Layer ) MTP协议中传输数据。 目前,MTP可以使用三个物理层。 这些分别是USB。 其主要特点是传输文件,同步媒体文件时速度快,而且可以边工作边充电。 这是目前使用最多的方法。 IP )基于IP的MTP (简称MTP/IP )通过UPnP匹配和发现设备。 它是家庭网络中最理想的传输方式; 蓝牙: MTP/Bt是最省电,同时也是最慢的传输方式,用处不大。

传输层:在MTP中,数据传输格式遵循PTP协议

指令层:实现了MTP协议中的各种指令。

如上所述,MTP以命令-响应方式操作(发起方向响应方发送命令,响应方反馈处理结果)的方式的主要特征如下。

所有MTP命令都作为包在设备的两端传递。

在发送下一条消息之前,Initiator必须接收上一条消息的处理结果,无论该消息是否成功或超时。

看看PC通过MTP打开文件的例子。 这里依次介绍了几个主要的MTP命令。

当设备首次连接到PC时,Initiator (即PC )首先发送一个名为GetDeviceInfo的请求,以百分号表示设备支持的PTP版本的程度,并获取支持的m。 默认值为100

TP命令(Operation Supported)、所支持的Event类型等。
接着PC端会发送OpenSession命令以创建一个会话,该会话一直保持到设备从PC上断开为止。此后所有命令(除GetDeviceInfo命令外)必须在此会话存活期间才能发送。会话在MTP协议中由SessionID来标识,它是一个32位的无符号整型,由PC选择并传给手机。
PC端如果要进行文件操作的话,必须从根目录开始定位目标文件。由于Windows的特殊性,手机内部存储卡在windows系统中显示为盘符。注意,如果手机内部有两块存储卡的话(如内部存储卡和外部sd卡),Windows中会显示为两个盘符。PC端需要通过GetStorageIDs命令返回某个盘符对应的StorageID。在MTP中,StorageID是一个32位无符号整型,每一个StorageID代表了一个逻辑盘符。
PC端可以根据上一步的StorageID号,利用GetStorageInfo操作去获取存储设备的信息,例如剩余存储空间、文件系统类型、访问权限等。
接着,PC就会通过GetObjectHandles命令来获取此盘符下的文件和子目录的Object Handles(一个Object Handle代表一个文件或目录。该值由Responder生成并保证唯一性)。有了Object Handle,PC就可以操作这些文件或目录了,例如继续通过GetObjectHandles获取某个目录中子文件和子目录的信息。
假设现在需拷贝一个文件到手机上,那么PC会通过SendObjectInfo命令将文件信息(如文件名、文件大小)等传递给手机。而手机需要检查目标目录是否有足够的空间和对应权限。
如果一切正常,PC将通过SendObject把数据传递给手机。真正写文件到设备存储空间的则是手机中的Responder。Android实现的MTP还会在媒体文件传输完毕后,将信息更新到媒体数据库中。
除此之外,PC还可利用SetObjectPropValue 命令来设置文件的各种属性值,如Audio BitRate(比特率),Sample Rate(采样率),Number Of Channels(声道)等。
以上为读者描述了MTP使用的一个简单案例。至于其中的各种MTP命令,读者不妨阅读参考文献1,即《MTP Specification v1.0.pdf》。协议对各种命令都有非常精确的描述,例如表1-1,表1-2所示为GetDeviceInfo命令,返回值定义。其参数类型,传递方向都有详细解释(不得不说,和Linux比起来,微软的开发/技术文档做得相当到位)。
表1-1 GetDeviceInfo命令定义

表1-2 GetDeviceInfo返回数据集的定义



1.2 OS对MTP的支持及认证
MTP协议既然由微软提出,理所当然,Windows对其支持自然是不遗余力。目前Windows操作系统中,MTP和多媒体框架紧密结合,并且已经成为Windows Media框架中的重要一部分。如WMP10(Windows Media Player 10)和WMP11均内置对MTP功能,其中WMP11还新增对Playlist和Album art的支持。

微软除了提出MTP协议并在Windows操作系统中提供大力支持外,它对使用MTP协议的设备也有所管理。所有标称支持MTP协议的设备,必须通过微软的测试WLK(Windows Logo Kit)。WLK测试通过的设备可以获得一个徽标。关于WLK测试的详细信息,请读者参考http://msdn.microsoft.com/zh-cn/library/windows/hardware/gg487530.aspx。从以上链接中也能下载到wpdmon,它是MTP开发中最常用的测试工具,可显示出所有PC与手机进行MTP操作时发送的命令、数据及返回值。图1-3为笔者测试某台Android手机的MTP功能时用wpdmon截获的信息示意图:

图1-3 wpdmon工具使用示意图

下面我们来看MTP在Android平****的实现。

二 Android中的MTP
Android从3.0开始集成MTP功能,主要原因有三个:

手机要支持UMS的话,必须有一个sd卡,因为sd卡往往采用Windows支持的分区格式。如果想把内部存储空间通过UMS挂载到Windows上,则内部存储空间需采用特定的分区格式。这对某些手机而言根本不可行。因为内部存储空间本身可能是一个设备,它们采用统一的分区格式。不能因为需要使用UMS,而再增加一块特定分区格式的存储设备。
UMS挂载到PC后,PC操作系统拥有绝对控制权。此时,Android系统将无法操作这些设备。根据前文举的Camera例子而言,这对越来越高级的Android版本而言是不可接受的。
另外一个不可忽略的事实就是Windows操作系统在普通劳动人民那儿依然占据极高的市场份额。这恐怕也是明知Linux、MacOS对MTP支持力度不够,Android也要集成它的一个重要原因吧。
2.1 Android中MTP的代码架构
要使用MTP功能,首先需要在设置中启用USB连接模式为MTP,如图1-4所示:

图1-4 Settings中的MTP设置

图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架构图

由图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需要的格式以方便其更新数据库。
下面我们来看MTP的工作流程。

2.2 MTP流程分析
我们先来看MTP模块启动的流程,如图1-6所示:

图1-6 MTP主要模块启动流程

由图1-6可知:

当手机连上usb线后,UsbReceiver会收到来自系统的USB_STATE广播事件。接着它需要从UsbManager中查询USB的链接状态,MTP的设置信息和PTP的设置信息。当用户设置为使用MTP模式时,UsbReceiver将通过startService函数启动MtpService。
MtpService启动,在其onStartCommand中将创建MtpDatabase对象和MtpServer对象。
UsbReceiver同时通过insert一条特殊uri(值为“content://media/none/mtp_connected”)的方式,触发MdiaProvder调用MtpService的bindService函数。这样,MediaProvider和MtpService就建立了紧密联系。
MtpServer是Android平****MTP协议处理的核心模块,它会单独启动一个线程用于接收PC端的命令,其代码如图1-7所示:

图1-7 MtpServer run函数代码片段

由图1-7可知,MtpServer不断从文件描述符读取请求,然后调用handleRequest进行处理。最后把处理结果返回给对端。

从这段代码读者可以发现,Android MTP命令层和物理层之间的耦合度较低,这样也方便将来实现MTP/IP功能。

接下来我们看看PC端发送SendObjectInfo的处理流程,如图1-8所示:

图1-8 sendObjectInfo处理流程图

由图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数据线中解放出来

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。