获取u盘序列号 linux,linux usbmon获取的U盘数据

urb标志 ep->id

时间戳 ep->tstamp

事件类型(S-submission, C-Callback, E-submission error)

ep->type

端点类型I(中断),C(控制),B(Bulk)和Z(ISOC) utype

数据方向(i或者o) udir

bus总线号 ep->busnum

该bus总线分配到的设备地址 ep->devnum

端点号,对于in端点,为异或^0x80,即去掉第8位1值的数据,比如0x81,那么这里数据为0x81 ^ 0x80 = 1

ep->epnum

接下来的数据根据不同的端点类型将做不同的格式显示

I(中断) : ep->status和ep->interval

显示端点的状态和端点interval中断间隔值[luther.gliethttp]

C(控制) : 如果事件类型为S,那么显示s bmRequestType bRequest wValue wIndex

wLength

如果事件类型非S,即C,那么只显示ep->status

B(Bulk) : ep->status 只显示状态

Z(ISOC) : 如果事件类型为S,那么显示ep->status,

ep->interval, ep->start_frame

如果事件类型非S,那么显示ep->status,

ep->interval, ep->start_frame,

ep->error_count

同时显示ep->numdesc,dp->status,

dp->offset,

dp->length等信息,是组合最多的一个输出

接下来的数据就是ep->length长度了[luther.gliethttp].

再接下来就是mon_text_read_data填充数据了[luther.gliethttp].

1.如果数据长度ep->length为0,那么直接填入一个'\n'换行.

2.如果确实有数据部分,那么先追入' =',然后在=等号后面追加实际数据内容.

3.如果没有数据部分,比如那么将ep->data_flag作为char类型打印出来[luther.gliethttp]

ep->data_flag共有5种数值,由mon_text_get_data()函数返回

3.1 L -- 表示期待数据长度为0

3.2 < --

表示有数据要上传,后面有需要接收的数据,后面会有IN动作,

表示in类型,后面还有In读取操作需要读取数据,

同时为S-submission或者E-submission error

3.3 > -- 表示数据部分已经成功下发

表示out类型,同时为C-Callback

3.4 Z -- 表示transfer_buffer为NULL

3.5 0 -- 表示成功获取data.

HUB的中断端点1发生中断,状态成功0,中断interval128ms 数据位02

c393e580 531182834 C Ii:1:001:1 0:128 1 = 02

c393e580 531182947 S Ii:1:001:1 -115:128 2 <

a3+00请求是GetPortStatus, wWvlaue=0, port=1, 数据长度4

P427

c3ad3e00 531183571 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

PortStatus为 01010100

分为 0101 和 0100

c3ad3e00 531183633 C Ci:1:001:0 0 4 = 01010100

clear feature

c3ad3e00 531183663 S Co:1:001:0 s 23 01 0010 0001 0000 0

c3ad3e00 531183670 C Co:1:001:0 0 0

c3ad3e00 531183685 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531183691 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531210077 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531210121 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531240074 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531240122 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531270070 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531270113 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531300076 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531300122 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531300234 S Co:1:001:0 s 23 03 0004 0001 0000 0

HUB的中断端点1发生中断,状态成功0,中断interval128ms 数据位02

c393e580 531311050 C Ii:1:001:1 0:128 1 = 02

c393e580 531311086 S Ii:1:001:1 -115:128 2 <

c3ad3e00 531315120 C Co:1:001:0 0 0

c3ad3e00 531370081 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531370130 C Ci:1:001:0 0 4 = 03011000

c3ad3e00 531425071 S Co:1:001:0 s 23 01 0014 0001 0000 0

c3ad3e00 531425116 C Co:1:001:0 0 0

c3ad3e00 531426891 S Ci:1:000:0 s 80 06 0100 0000 0040 64

<

c3ad3e00 531427405 C Ci:1:000:0 -62 0

c3ad3e00 531427744 S Ci:1:000:0 s 80 06 0100 0000 0040 64

<

c3ad3e00 531429392 C Ci:1:000:0 -62 0

c3ad3e00 531429667 S Ci:1:000:0 s 80 06 0100 0000 0040 64

<

c3ad3e00 531431393 C Ci:1:000:0 -62 0

c3ad3e00 531431702 S Co:1:001:0 s 23 03 0004 0001 0000 0

c3ad3e00 531445056 C Co:1:001:0 0 0

HUB的中断端点1发生中断,状态成功0,中断interval128ms 数据位02

c393e580 531500034 C Ii:1:001:1 0:128 1 = 02

c393e580 531500082 S Ii:1:001:1 -115:128 2 <

a3+00请求是GetPortStatus, wWvlaue=0, port=1, 数据长度4

c3ad3e00 531500381 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

c3ad3e00 531500428 C Ci:1:001:0 0 4 = 03011300

c3ad3e00 531500454 S Co:1:001:0 s 23 01 0014 0001 0000 0

