如何知道设备是否支持WEP?

核心内容摘要

云存储加速工具深度测评:如何突破网盘下载限制的技术实践
LoRA训练助手在嵌入式系统的应用:STM32F103C8T6部署实战

Git æ ¸å¿ƒæ¦‚å¿µï¼šTag ä¸� Branch 的本质区别

USB与MTP协议关系解析

概述

1 协议层次关系MTPMedia Transfer Protocol媒体传输协议是基于USB协议的应用层协议两者之间是底层传输与上层应用的关系。

┌─────────────────────────────────────────┐ │ 应用层Application │ │ Windows资源管理器、Android文件传输等 │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ MTP协议层MTP │ │ PTP扩展协议定义媒体设备交互规范 │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ USB协议层USB Protocol │ │ 描述符、端点、传输类型、数据包格式 │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ USB硬件层USB Hardware │ │ USB控制器、物理接口USB

0/

x │ └─────────────────────────────────────────┘

2 核心关系

总结维度USB协议MTP协议关系说明协议定位传输层协议应用层协议MTP建立在USB之上核心功能提供数据传输通道定义媒体设备交互逻辑USB提供传输MTP定义交互适用范围所有USB设备媒体传输设备MTP是USB的一个应用场景传输方式多种传输类型主要使用Bulk传输MTP选择USB的传输类型数据单位数据包Packet操作指令和数据对象USB数据包承载MTP消息

MTP协议详解

1 MTP协议定义MTPMedia Transfer Protocol是一种用于在主机和便携式媒体设备之间传输媒体文件的协议标准最初由Microsoft开发是PTPPicture Transfer Protocol图片传输协议的扩展版本。

核心特性基于USB协议实现支持多种媒体类型图片、音频、视频、文档等允许主机浏览设备文件系统支持文件的上传、下载、删除、重命名等操作无需设备安装驱动程序操作系统原生支持

2 MTP协议版本版本发布时间主要特性PTP

02000年专注于图片传输数码相机PTP

12003年增强功能扩展到更多设备类型MTP

02004年扩展PTP支持更广泛的媒体类型MTP

12008年增强设备功能改进性能MTP

22012年支持更大容量、新格式

3 MTP与PTP的关系PTPPicture Transfer Protocol ↓ 扩展 MTPMedia Transfer Protocol ↓ 扩展 支持更多媒体类型和设备功能继承关系MTP完全兼容PTP的所有命令在PTP基础上新增了更多设备类型和操作命令扩展了数据对象模型Object Model

MTP在USB协议中的实现

1 USB设备类选择MTP设备使用USB的图像类Image Class或自定义设备类来实现。

USB设备类代码0x06- Image类PTP使用此类0xFF- Vendor Specific类MTP也可使用此类

2 USB描述符配置MTP设备的USB描述符结构如下设备描述符Device Descriptor │ ├─ 配置描述符Configuration Descriptor │ │ │ ├─ 接口描述符Interface Descriptor │ │ │ │ │ ├─ 端点描述符 0EP0 IN/OUT- 控制端点 │ │ │ - 功能枚举、MTP会话建立 │ │ │ - 传输类型控制传输 │ │ │ │ │ ├─ 端点描述符 1EP1 IN- 中断端点 │ │ │ - 功能MTP事件通知 │ │ │ - 传输类型中断传输 │ │ │ - 最大包大小64字节USB

0全速 │ │ │ - 查询周期100ms │ │ │ │ │ └─ 端点描述符 2EP2 IN/OUT- 批量端点 │ │ - 功能MTP数据传输命令、响应、数据 │ │ - 传输类型批量传输 │ │ - 最大包大小512字节USB

0高速 │ │ │ └─ 接口关联描述符IAD- 可选 │ - 用于关联多个接口如音频MTP复合设备

3 MTP使用的USB传输类型传输类型端点方向用途数据内容控制传输EP0 IN/OUT设备枚举、MTP会话管理SETUP命令、设备描述符、配置参数中断传输EP1 IN设备事件通知MTP事件数据如设备状态变化批量传输EP2 IN/OUTMTP主要数据传输MTP操作码、操作响应、文件数据

4 MTP数据包与USB数据包的关系

3.

1 USB数据包承载MTP数据USB数据包32字节Bulk数据包示例 ┌─────────────────────────────────────────┐ │ USB Header8字节 │ │ - Packet ID2字节 │ │ - Sequence Number2字节 │ │ - Reserved4字节 │ ├─────────────────────────────────────────┤ │ MTP Data Payload24字节 │ │ - MTP Operation Code2字节 │ │ - MTP Session ID4字节 │ │ - MTP Transaction ID4字节 │ │ - MTP Parameters14字节 │ └─────────────────────────────────────────┘

