HID温度设备报告阅读

时间:2015-06-17 18:52:49

标签: c# usb sensor hid

我获得了一个项目,其中包括温度和温度的整合。湿度USB传感器进入我公司的应用程序。我必须承认我完全了解与HID设备的通信。

因此,有一个来自中国制造商的USB传感器没有任何文档,但只有MS Windows应用程序可以读取当前温度和温度。湿度并使用名为SLABHidDevice.dll的库读取存储在内部存储器中的所有记录。我联系了该设备的供应商,但也联系了Silicon Labs公司(SLABHidDevice.dll的创建者)获取一些文档或帮助,两者都没有运气。

尝试使用 USBlyzer USBTrace 等许多USB嗅探器应用程序后,我发现了HID设备发回报告所需的字节数,所以我使用许多HID库创建了一个C#演示应用程序。通过嗅探USB设备,我设法模拟了触发设备输出正确答复的正确请求。

我的问题如下:我设法使用 VID & PID (VendorID,ProductID),我还可以获取设备的一些详细信息,例如 SerialNumber DevicePath MaxInputReportLength GetInputReport ()函数请求报告,提供一个缓冲区,其中包含所需的报告ID到第一个字节(例如0x05),我也可以读取缓冲区从上面的函数返回。不幸的是,缓冲区不包含我的任何可读信息(例如/n.Ô.Ï.P..ô.d.¶)。在阅读有关HID报告的许多文档时,我意识到任何HID设备固件都有报告描述符,其中包含可导入/导出的所有报告的结构。

所以,我的主要问题是:我是否需要使用任何类型的设备专用文档将缓冲区转换为可读数据,或者我可以使用报告描述符从缓冲区中提取数据设备输出?

下面我列出了使用USBlyzer app提取的设备的报告描述符:

Interface 0 HID Report Descriptor Vendor-Defined 1
Item Tag (Value) Raw Data 
Usage Page (Vendor-Defined 1) 06 00 FF  
Usage (Vendor-Defined 1) 09 01  
Collection (Application) A1 01  
    Report ID (1) 85 01  
    Report Count (4) 95 04  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

    Report ID (2) 85 02  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

    Report ID (3) 85 03  
    Report Count (1) 95 01  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02

    Report ID (4) 85 04  
    Report Count (2) 95 02  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02  

    Report ID (5) 85 05  
    Report Count (31) 95 1F  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02  

    Report ID (6) 85 06  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02  

    Report ID (7) 85 07  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 

    Report ID (8) 85 08  
    Report Count (60) 95 3C  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 

    Report ID (9) 85 09  
    Report Count (9) 95 09  
    Report Size (8) 75 08  
    Logical Maximum (255) 26 FF 00  
    Logical Minimum (0) 15 00  
    Usage (Vendor-Defined 1) 09 01  
    Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02  
End Collection C0

如果需要特定于设备的文档,那么我无能为力。但是,如果不需要任何文档,我希望任何有HID通信经验的人提供任何帮助或建议。

编辑:在取下设备的盖子后,我发现主要的微控制器 - 我认为 - 做了所有的工作,是 Silab F321

我还附上photo设备以获取更多信息。 (由于我的声誉得分很低,不能直接发布)

谢谢。

2 个答案:

答案 0 :(得分:0)

  

我是否需要提供任何类型的设备专用文档   将缓冲区转换为可读数据   我可以使用报告描述符从缓冲区中提取数据   设备输出?

是和否。您可以使用报告描述符机械地解析响应并构建设备将处理的请求。但在这种情况下,不,因为构成每个请求/响应(报告)的字段(用法)是供应商定义的,因此您需要供应商提供的文档来描述每个报告的含义。知道芯片是Silab F321并不能帮助你,因为它只是具有内置USB功能的8051微控制器的变体 - 数据记录器供应商(不是8051芯片供应商)编码了意义每个报告的固件版本。

从上述报告描述中看,供应商似乎也采取了一些捷径。通常你会定义一个独特的"用法"代码,温度,压力,湿度,并定义包含其中一个或多个的报告。在这种情况下,他们似乎正在使用报告ID来确定每个"用法的含义" - 也就是说,使用代码固定为1(因此没有传达任何含义),并且报告ID用于识别每个报告的内容。但是,这对您没有帮助,因为您仍然不知道供应商对每份报告的意图。

您可以尝试"逆向工程"意思,但我不建议在逆向工程接口上建立应用程序。

以下是来自上述报告描述符的机械生成的一组C结构定义(通过名为hidrdd的工具),但它仍然无法帮助您了解每个报告的含义:

//--------------------------------------------------------------------------------
// Vendor-defined inputReport 05 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x05 (5)
  uint8_t  VEN_VendorDefined0001[31];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport05_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 06 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x06 (6)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport06_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 07 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x07 (7)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport07_t;


//--------------------------------------------------------------------------------
// Vendor-defined inputReport 08 (Device --> Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x08 (8)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} inputReport08_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 01 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x01 (1)
  uint8_t  VEN_VendorDefined0001[4];                 // Usage 0xFF000001: , Value = 0 to 255
} outputReport01_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 02 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x02 (2)
  uint8_t  VEN_VendorDefined0001[60];                // Usage 0xFF000001: , Value = 0 to 255
} outputReport02_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 03 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x03 (3)
  uint8_t  VEN_VendorDefined0001;                    // Usage 0xFF000001: , Value = 0 to 255
} outputReport03_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 04 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x04 (4)
  uint8_t  VEN_VendorDefined0001[2];                 // Usage 0xFF000001: , Value = 0 to 255
} outputReport04_t;


//--------------------------------------------------------------------------------
// Vendor-defined outputReport 09 (Device <-- Host)
//--------------------------------------------------------------------------------

typedef struct
{
  uint8_t  reportId;                                 // Report ID = 0x09 (9)
  uint8_t  VEN_VendorDefined0001[9];                 // Usage 0xFF000001: , Value = 0 to 255
} outputReport09_t;

答案 1 :(得分:0)

如果这仍然是有效的猜测。 你必须检查哪些值正在改变byte []缓冲区?

app = Deneme(root)

例如来自该数据字节6&amp;

可以保留你所拥有的价值
5 0 0 79 200 1 94 2 205 1 111 1 144 1 244 0 100 3 182 0 3 1 1 0 0 0 0 0 0 0 0 9

也可以添加一些数据,例如字节数8和8。 9:

-> 1 94 -> hex 1 5e -> dec 350 -> /10 -> 35.0