Определите уникальный идентификатор устройства (например, серийный номер) для идентичных USB-устройств.

У меня есть несколько идентичных устройств регистрации GPS, которые я могу передавать данные отслеживания с помощью командной строки с помощью GPSBabel.

Вопрос: используя Python 2.7, Windows 7 и эти устройства регистрации GPS, как я могу однозначно и многократно идентифицировать каждое идентичное устройство? Хорошим примером может быть серийный номер, уникальный для каждого идентичного устройства. (и физически напечатаны на устройстве).

Я работаю с Python 2.7 и Windows 7 (должна быть Windows, а не Linux из-за драйверов).


Вот что я пробовал до сих пор:

Когда два устройства подключены к портам USB, диспетчер устройств показывает следующее для Порты (COM и LPT). (USB-устройства не монтируются как USB-диски.)

введите здесь описание изображения

(Порты 8 и 10)

Выбор Свойства – Сведения об устройстве на порту 10 дает мне один уникальный идентификатор, который называется ContainerID, но я не могу программно найти ни одного уникального идентификатора. ID как серийный номер для нескольких идентичных устройств.

введите здесь описание изображения

Используя код из этого вопроса,

import win32com.client

wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_SerialPort"):
    if usb.Name.startswith('GPS'):
        print usb.DeviceID, usb.Name, usb.PNPDeviceID

Я получаю этот ответ:

COM10 GPS USB Serial Interface Driver (COM10) USB\VID_0E8D&PID_3329\6&21C2E9BE&0&1
COM8 GPS USB Serial Interface Driver (COM8) USB\VID_0E8D&PID_3329\6&25E9E978&0&3

(Не уникальный! Конечный идентификатор 6&21C2E9BE&0&1 на самом деле связан с портом, а не с устройством. Я могу проверить это, взяв одно и то же устройство и запустив код только с одним или двумя подключенными устройствами.)

Я могу найти этот номер в представлении «Диспетчер устройств/Подробности» в разделе Путь к экземпляру устройства.

введите здесь описание изображения

Я просмотрел документацию по Win32 API опции для Win32_SerialPort и некоторые другие. Я не могу найти ни одного класса API, который бы возвращал что-то уникальное, например серийный номер.

введите здесь описание изображения


person philshem    schedule 24.08.2016    source источник
comment
Это также будет зависеть от самих устройств. если только в него не встроено какое-то уникальное программное значение, определяемое производителем, то НЕ БУДЕТ никакого способа различить два экземпляра одного и того же устройства. например на сетевой карте вы можете (надеюсь/обычно) зависеть от того, что MAC-адрес отличается. если единственное отличие ваших GPS-устройств с точки зрения электричества/программного обеспечения заключается в том, что они поставляются в разных коробках, то невозможно определить, какое из них какое, если вы когда-либо отключали/перемешивали/переподключали их.   -  person Marc B    schedule 24.08.2016
comment
Если это так, можно ли как-нибудь присвоить идентификатор устройству? (Или это отдельный вопрос?)   -  person philshem    schedule 24.08.2016
comment
вы, вероятно, можете назначить все, что хотите, но где это будет храниться? Если на устройстве нет доступной для записи памяти, этот идентификатор будет ПОТЕРЯН при отключении. Если у вас есть устройство P в порту X и Q->Y, что произойдет, если их отключить и снова подключить как P->Y и Q->X? без какого-либо хранилища на стороне устройства не будет абсолютно НИКАКОГО способа сказать, что они были заменены.   -  person Marc B    schedule 24.08.2016
comment
Если у меня есть 2 USB-порта, X и Y, и я помечаю их X и Y, а затем всегда подключаю P к X и Q к Y, будет ли устройствам назначен один и тот же COM-порт? Чтобы усложнить задачу, мне понадобятся внешние USB-концентраторы для нескольких устройств.   -  person philshem    schedule 24.08.2016
comment
что я не могу ответить. Я понятия не имею, что/как Windows перечисляет вещи, когда они подключаются.   -  person Marc B    schedule 24.08.2016
comment
Вот почему Windows использует порт, к которому они подключены, как часть идентификатора устройства. Как уже говорили другие, если устройства идентичны, они идентичны. Если важно, чтобы их не было, вам нужно найти другое устройство.   -  person Jonathan Potter    schedule 24.08.2016
comment
COM-порты не останутся прежними, но вы сможете определить, к какому USB-порту подключено устройство. Тогда ваше предыдущее решение всегда подключаться к одному и тому же порту должно работать. Найдите свои устройства, найдите USB-порт, найдите текущий назначенный COM-порт для этого USB-порта, а затем откройте назначенный COM-порт.   -  person topshot    schedule 11.10.2016
comment
@topshot - можете ли вы расширить свой комментарий в качестве ответа? До сих пор я подключал USB-концентратор к тому же USB-порту, а затем 10 устройств к отмеченным портам на концентраторе. Идентификационные номера COM и USB, как пара, остались прежними (пока)   -  person philshem    schedule 12.10.2016
comment
Извините, я еще не удосужился написать код для этого. Я просто знаю, что у меня были COM-порты, назначенные данному порту USB, без какой-либо причины. Я также ожидаю, что в какой-то момент мне придется иметь дело с таким же оборудованием, как и у вас, поскольку мне приходилось сталкиваться с этим в прошлом (используя настоящие COM-порты, а не USB). В своих поисках решения этой будущей проблемы я наткнулся на код, который выводит фактическое описание порта USB. Таким образом, моя цель будет состоять в том, чтобы сохранить, например, какой конкретный сканер USB-портов 3, а не какой COM-порт он использует. Из этого USB-порта посмотрите, какой COM-порт назначен в данный момент, и откройте его.   -  person topshot    schedule 12.10.2016
comment
И мой код в любом случае будет VB.Net, а не python. Я искал повсюду лучшие решения этой проблемы, с которыми кто-то мог столкнуться.   -  person topshot    schedule 12.10.2016