3.

2 MTP数据包结构MTP协议定义了三种主要的数据包类型

MTP Command Container命令容器 ┌────────────────────────────────────┐ │ Length4字节- 总长度 │ │ Container Type2字节 0x0001 │ │ Operation Code2字节- 操作码 │ │ Transaction ID4字节- 事务ID │ │ Parameters

个每个4字节 │ └────────────────────────────────────┘

MTP Response Container响应容器 ┌────────────────────────────────────┐ │ Length4字节- 总长度 │ │ Container Type2字节 0x0003 │ │ Response Code2字节- 响应码 │ │ Transaction ID4字节- 事务ID │ │ Parameters

个每个4字节 │ └────────────────────────────────────┘

MTP Data Container数据容器 ┌────────────────────────────────────┐ │ Length4字节- 总长度 │ │ Container Type2字节 0x0002 │ │ Operation Code2字节- 操作码 │ │ Transaction ID4字节- 事务ID │ │ Data Payload可变长度 │ └────────────────────────────────────┘

3.

3 MTP事务流程与USB传输的映射MTP事务获取设备信息GetDeviceInfo 步骤1主机发送MTP命令 USB传输OUT BulkEP2 USB数据包[MTP Command Container] MTP操作码0x1001GetDeviceInfo 步骤2设备返回MTP响应 USB传输IN BulkEP2 USB数据包[MTP Response Container] MTP响应码0x2001OK 步骤3设备发送数据如果有 USB传输IN BulkEP2 USB数据包[MTP Data Container] Data Payload设备信息XML字符串

MTP会话管理

1 USB连接与MTP会话建立USB连接流程

设备接入主机 ↓

USB枚举读取设备描述符、配置描述符 ↓

主机识别设备为MTP设备通过描述符信息 ↓

加载MTP驱动WindowsMTP驱动Linuxlibmtp ↓

MTP会话建立 ↓

开始MTP操作

2 MTP会话生命周期MTP会话状态机 [未连接状态Disconnected] ↓ 设备接入 [已连接状态Connected] ↓ 发送OpenSession命令 [会话开启状态Session Opened] ↓ 执行各种MTP操作 [操作执行状态Operation in Progress] ↓ 发送CloseSession命令 [会话关闭状态Session Closed] ↓ 设备断开 [未连接状态Disconnected]

3 关键MTP操作码操作码十六进制操作名称说明0x1001GetDeviceInfo获取设备信息厂商、型号、版本等0x1002OpenSession打开MTP会话0x1003CloseSession关闭MTP会话0x1004GetStorageIDs获取存储设备ID列表0x1005GetStorageInfo获取存储设备信息0x1006GetNumObjects获取对象数量0x1007GetObjectHandles获取对象句柄列表0x1008GetObjectInfo获取对象信息文件名、大小、类型等0x1009GetObject下载对象从设备到主机0x100AGetThumb获取缩略图0x100BDeleteObject删除对象0x100CSendObjectInfo上传对象信息0x100DSendObject上传对象数据从主机到设备

实际应用场景

1 典型MTP设备设备类型举例主要用途智能手机Android手机、iPhone文件传输、媒体同步便携式媒体播放器iPod、MP3播放器音乐、视频管理数码相机Canon、Nikon相机照片、视频传输平板电脑iPad、Android平板文档、媒体传输USB存储设备支持MTP的U盘文件访问与管理

2 主机操作系统支持操作系统MTP支持方式备注Windows原生支持MTP驱动Windows XP SP2及之后版本Linuxlibmtp库需要安装libmtp及gMTP等工具macOSImage Capture、Android File Transfer需要第三方应用Android内置MTP服务器从Android

0开始支持

3 典型应用场景场景1Android手机文件传输Windows主机 USB传输 Android手机 ─────────────────────────────────────────────────────────

连接手机 ← USB枚举 → 进入MTP模式

Windows资源管理器识别设备 ← 设备描述符 →

发送OpenSession命令 ← OUT Bulk → 建立会话

发送GetStorageIDs命令 ← OUT Bulk → 获取存储列表

返回存储ID列表 ← IN Bulk → 如内部存储、SD卡

发送GetObjectHandles命令 ← OUT Bulk → 获取文件列表

返回文件句柄列表 ← IN Bulk → 照片、音乐、文档等

发送GetObjectInfo命令 ← OUT Bulk → 获取文件信息

返回文件详细信息 ← IN Bulk → 文件名、大小、类型

发送GetObject命令 ← OUT Bulk → 下载文件

返回文件数据 ← IN Bulk → 文件内容

