Программирование PC HID API для Linux, Mac OS X и Windows Thu, March 28 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

HID API для Linux, Mac OS X и Windows Печать
Добавил(а) microsin   

HIDAPI это многоплатформенная библиотека, которая позволяет писать приложения (ПО хоста USB) с доступом к интерфейсам устройств USB и Bluetooth HID-Class на операционных системах Windows, Linux и Mac OS X. В то время как эта библиотека может использоваться обмена данными со стандартными устройствами HID наподобие клавиатур, мышей и джойстиков, особенно полезное применение библиотеки - работа с пользовательскими (определенными производителем, Vendor-Defined) устройствами HID. Множество устройств работают так, что не требуется писать специальный драйвер для каждой платформы. HIDAPI просто интегрируется с клиентским приложением (ПО хоста), потому что нужно всего лишь подключить в проект файл исходного кода. На платформе Windows, HIDAPI также можно опционально использовать как функции в DLL.

Программы, которые используют HIDAPI, не нуждаются в драйверах. Это означает, что не требуется применять пользовательский драйвер для каждого устройства на каждой платформе.

HIDAPI предоставляет ясный и непротиворечивый программный интерфейс для каждой платформы (операционной системы), что делает простым написание приложений, которые обмениваются данными с устройствами USB HID, при этом нет необходимости вдаваться в детали библиотек HID и интерфейсов операционной системы на каждой платформе.

Исходный код HIDAPI также предоставляет тестовое GUI-приложение, которое может производить энумерацию и обмен данными с любым устройством HID, подключенным к операционной системе. Тестовое GUI компилируется и работает на всех платформах, поддерживаемых HIDAPI. 

