定义传感器属性

Windows 可移植设备 (WPD) 属性是对象描述元数据。 本部分介绍示例驱动程序支持的属性。 设备对象支持 18 个属性,单个传感器对象支持 10 个属性。 驱动程序功能需要某些对象属性,例如WPD_OBJECT_ID和WPD_OBJECT_PERSISTENT_UNIQUE_ID。 存在其他属性以提供描述对象的信息,例如WPD_DEVICE_MANUFACTURER。

WDK 包含多个适用于 WPD 驱动程序开发人员的工具。 其中一个工具 WpdInfo.exe,使开发人员能够检查由给定驱动程序公开的对象和属性。 WpdInfo.exe工具的以下屏幕截图显示了驱动程序中的 Device 对象支持的属性。

wpd 信息工具。

在上图中,顶部窗格中最左侧的列列出了驱动程序支持的对象。 中心窗格列出了 DEVICE 对象的驱动程序支持的 18 个属性。 此窗格中的第一列列出属性名称,第二列列出该属性的值,第三列列出类型,依此类说。 下部窗格显示驱动程序支持的事件返回的信息。

WpdInfo.exe工具的以下屏幕截图显示了 TempHumidity 对象支持的属性。

wpd 信息工具。

此对象支持 10 个属性。 其中,SENSOR_READING和SENSOR_UPDATE_INTERVAL是 WpdBasicHardwareDriver 定义的自定义属性,表示传感器固件发出的数据。 在此示例中,SENSOR_READING 属性标识传感器 (2=Sensiron 温度和湿度传感器) ,元素计数 (1) ,元素大小 (7 字节) ,当前温度 (74.4 F) ,相对湿度 (37.3%) 。 SENSOR_UPDATE_INTERVAL 属性指定设备触发事件的频率。 此值 02000 以毫秒为单位指定,表示更新间隔为 2 秒。 固件支持配置 2 到 60 秒之间的更新间隔。

在 WPD 中,属性由 PROPERTYKEY 数据结构表示。 此结构由两个部分组成:GUID 和 DWORD。 全局唯一标识符 (GUID) 标识属性类别,DWORD 标识该类别中的特定属性。 有关 PROPERTYKEY 结构的详细信息,请参阅 Windows 驱动程序工具包 (WDK) 文档中的 WPD 中的 PROPERTYKEY 和 GUID

通过使用 DECLARE_PROPERTYKEY 宏,可以在驱动程序中为新属性声明 PROPERTYKEY 结构。 以下示例演示 SENSOR_READING 属性的 PROPERTYKEY 声明。 此示例显示在 WpdObjectProperties.cpp 文件中。

DECLARE_PROPERTYKEY(SENSOR_READING, 0xa7ef4367, 0x6550, 0x4055, 0xb6, 0x6f, 0xbe, 0x6f, 0xda, 0xcf, 0x4e, 0x9f, 2);

除了声明 PROPERTYKEY 之外,还必须定义密钥。 SENSOR_READING键的定义显示在 Stdafx.h 文件中。

DEFINE_PROPERTYKEY(SENSOR_READING, 0xa7ef4367, 0x6550, 0x4055, 0xb6, 0x6f, 0xbe, 0x6f, 0xda, 0xcf, 0x4e, 0x9f, 2);

WpdObjectProperties.cpp 文件包含三个 PROPERTKEY 结构数组的定义。 这些数组标识相关受支持属性的集合。 第一个是 PROPERTYKEY 的数组,用于标识设备和传感器对象共有的属性。

const PROPERTYKEY g_SupportedCommonProperties[] =
{
    WPD_OBJECT_ID,
    WPD_OBJECT_PERSISTENT_UNIQUE_ID,
    WPD_OBJECT_PARENT_ID,
    WPD_OBJECT_NAME,
    WPD_OBJECT_FORMAT,
    WPD_OBJECT_CONTENT_TYPE,
    WPD_OBJECT_CAN_DELETE,
};

如果使用 WpdInfo.exe 工具来检索当前设备和传感器属性,则会注意到上一个数组中的属性显示在两个列表中。

第二个数组是一个 PROPERTYKEYS 数组,用于标识设备对象支持的属性。

const PROPERTYKEY g_SupportedDeviceProperties[] =
{
    WPD_DEVICE_FIRMWARE_VERSION,
    WPD_DEVICE_POWER_LEVEL,
    WPD_DEVICE_POWER_SOURCE,
    WPD_DEVICE_PROTOCOL,
    WPD_DEVICE_MODEL,
    WPD_DEVICE_SERIAL_NUMBER,
    WPD_DEVICE_SUPPORTS_NON_CONSUMABLE,
    WPD_DEVICE_MANUFACTURER,
    WPD_DEVICE_FRIENDLY_NAME,
    WPD_DEVICE_TYPE,
    WPD_FUNCTIONAL_OBJECT_CATEGORY,
};

分配给此数组中各种静态属性的值在 WpdObjectProperties.h 中定义。

#define DEVICE_PROTOCOL_VALUE            L"Sensor Protocol ver 1.00"
#define DEVICE_FIRMWARE_VERSION_VALUE    L"1.0.0.0"
#define DEVICE_POWER_LEVEL_VALUE         100
#define DEVICE_MODEL_VALUE               L"RS232 Sensor"
#define DEVICE_FRIENDLY_NAME_VALUE       L"Parallax BS2 Sensor"
#define DEVICE_MANUFACTURER_VALUE        L"Windows Portable Devices Group"
#define DEVICE_SERIAL_NUMBER_VALUE       L"01234567890123-45676890123456"
#define DEVICE_SUPPORTS_NONCONSUMABLE_VALUE    FALSE

这些值在 WpdObjectProperties::GetPropertyValuesForObject 方法中 分配。

例如,此方法的以下摘录将设备模型字符串 (视差 BS2 传感器) 分配给 WPD_DEVICE_MODEL 属性。

if (IsEqualPropertyKey(Key, WPD_DEVICE_MODEL))
{
    hr = pValues->SetStringValue(WPD_DEVICE_MODEL, DEVICE_MODEL_VALUE);
    CHECK_HR(hr, "Failed to set WPD_DEVICE_MODEL");
}

第三个数组是 PROPERTYKEYS 的数组,该数组标识传感器对象支持的属性以及公共对象属性。

const PROPERTYKEY g_SupportedSensorProperties[] =
{
    SENSOR_READING,
    SENSOR_UPDATE_INTERVAL,
    WPD_FUNCTIONAL_OBJECT_CATEGORY,
};

这些值也在 WpdObjectProperties::GetPropertyValuesForObject 方法中 分配。 但是,分配给 SENSOR_READING 和 SENSOR_UPDATE_INTERVAL 属性的值不是常量;相反,它们是由两个帮助程序函数实时检索的值: WpdObjectProperties::GetSensorReadingWpdObjectProperties::GetUpdateInterval


The WpdBasicHardwareDriverSample

WPD 驱动程序示例