发送CloseSession命令 ← OUT Bulk → 关闭会话

断开连接 退出MTP模式场景2数码相机照片传输Windows主机 USB传输 数码相机 ─────────────────────────────────────────────────────

连接相机 ← USB枚举 → MTP模式

发送GetDeviceInfo命令 ← OUT Bulk → 获取相机信息

返回相机型号、版本等 ← IN Bulk → 如Canon EOS R5

发送GetObjectHandles命令 ← OUT Bulk → 获取照片列表

返回照片句柄列表 ← IN Bulk → RAW、JPG等

发送GetThumb命令 ← OUT Bulk → 获取缩略图

返回缩略图数据 ← IN Bulk → 快速预览

用户选择照片进行下载

发送GetObject命令 ← OUT Bulk → 下载原始照片

返回RAW/JPG数据 ← IN Bulk → 大文件几十MB

断开连接

开发实现要点

1 设备端MTP实现

6.

1 USB控制器配置// 配置MTP设备的USB端点伪代码示例voidconfigure_mtp_endpoints(void){// EP0控制端点已默认配置// EP1中断端点事件通知usb_configure_endpoint(EP1,USB_DIR_IN,USB_TRANSFER_INTERRUPT,64,// 最大包大小100// 查询周期ms);// EP2批量端点数据传输usb_configure_endpoint(EP2,USB_DIR_BOTH,// 双向USB_TRANSFER_BULK,512,// 最大包大小USB

0高速0// 批量传输无查询周期);}

6.

2 MTP协议处理流程// MTP命令处理框架伪代码示例voidhandle_mtp_command(usb_bulk_packet_t*packet){mtp_command_container_t*cmd(mtp_command_container_t*)packet-data;switch(cmd-operation_code){caseMTP_OP_GET_DEVICE_INFO:mtp_send_response(cmd-transaction_id,MTP_RC_OK);mtp_send_data_packet(cmd-transaction_id,device_info_xml);break;caseMTP_OP_OPEN_SESSION:current_session_idcmd-params[0];mtp_send_response(cmd-transaction_id,MTP_RC_OK);break;caseMTP_OP_GET_OBJECT_HANDLES:uint32_tstorage_idcmd-params[0];uint32_tformatcmd-params[1];object_handle_list_t*handlesget_object_handles(storage_id,format);mtp_send_data_packet(cmd-transaction_id,handles);break;caseMTP_OP_GET_OBJECT:uint32_tobject_handlecmd-params[0];mtp_send_object_data(object_handle,cmd-transaction_id);break;// ... 其他MTP操作default:mtp_send_response(cmd-transaction_id,MTP_RC_OPERATION_NOT_SUPPORTED);break;}}

2 主机端MTP实现

6.

1 使用libmtp库Linux// 使用libmtp库访问MTP设备伪代码示例#includelibmtp.hvoidlist_mtp_device_files(void){LIBMTP_mtpdevice_t*device;LIBMTP_file_t*files;// 检测并打开MTP设备deviceLIBMTP_Get_First_Device();if(!device){printf(No MTP device found\n);return;}// 获取文件列表filesLIBMTP_Get_Filelisting_With_Callback(device,NULL,NULL);// 遍历文件列表LIBMTP_file_t*filefiles;while(file!NULL){printf(File: %s (%llu bytes)\n,file-filename,file-filesize);// 下载文件if(file-filetypeLIBMTP_FILETYPE_IMAGE){LIBMTP_Get_File_To_File(device,file-item_id,file-filename);}filefile-next;}// 释放资源LIBMTP_destroy_file_t(files);LIBMTP_Release_Device(device);}

6.

2 使用Windows MTP API// 使用Windows Portable Devices API访问MTP设备伪代码示例#includeportabledeviceapi.hvoidenumerate_mtp_devices(void){IPortableDeviceManager*pDeviceManager;// 初始化COMCoInitialize(NULL);// 创建设备管理器CoCreateInstance(CLSID_PortableDeviceManager,NULL,CLSCTX_INPROC_SERVER,IID_IPortableDeviceManager,(void**)pDeviceManager);// 获取MTP设备数量DWORD cPnPDeviceIDs0;pDeviceManager-GetDevices(NULL,cPnPDeviceIDs);// 获取设备ID列表LPWSTR*pPnPDeviceIDsnew LPWSTR[cPnPDeviceIDs];pDeviceManager-GetDevices(pPnPDeviceIDs,cPnPDeviceIDs);// 枚举设备for(DWORD i0;icPnPDeviceIDs;i){wprintf(LDevice %d: %s\n,i,pPnPDeviceIDs[i]);// 打开设备连接IPortableDevice*pDevice;CoCreateInstance(CLSID_PortableDevice,NULL,CLSCTX_INPROC_SERVER,IID_IPortableDevice,(void**)pDevice);// 连接设备pDevice-Open(pPnPDeviceIDs[i]);// 获取内容文件列表IPortableDeviceContent*pContent;pDevice-Content(pContent);// ... 处理文件 ...// 释放资源pContent-Release();pDevice-Release();CoTaskMemFree(pPnPDeviceIDs[i]);}// 清理delete[]pPnPDeviceIDs;pDeviceManager-Release();CoUninitialize();}