[Как выглядит API библиотеки?

Doxygen HTML документацию Вы можете просмотреть по ссылке [2].

API предоставляет простой метод для энумерации устройств HID, подключенных к системе, и простой доступ к наиболее часто используемым функциям HID, включая передачу данных Input Reports, Output Reports и Feature Reports. Ниже приведен пример программы, которая обменивается данными с модифицированной версией примера USB HID устройства (USB Generic HID sample), взятое из Microchip Application Library (находится в папке "Microchip Solutions\USB Device - HID - Custom Demos\Generic HID - Firmware", когда установлен Microchip Application Framework). Для упрощения из кода удалена проверка / обработка ошибок:

#include < stdio.h >
#include < stdlib.h >
#include "hidapi.h"
 
int main(int argc, char* argv[])
{
   int res;
   unsigned char buf[65];
   #define MAX_STR 255
   wchar_t wstr[MAX_STR];
   hid_device *handle;
   int i;
 
   // Энумерация и вывод информации всех устройств HID, подключенных к системе
   struct hid_device_info *devs, *cur_dev;   
 
   devs = hid_enumerate(0x0, 0x0);
   cur_dev = devs;
   while (cur_dev)
   {
      printf("Device Found\n  type: %04hx %04hx\n  path: %s\n  serial_number: %ls",
             cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
      printf("\n");
      printf("  Manufacturer: %ls\n", cur_dev->manufacturer_string);
      printf("  Product:      %ls\n", cur_dev->product_string);
      printf("\n");
      cur_dev = cur_dev->next;
   }
   hid_free_enumeration(devs);
 
   // Открытие устройства, используя VID, PID,
   // и опционально серийный номер.
   handle = hid_open(0x4d8, 0x3f, NULL);
 
   // Чтение строки описания производителя (Manufacturer String)
   res = hid_get_manufacturer_string(handle, wstr, MAX_STR);
   printf("Manufacturer String: %ls\n", wstr);   
 
   // Чтение строки описания продукта (Product String)
   res = hid_get_product_string(handle, wstr, MAX_STR);
   printf("Product String: %ls\n", wstr);   
 
   // Чтение строки с серийным номером устройства (Serial Number String)
   res = hid_get_serial_number_string(handle, wstr, MAX_STR);
   printf("Serial Number String: %ls", wstr);
   printf("\n");   
 
   // Послать в устройство Feature Report
   buf[0] = 0x2; // В первом байте находится номер репорта
   buf[1] = 0xa0;
   buf[2] = 0x0a;
   res = hid_send_feature_report(handle, buf, 17);   
 
   // Чтение Feature Report из устройства
   buf[0] = 0x2;
   res = hid_get_feature_report(handle, buf, sizeof(buf));   
 
   // Вывод на экран прочитанных данных.
   printf("Feature Report\n   ");
   for (i = 0; i < res; i++)
      printf("%02hhx ", buf[i]);
   printf("\n");   
 
   // Установка функции hid_read() в неблокирующий режим.
   hid_set_nonblocking(handle, 1);   
 
   // Послать Output report, чтобы переключить светодиод LED (команда 0x80)
   buf[0] = 1; // В первом байте находится номер репорта
   buf[1] = 0x80;
   res = hid_write(handle, buf, 65);   
 
   // Послать Output report, чтобы запросить состояние (команда 0x81)
   buf[1] = 0x81;
   hid_write(handle, buf, 65);   
 
   // Прочитать запрошенное состояние
   res = hid_read(handle, buf, 65);
   if (res < 0)
      printf("Unable to read()\n");
 
   // Вывод на экран прочитанных данных.
   for (i = 0; i < res; i++)
      printf("buf[%d]: %d\n", i, buf[i]);   
 
   return 0;
}

[Лицензирование HIDAPI]

HIDAPI может использоваться под управлением одной из трех лицензий, как это описано в общих чертах в файле LICENSE.txt. Вот эти лицензии: GPL v3 (см. LICENSE-gpl3.txt), BSD (см. LICENSE-bsd.txt), и более свободная оригинальная лицензия HIDAPI (см. LICENSE-orig.txt). Пользователь HIDAPI (разработчик, кто применяет HIDAPI в своем коде) может выбрать использование HIDAPI под любой из этих 3 лицензий по своему усмотрению. Например, автор программного обеспечения GPL может захотеть использовать HIDAPI по правилам GPL. Автор коммерческих продуктов с закрытым исходным кодом может использовать HIDAPI по правилам либо лицензии BSD-style, либо оригинальной лицензии HIDAPI.

При создании HIDAPI была идея сделать её доступной по возможности для максимального количества категорий пользователей, включая open-source и closed-source приложения, и предоставить гибкость для соединения с кодом так, как считает целесообразным разработчик.

[Загрузка]

HIDAPI можно загрузить с сайта GitHub. Пакет в виде zip-файла доступен на странице загрузки (Download Page). Чтобы получить последнюю ревизию транка (если у Вас установлена система управления версиями git) Вы можете выполнить следующую команду:

git clone git://github.com/signal11/hidapi.git

[Инструкции по сборке]

Windows. Выполните сборку под управлением Visual Studio, загрузив файл .sln. Он находится в каталоге windows/ архива.

Linux. Перейдите в директорию linux/ и запустите команду make.

Mac OS X. Перейдите в директорию mac/ и запустите команду make.

[Как собрать тестовое GUI-приложение]

Windows. Выполните сборку под управлением Visual Studio, загрузив файл .sln. Он находится в каталоге hidtest/ архива. Убедитесь, что Вы предварительно настроили внешние зависимости (externals, Fox Toolkit), как это описано в файле README.txt.

Linux и Mac. Запустите команду make из каталога hidtest/. Убедитесь, что Вы перед этим установили fox-toolkit, как это описано в файле README.txt

[Контактная информация]

В момент написания статьи список рассылки (mailing list) пока не был готов. В настоящее время обращайтесь с замечаниями и вопросами на email alan@signal11.us.

[Ссылки]

1. HID API for Linux, Mac OS X, and Windows site:signal11.us.
2. hidapi API site:signal11.us.
3. Библиотеки для управления устройствами USB HID.

 

Добавить комментарий


Защитный код
Обновить

Top of Page