Windows下获取android设备的序列号(转)
本文转自:http://kb.cnblogs.com/a/2283253/
android的序列号本 质上是USB设备的序列号,在USB的规范中可以找到相关的定义。设备厂商通过某种算法或依赖设备的硬件ID产生这个序列号。序列好一经确定不在改变,是 USB设备的唯一标识。但是这个序列号不是硬性规定,有的同一型号的设备使用相同的序列号,此时序列号不能唯一标识设备。
在windows下编程得到此序列号有几种方法,其实本质上就是第三种方法,1、2两种是使用adb的封装:
(1)直接使用adb命令,采用重定向的方式得到该序列号,使用管道重定向的方法在网上的文章很多,不再多说了。
(2) 使用adb所所提供的库文件,在adb的目录下有AdbWinApi.dll、AdbWinUsbApi.dll两个文件,我们可以通过 AdbWinApi.dll导出的接口来获取设备的序列号,其中AdbWinUsbApi.dll是使用winusb接口的实现,在legacy驱动时不 需要此动态库。
(3)在以上两种方法中使用的都SetupAPI和WinUSB来获取序列号的。根据不同的驱动使用的不同方法来获取,
对于legacy驱动,如下代码:
HANDLE usb_device_handle = CreateFile(p->DevicePath, //通过SetupAPI得到设备路径
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (INVALID_HANDLE_VALUE == usb_device_handle)
{
return NULL;
}
WCHAR serial_number[512];
// Send IOCTL
DWORD ret_bytes = 0;
BOOL ret = DeviceIoControl(usb_device_handle,
ADB_IOCTL_GET_SERIAL_NUMBER,
NULL, 0,
serial_number, sizeof(serial_number),
&ret_bytes,
NULL)
对于支持winusb的驱动
CHandle hAdbDev(CreateFile(p->DevicePath,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, //注意这的区别,使用Winusb必须以OVERLAPPED方式打开设备
NULL));
if (WinUsb_Initialize(hAdbDev, &hUsb))
{
USB_DEVICE_DESCRIPTOR desc;
ZeroMemory(&desc, sizeof(desc));
if (WinUsb_GetDescriptor(hUsb, USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, (PUCHAR)&desc, sizeof(desc), &nRetLen))
{
ZeroMemory(buf, sizeof(buf));
if (WinUsb_GetDescriptor(hUsb, USB_STRING_DESCRIPTOR_TYPE, desc.iSerialNumber, 0x0409, buf, sizeof(buf), &nRetLen))
{
if (0 != nRetLen)
{
PUSB_STRING_DESCRIPTOR pTmp = (PUSB_STRING_DESCRIPTOR)buf;
pTmp->bString; //序列号
}
}
}
WinUsb_Free(hUsb);
}
在adb的源码中,首先使用控制字方式获取序列号,如果失败则使用winusb方式获取。
浙公网安备 33010602011771号