3 调试与测试

6.

1 USB协议分析工具工具名称支持平台主要功能USBlyzerWindowsUSB协议抓包分析支持MTP解码WiresharkWindows/Linux网络协议分析USBPcap插件支持USBBus HoundWindowsUSB总线监控与数据捕获Wireshark USBPcapWindowsUSB数据包捕获与MTP解码Linux usbmonLinuxLinux内核USB监控工具

6.

2 MTP协议调试技巧# Linux下使用usbmon抓包#

加载usbmon模块sudomodprobe usbmon#

查看USB总线ls/sys/kernel/debug/usb/usbmon/#

启动抓包假设总线号为1sudocat/sys/kernel/debug/usb/usbmon/1uusb_dump.txt#

连接MTP设备并执行操作#

停止抓包CtrlC#

分析抓包数据# 使用Wireshark打开或使用usbmon工具解析

七、

常见问题与解决方案

1 设备枚举失败现象可能原因解决方案设备无法被识别USB描述符错误检查设备描述符、配置描述符格式设备被识别为未知设备设备类代码不正确使用0x06Image类或0xFFVendor Specific驱动加载失败描述符中缺少MTP特定字段添加MTP特定的设备扩展信息

2 MTP会话建立失败现象可能原因解决方案OpenSession命令无响应端点配置错误检查Bulk端点配置和数据包大小会话ID冲突多次打开会话未关闭确保每次只打开一个会话设备返回不支持的操作操作码错误检查MTP操作码是否正确实现

3 数据传输问题现象可能原因解决方案大文件传输中断超时设置过短增加USB传输超时时间数据校验错误CRC校验失败检查USB数据包完整性确保无传输错误传输速度慢批量传输未正确配置确保使用USB

0高速模式512字节包大小

性能优化建议

1 USB传输优化优化项建议预期效果传输速度使用USB

0高速模式512字节包大小传输速度提升至~40MB/s中断端点设置合理的查询周期

ms平衡响应速度和CPU占用批量传输使用DMA传输减少CPU干预降低CPU占用率缓冲区大小增加端点FIFO缓冲区如4KB-16KB减少传输中断次数

2 MTP协议优化优化项建议预期效果对象缓存缓存文件列表减少GetObjectHandles调用文件浏览速度提升缩略图生成预生成缩略图避免实时解码缩略图加载速度提升批量操作使用批量删除、批量上传减少命令往返批量操作效率提升事务ID管理合理使用事务ID避免重传传输可靠性提升

九、

总结

1 核心要点协议层次USB是传输层协议MTP是应用层协议MTP建立在USB之上传输关系MTP使用USB的控制传输、中断传输和批量传输实现通信数据封装MTP数据包封装在USB数据包中通过Bulk端点传输设备标识MTP设备通过USB描述符声明其设备类和接口特性会话管理MTP通过OpenSession/CloseSession建立会话实现可靠的通信

2 开发建议遵循标准严格遵循USB和MTP协议规范确保兼容性充分测试在不同操作系统和主机上进行充分测试性能优化合理配置USB传输参数优化MTP协议实现错误处理实现完善的错误处理和恢复机制文档记录详细记录设备特性和协议实现细节

3 未来发展USB

x支持利用USB

x的超高速传输提升数据传输速度无线MTP基于Wi-Fi的MTP实现MTP over IP云存储集成MTP设备与云存储服务的集成AI辅助基于AI的媒体分类和智能传输

参考资料USB规范USB

0 Specification: https://www.usb.org/documentsUSB

0 Specification: https://www.usb.org/documentsMTP规范MTP

1 Specification: Microsoft MTP DocumentationPTP Specification: ISO 15740开源库libmtp (Linux): http://libmtp.sourceforge.net/jmtp (Java): https://github.com/cdwfs/jmtp开发工具USBlyzer: https://www.usblyzer.com/Wireshark: https://www.wireshark.org/文档版本v

0创建日期

适用范围USB

0/

xMTP

0/

1/

2

免下载9.1免费版观看-免下载9.1免费版观看应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123