首页 文章

HID温度设备报告阅读

提问于
浏览
0

我得到了一个项目,其中包括将温度和湿度USB传感器集成到我公司的应用程序中 . 我必须承认我完全了解与HID设备的通信 .

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

在尝试了许多USB嗅探器应用程序(如 USBlyzerUSBTrace 等)之后,我发现了HID设备发送报告所需的字节数,因此我使用许多HID库创建了一个C#演示应用程序 . 通过嗅探USB设备,我设法模拟了触发设备输出正确回复的正确请求 .

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

因此,我的主要问题是:我是否需要使用任何类型的设备专用文档将缓冲区转换为可读数据,还是可以使用设备输出的 Report Descriptor 从缓冲区中提取数据?

下面我包括使用USBlyzer应用程序提取的设备的报告描述符:

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通信经验的人提供任何帮助或建议 .

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

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

谢谢 .

2 回答

  • 0

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

    是和否 . 是的,您可以使用报告描述符机械地解析响应并构建设备将处理的请求 . 但在这种情况下,不,因为构成每个请求/响应(报告)的字段(用法)是供应商定义的,因此您需要供应商提供的文档来描述每个报告的含义 . 知道芯片是Silab F321并没有真正帮助你,因为它只是具有内置USB功能的8051微控制器的变体 - 数据 Logger 供应商(不是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;
    
  • 0

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

    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
    

    例如来自该数据字节6和7可以保存您所追求的值

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

    另外一些数据可能会添加幻数,例如字节8和9:

    2 205 -> hex 2 cd -> dec 717 - 400 (magic) -> 317 /10 -> 31.7
    

相关问题