c3ad3e00 531500462 C Co:1:001:0 0 0

c3ad3e00 531500480 S Co:1:001:0 s 23 01 0001 0001 0000 0

c3ad3e00 531500487 C Co:1:001:0 0 0

c3ad3e00 531501087 S Co:1:001:0 s 23 01 0001 0001 0000 0

c3ad3e00 531501122 C Co:1:001:0 0 0

c3ad3e00 531501157 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0101 表示有个设备连接上,port是上电状态

0300 不知道什么意思

c3ad3e00 531501165 C Ci:1:001:0 0 4 = 01010300

c3ad3e00 531501178 S Co:1:001:0 s 23 01 0010 0001 0000 0

c3ad3e00 531501185 C Co:1:001:0 0 0

c3ad3e00 531501195 S Co:1:001:0 s 23 01 0011 0001 0000 0

c3ad3e00 531501201 C Co:1:001:0 0 0

c3ad3e00 531501217 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0101 表示有个设备连接上,port是上电状态

0300 不知道什么意思

c3ad3e00 531501223 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531530075 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0101 表示有个设备连接上,port是上电状态

0300 不知道什么意思

c3ad3e00 531530139 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531560081 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0101 表示有个设备连接上,port是上电状态

0300 不知道什么意思

c3ad3e00 531560128 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531590074 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0101 表示有个设备连接上,port是上电状态

0300 不知道什么意思

c3ad3e00 531590121 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531620074 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0101 表示有个设备连接上,port是上电状态

0300 不知道什么意思

c3ad3e00 531620118 C Ci:1:001:0 0 4 = 01010000

c3ad3e00 531620229 S Co:1:001:0 s 23 03 0004 0001 0000 0

c3ad3e00 531635056 C Co:1:001:0 0 0

c3ad3e00 531690076 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0301 表示有个设备连接上,port是上电状态 低速设备连接到这个port

1000 不知道什么意思

c3ad3e00 531690123 C Ci:1:001:0 0 4 = 03011000

c3ad3e00 531745066 S Co:1:001:0 s 23 01 0014 0001 0000 0

c3ad3e00 531745116 C Co:1:001:0 0 0

//获取设备描述符

80=bmRequestType 06=Get_Desriptor

01(00)=Device 0000=windex 0040=wlength

c3ad3e00 531746898 S Ci:1:000:0 s 80 06 0100 0000 0040 64

<

c3ad3e00 531768392 C Ci:1:000:0 0 18 = 12010002 00000040 11008877

04010102 0301

c3ad3e00 531768748 S Co:1:001:0 s 23 03 0004 0001 0000 0

HUB的中断端点1发生中断,状态成功0,中断interval128ms 数据位02

c393e580 531779080 C Ii:1:001:1 0:128 1 = 02

c393e580 531779127 S Ii:1:001:1 -115:128 2 <

c3ad3e00 531780124 C Co:1:001:0 0 0

a3+00请求是GetPortStatus, wWvlaue=0, port=1, 数据长度4

c3ad3e00 531835078 S Ci:1:001:0 s a3 00 0000 0001 0004 4

<

0301 表示有个设备连接上,port是上电状态 低速设备连接到这个port

1000 不知道什么意思

c3ad3e00 531835126 C Ci:1:001:0 0 4 = 03011000

Clear Feature

This request resets a value reported in the port status.

c3ad3e00 531890074 S Co:1:001:0 s 23 01 0014 0001 0000 0

c3ad3e00 531890118 C Co:1:001:0 0 0

//设置地址

00=bmRequestType 05=Set_Address 0003 =Wvalue

c3ad3e00 531890150 S Co:1:000:0 s 00 05 0003 0000 0000 0

c3ad3e00 531911404 C Co:1:000:0 0 0

//获取设备描述符

80=bmRequestType 06=Get_Desriptor

01(00)=Device 0000=windex 0012=wlength

c3ad3e00 531930073 S Ci:1:003:0 s 80 06 0100 0000 0012 18

<

//设备描述符 12 01 0002 00 00 00 40 11008877 04010102 0301

struct usb_device_descriptor {

__u8 bLength; 0x12 描述符长度

__u8 bDescriptorType; 0x01 描述符类型

__le16

bcdUSB; 0x0002 USB版本号

__u8 bDeviceClass; 0x00 USB分配的设备类

__u8 bDeviceSubClass; 0x00 USB分配的子类

__u8 bDeviceProtocol; 0x00 USB分配的协议

__u8 bMaxPacketSize0; 0x40 端点0最大包大小

__le16

idVendor; 0x1100 厂商编号

__le16

idProduct; 0x8877 产品编号

__le16

bcdDevice; 0x0401 设备出厂编号

__u8 iManufacturer; 0x01 描述厂商字符串的索引

__u8 iProduct; 0x02 描述产品字符串的索引

__u8 iSerialNumber; 0x03 描述设备系列号字符串的索引

__u8 bNumConfigurations;

0x01 可能的配置数量

} __attribute__ ((packed));

