不同类型的传感器报告不同的信息。微软将这些信息称之为数据域 (Data Field),它们集合在一个 SensorDataReport 中。一台电脑可能需要配备一个以上的传感器供一款应用使用。这款应用在信息可用的情况下并不会关注信息的来源(即来自于哪个传感器)。
下表显示了 Win32/COM 和 .NET 最常用数据域的常量名称。与传感器标识符一样,这些常量仅代表它们对应的 GUID 的人类可读的名称。这种对应方法为那些微软预定义的“已知”数据域之外的数据域提供了扩展性。
常量 (Win32*/COM) | 常量 (.NET) | 属性键 (GUID,PID) |
---|---|---|
SENSOR_DATA_TYPE_TIMESTAMP | SensorDataTypeTimestamp | {DB5E0CF2-CF1F-4C18-B46C-D86011D62150},2 |
SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX | SensorDataTypeLightLevelLux | {E4C77CE2-DCB7-46E9-8439-4FEC548833A6},2 |
SENSOR_DATA_TYPE_ACCELERATION_X_G | SensorDataTypeAccelerationXG | {3F8A69A2-07C5-4E48-A965-CD797AAB56D5},2 |
SENSOR_DATA_TYPE_ACCELERATION_Y_G | SensorDataTypeAccelerationYG | {3F8A69A2-07C5-4E48-A965-CD797AAB56D5},3 |
SENSOR_DATA_TYPE_ACCELERATION_Z_G | SensorDataTypeAccelerationZG | {3F8A69A2-07C5-4E48-A965-CD797AAB56D5},4 |
SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEGRE | SensorDataTypeAngularVelocityXDegreesPerSecond | {3F8A69A2-07C5-4E48-A965-CD797AAB56D5},10 |
SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DEGRE | SensorDataTypeAngularVelocityYDegreesPerSecond | {3F8A69A2-07C5-4E48-A965-CD797AAB56D5},11 |
SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DEGRE | SensorDataTypeAngularVelocityZDegreesPerSecond | {3F8A69A2-07C5-4E48-A965-CD797AAB56D5},12 |
SENSOR_DATA_TYPE_TILT_X_DEGREES | SensorDataTypeTiltXDegrees | {1637D8A2-4248-4275-865D-558DE84AEDFD},2 |
SENSOR_DATA_TYPE_TILT_Y_DEGREES | SensorDataTypeTiltYDegrees | {1637D8A2-4248-4275-865D-558DE84AEDFD},3 |
SENSOR_DATA_TYPE_TILT_Z_DEGREES | SensorDataTypeTiltZDegrees | {1637D8A2-4248-4275-865D-558DE84AEDFD},4 |
SENSOR_DATA_TYPE_MAGNETIC_HEADING_COMPEN | SensorDataTypeMagneticHeadingCompen | {1637D8A2-4248-4275-865D-558DE84AEDFD},11 |
SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_ | SensorDataTypeMagneticFieldStrengthXMilligauss | {1637D8A2-4248-4275-865D-558DE84AEDFD},19 |
SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_ | SensorDataTypeMagneticFieldStrengthYMilligauss | {1637D8A2-4248-4275-865D-558DE84AEDFD},20 |
SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH_ | SensorDataTypeMagneticFieldStrengthZMilligauss | {1637D8A2-4248-4275-865D-558DE84AEDFD},21 |
SENSOR_DATA_TYPE_QUATERNION | SensorDataTypeQuaternion | {1637D8A2-4248-4275-865D-558DE84AEDFD},17 |
SENSOR_DATA_TYPE_ROTATION_MATRIX | SensorDataTypeRotationMatrix | {1637D8A2-4248-4275-865D-558DE84AEDFD},16 |
SENSOR_DATA_TYPE_LATITUDE_DEGREES | SensorDataTypeLatitudeDegrees | {055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},2 |
SENSOR_DATA_TYPE_LONGITUDE_DEGREES | SensorDataTypeLongitudeDegrees | {055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},3 |
SENSOR_DATA_TYPE_ALTITUDE_ELLIPSOID_METERS | SensorDataTypeAltitudeEllipsoidMeters | {055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},5 |
使得数据域标识符与传感器 ID 不同的原因是使用了名为属性键的数据类型。一个属性键包括一个 GUID (类似于传感器的 GUID) 以及一个名为“PID”的额外编号(属性 ID)。您可能会注意到属性键的 GUID 部分对于同一类别的传感器是通用的。数据域的所有值都具有本机数据类型,例如Boolean、unsigned char、int、float、double 等。
在 Win32/COM 中,数据域的值存储在名为 PROPVARIANT 的多态数据类型中。在 .NET 中,有一个名为“对象”(object) 的 CLR(通用语言运行时)数据类型执行相同的操作。而多态数据类型则需要被查询和/或转换为“预期”或“记录”数据类型。
使用传感器的 SupportsDataField() 方法检查传感器,获取感兴趣的数据域。这是选择传感器时最常使用的编程术语。根据应用的使用模型不同,可能仅需要使用部分的数据域。应当选择那些可以支持预期数据域的传感器。类型转换时要求对来自基类传感器的子类成员变量进行分配。
ISensor* m_pAls;
ISensor* m_pAccel;
ISensor* m_pTilt;
// Cycle through the collection looking for sensors we care about.
ULONG ulCount = 0;
HRESULT hr = pSensorCollection->GetCount(&ulCount);
if (FAILED(hr))
{
::MessageBox(NULL, _T("Unable to get count of sensors on the computer."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
return -1;
}
for (int i = 0; i < (int)ulCount; i++)
{
hr = pSensorCollection->GetAt(i, &pSensor);
if (SUCCEEDED(hr))
{
VARIANT_BOOL bSupported = VARIANT_FALSE;
hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, &bSupported);
if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pAls = pSensor;
hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_ACCELERATION_Z_G, &bSupported);
if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pAccel = pSensor;
hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_TILT_Z_DEGREES, &bSupported);
if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pTilt = pSensor;
.
.
.
}
}