Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Robesper3411
19 / 18 / 3
Регистрация: 20.02.2012
Сообщений: 463
Записей в блоге: 1
Завершенные тесты: 1
1

usb serial number

05.11.2019, 18:43. Просмотров 848. Ответов 4

Всем доброго времени суток!
Передо мной стоит задача получить серийный номер флешки, которую я вставляю в компьютер. Как это сделать?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2019, 18:43
Ответы с готовыми решениями:

Задержка между записью/чтением Serial-порта
Доброе время суток.

4
peter_irich
74 / 68 / 21
Регистрация: 18.10.2017
Сообщений: 628
05.11.2019, 21:29 2
Для начала вставьте её куда надо и дайте команду
dmesg
последние строки что-нибудь скажут.

Добавлено через 5 минут
Ещё есть одно место - /sys/bus/usb/devises/, там при вставке и удалении появляется некий каталог,
но я не знаю, как трактовать всё, что в нем содержится.
1
Humanoid
Почетный модератор
10096 / 3959 / 370
Регистрация: 12.06.2008
Сообщений: 11,575
05.11.2019, 22:48 3
Лучший ответ Сообщение было отмечено Robesper3411 как решение

Решение

Ещё можно воспользоваться libusb для получения device descriptors... смотрите libusb_get_device_descriptor() (там вы узнаете индекс строки серийного номера в iSerialNumber) и после этого libusb_get_string_descriptor() для получения самой строки по её индексу. Но всё это есть в /sys/bus/usb

Если и libusb не нравится, то можно напрямую через ioctl делать запросы устройству. Например:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <sys/ioctl.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/usbdevice_fs.h>
 
struct __attribute__((__packed__)) device_descriptor {
        uint8_t bLength;
        uint8_t bDescriptorType;
        uint16_t bcdUSB;
        uint8_t bDeviceClass;
        uint8_t bDeviceSubClass;
        uint8_t bDeviceProtocol;
        uint8_t bMaxPacketSize0;
        uint16_t idVendor;
        uint16_t idProduct;
        uint16_t bcdDevice;
        uint8_t iManufacturer;
        uint8_t iProduct;
        uint8_t iSerialNumber;
        uint8_t bNumConfigurations;
};
 
int get_device_descriptor(int fd, struct device_descriptor *desc)
{
        struct usbdevfs_ctrltransfer ctrl = {0};
 
        if (!desc)
                return -1;
 
        ctrl.bRequestType = 0x80;
        ctrl.bRequest = 6;  // GET_DESCRIPTOR
        ctrl.wValue = 0x100;    // device
        ctrl.wIndex = 0;
        ctrl.wLength = sizeof(*desc);
        ctrl.timeout = 1000;
        ctrl.data = (char *)desc;
 
        if (ioctl(fd, USBDEVFS_CONTROL, &ctrl) == -1)
                error(0, errno, "%s: ctrl", __FUNCTION__);
                
        return 0;
}
C
1
2
3
4
5
6
7
8
struct device_descriptor device_descriptor = { 0 };
int fd;
 
fd = open("/dev/bus/usb/001/003", O_RDWR);
if (fd == -1)
        error(1, errno, "open()");
get_device_descriptor(fd, &device_descriptor);
// дальше смотрим на device_descriptor.iSerialNumber и пишим другую функцию, которая запросит строку
1
Robesper3411
19 / 18 / 3
Регистрация: 20.02.2012
Сообщений: 463
Записей в блоге: 1
Завершенные тесты: 1
06.11.2019, 17:01  [ТС] 4
Humanoid, воспользовался по Вашему совету libusb. Да, все получается. Только вот вопрос - серийный номер выдает индекс в uint8_t, теперь мне нужно узнать серийный номер по этому индексу.
Посмотрел, что можно узнать по modalias серийник через утилиту modinfo(ubuntu 18). Но вот тут не хотелось бы использовать сторонние утилиты, ибо процессное взаимодействие и снижение производительности. Можете что-нибудь посоветовать?
0
COKPOWEHEU
1982 / 1208 / 272
Регистрация: 09.09.2017
Сообщений: 4,908
06.11.2019, 17:41 5
usb_get_string
1
06.11.2019, 17:41
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2019, 17:41

Как определить Serial number жеского диска?
Как определить Serial number жеского диска? (код) Спосибо!

Как в С++ Билдере прочитать HDD Serial Number?
Как в С++ Билдере прочитать HDD Serial Number? подскажите ребят пожалуйста?

Как найти Serial Number для unity 4.3.4?
Пожалуйста помогите как найти Serial Number для unity 4.3.4


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.