c3ad3e00 531931415 C Ci:1:003:0 0 18 = 12010002 00000040 11008877

04010102 0301

//获取配置描述符

80=bmRequestType 06=Get_Desriptor

02(00)=configuration 0000=windex

0009=wlength

c3ad3e00 531931773 S Ci:1:003:0 s 80 06 0200 0000 0009 9

<

//配置描述符 09022000 01010080 32

struct usb_config_descriptor {

__u8 bLength; 0x09 描述符长度

__u8 bDescriptorType; 0x02 描述符类型编号

__le16

wTotalLength; 0x2000配置所返回的所有数据的大小

__u8 bNumInterfaces; 0x01 配置所支持的接口数

__u8 bConfigurationValue;0x01 set_configuration

命令需要的参数值

__u8 iConfiguration; 0x00 描述该配置的字符串的索引值

__u8 bmAttributes; 0x80 供电模式的选择

__u8 bMaxPower; 0x32 设备从总线提取的最大电流

} __attribute__ ((packed));

c3ad3e00 531933399 C Ci:1:003:0 0 9 = 09022000 01010080 32

//获取配置描述符+接口描述符+2个端点描述符

c3ad3e00 531933694 S Ci:1:003:0 s 80 06 0200 0000 0020 32

<

获取配置描述符 09022000 01010080 32

接口描述符 090400 00020806 5000

端点描述符1 0705 01024000 00

端点描述符2 070582 02400000

struct usb_interface_descriptor {

__u8 bLength; 0x09 描述符长度

__u8 bDescriptorType; 0x04 描述符类型

__u8 bInterfaceNumber; 0x00

接口编号

__u8 bAlternateSetting; 0x00 备用的接口描述符编号

__u8 bNumEndpoints; 0x02 该接口使用的断点数

__u8 bInterfaceClass; 0x08 接口类型

__u8 bInterfaceSubClass; 0x06

接口子类型

__u8 bInterfaceProtocol; 0x50

接口协议

__u8 iInterface; 0x00 描述该接口的字符串索引值

} __attribute__ ((packed));

端点1 07 05 01 02 4000 00

struct usb_endpoint_descriptor {

__u8 bLength; 0x07 描述符长度

__u8 bDescriptorType; 0x05 描述符类型

__u8 bEndpointAddress; 0x01 端点地址:0~3 为时端点号1,第七位是方向0输出

__u8 bmAttributes; 0x02 端点属性 bit[0:1]的值00控制,01同步,02批量 ,03中断

__le16

wMaxPacketSize; 0x4000本端点接受或发送最大信息包的大小

__u8 bInterval; 0x00 __u8 bRefresh; __u8 bSynchAddress; } __attribute__ ((packed));

端点2 07 05 82 02 4000 00

struct usb_endpoint_descriptor {

__u8 bLength; 0x07 描述符长度

__u8 bDescriptorType; 0x05 描述符类型

__u8 bEndpointAddress; 0x82 端点地址:0~3 为时端点号2,第七位是方向1输入

__u8 bmAttributes; 0x02 端点属性 bit[0:1]的值00控制,01同步,02批量 ,03中断

__le16

wMaxPacketSize; 0x4000本端点接受或发送最大信息包的大小

__u8 bInterval; 0x00 __u8 bRefresh;

Linux读取U盘或者移动硬盘序列号获取U盘或者移动硬盘分区名。基本原理如下: 当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。 完整代码,可直接编译和测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。
获取U盘ID序列号 VS2005编译通过,源码源自CSDN。已经测试好用。 可以获得U盘名称,制造商ID号 版本号 U盘序列号及容量 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Management; namespace UDiskTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { DriveInfo[] s = DriveInfo.GetDrives(); foreach (DriveInfo drive in s) { if (drive.DriveType == DriveType.Removable) { pf.Text = drive.Name.ToString(); break; } } ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc = cimobject.GetInstances(); foreach (ManagementObject mo in moc) { if (mo.Properties["InterfaceType"].Value.ToString() == "USB") { try { //产品名称 Caption.Text = mo.Properties["Caption"].Value.ToString(); //总容量 Size.Text = mo.Properties["Size"].Value.ToString(); string[] info = mo.Properties["PNPDeviceID"].Value.ToString().Split('&'); string[] xx = info[3].Split('\\'); //序列号 MessageBox.Show("U盘序列号:" + xx[1]); PNPDeviceID.Text = xx[1]; xx = xx[0].Split('_'); //版本号 REV.Text = xx[1]; //制造商ID xx = info[1].Split('_'); VID.Text = xx[1]; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } } } 如果编译遇到问题是using System.Management;无法找到引用找到, 项目(p)->添加引用(R)->找到.NET标签页 列表中下部位找到System.Management 双击点确定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值