– 원문 링크: https://blogs.embarcadero.com/human-interface-devices-communicator-for-delphi-c-builder-on-windows/
– 원문 제목: Human Interface Devices Communicator For Delphi/C++ Builder On Windows
– 원문 작성자: Anbarasan
전광판(Alphanumeric display), 바코드 리더, 센서, 해드폰이나 스피커의 볼륨 조정기 등 휴먼 인터페이스 장치(HID, Human interface device)와 연결된 애플리케이션이 점점 더 실생활에서 많이 사용되고 있다. HID와 통신하는 라이브러리를 델파이/C++/라자루스(Lazarus)로 구현하기 위해 점점 더 많은 시간을 들이고 있다면, WINSOFT에서 제공하는 강력한 라이브러리를 고려해보자. 이 라이브러리는 윈도우 표준 HID API를 사용한다.
기능
– HID 디바이스가 추가되거나 제거되면 알림
– 시스템에서 가용할 수 있는 모든 HID 디바이스 정보를 추출
– HID 디바이스용 Feature Report를 GET또는 SET 하기가
– 32비트/64비트 윈도우 지원
지원 버전(2020년 10월 기준)
– 델파이/C++빌더 5부터 10.4와 라자루스 2.0.8
플랫폼
– 윈도우(Windows)
Native HID Library설치 과정
1. Native HID 설치 파일을 다운로드하고 압축 풀기
2. 알맞은 버전 (예: 델파이 10.4) 폴더를 찾아서 열기
3. Readme.txt 파일 열고 기능과 카피라이트 정보 읽기
4. Windows VCL Application을 하나 생성하고, 코드의 uses 구역에서 Hid.pas 유닛 파일을 추가
5. 사용하려는 라이브러리가 들어있는 폴더를 Project->Options->Delphi Compiler->Search Path에서 추가
6. Compile 실행 후 해당 라이브러리를 사용할 수 있는지 확인
NativeHID 설치 과정 데모:
NativeHID의 주요 개념
Report – Report는 디바이스와 그 디바이스와 연결된 소프트웨어 사이에 교환되는 실제 데이터이다.
– Input Report – HID 디바이스이 애플리케이션에게 보내는 데이터 (주로 디바이스의 통제 상태가 변경될 때)
– Output Report – 애플리케이션이 HID 디바이스에게 보내는 데이터 (예: 키보드에 있는 LED 전구에게 보내는 데이터 등)
– Feature Report – 수작업으로 읽기/쓰기할 수 있는 데이터 (주로 디바이스 구성 정보)
– Report Descriptor – Report Descriptor는 해당 디바이스에서 지원하는 데이터의 형식과 의미를 설명한다.
– UsageTables – Usages 설명이 들어 있는 목록, 특정 항목이 의도하는 의미와 사용에 대한 설명을 Report Descriptor에서 제공 (예: 마우스 왼쪽 버튼의 사용 정의). USB-IF 그룹에서 UsageTables을 공표한다 (USB-IF HID 규격 참고).
Native HID library를 가지고 애플리케이션 만드는 법
1. RAD스튜디오 10.4를 열고 Windows VCL Application 하나 생성하고, 코드의 uses 구역에서 Hid.pas 유닛 파일을 추가
2. 사용하려는 라이브러리가 들어있는 폴더를 Project->Options->Delphi Compiler->Search Path에서 추가
3.
1 |
Device := THidDevice.Create; // THidDevice 인스턴스를 하나 생성 |
* OnDeviceArrival– 시스템에 들어온 DeviceName을 제공. DeviceName은 해당 디바이스를 열고, 디바이스 속성을 표시할 때 사용됨
* OnDeviceRemoved – 시스템에서 제거된 DeviceName을 제공
* Get/SetFeatureReport – 수작업으로 구성 정보를 읽고 쓸 때 사용
* GetInputReport – 해당 Report ID에게 HID 디바이스에서 보낸 데이터 가져오기
* SetOutputReport – 해당 Report ID의 HID 디바이스의 데이터를 설정하기
4.
1 |
Device.Open // HID 디바이스를 열기. |
5. 디바이스 속성 표시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
with Device do try AddLine('Vendor ID: ' + IntToHex(VendorID,4)); AddLine('Product ID: ' + IntToHex(ProductID,4)); AddLine('Version Number: ' + IntToHex(VersionNumber,4)); AddLine('Serial Number: ' + SerialNumber); AddLine('Manufacturer: ' + Manufacturer ); AddLine('Product: ' + Product); AddLine('Usage Page: ' + IntToStr(UsagePage)); AddLine('Usage: ' + IntToStr(Usage)); AddLine('Input Report length: ' + IntToStr(InputReportLength)); AddLine('Output Report Length: ' + IntToStr(OutputReportLength)); AddLine('Feature Report Length : ' + IntToStr(FeatureReportLength)); AddLine('Input Buffer Count : ' + IntToStr(InputBufferCount)); for I := 1 to 255 do if HasString[I] then AddLine('String ' + IntToStr(I) + ':' + Strings[I]) else Break; except on E: Exception do AddLine('Exception: ' + E.Message); end; |
6. DeviceName가져오기
1 2 3 4 5 6 |
var DeviceNames : TWStringDynArray; begin With Device do DeviceNames := Enumerate; end; |
7. 각 DeviceName을 돌면서 GetFeatureReport
1 2 3 4 5 6 7 8 9 |
With Device do if FeatureReportSupported then for J := 0 to 9 do try AddLine('Feature report' + IntToStr(J) + ':' + ByteArrayToString(GetFeatureReport(J))); except On E: Exception do AddLine('Feature Report' + IntToStr(J) + 'Exception : ' + E.Message); end; |
8. 각 DeviceName을 돌면서 GetInputReport
1 2 3 4 5 6 7 8 |
if InputReportSupported then for J := 0 to 9 do try AddLine('Input report' + IntToStr(J) + ':' + ByteArrayToString(GetInputReport(J))); except On E: Exception do AddLine('Input Report' + IntToStr(J) + 'Exception : ' + E.Message); end; |
9. 각 DeviceName을 돌면서 읽기 전용으로 각 디바이스를 다시 열어서 읽기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
With Device do if ReadSupported then begin if active then Close; Open(DeviceNames[I],True,False); for J := 0 to 9 do try AddLine('Read' + ByteArrayToString(Read(300))); except On E: Exception do AddLine('Read exception' + E.Message); end; end; |
10.
1 |
Device.close; // HID 디바이스 닫기. |
Native HID Library ‘코드 작성’ 데모:
결론: 이렇게 쉽게 휴먼 인터페이스 장치(HID, Human interface device)를 애플리케이션에 다룰 수 있다. WINSOFT의 NativeHID Library를 사용하면 윈도우API를 직접 다루는 시간을 줄여줄이고 생산성을 높일 수 있다.
델파이와 C++빌더용 WINSOFT Native HID Libraryt에 대한 전체 안내 페이지를 살펴보자.