传感器 API:让您的 Win32 应用程序在 Windows 7 中感知环境






4.89/5 (11投票s)
在 Windows 7 中演示传感器 API 的“传感器浏览器”
引言
传感器 API 是一个简单的 Windows 7 ActiveX 接口,允许您与传感器通信。 传感器可以检测光线、温度、电力、位置(GPS)、运动等。(支持的类别列表可在 MSDN 中找到)。
您需要
- Windows 7
- Windows 7 SDK
#include <sensors.h>
#include <sensorapi.h>
- MSDN 文档,用于 传感器 API
在哪里找到传感器?
在 SDK 中,有一个 虚拟光线传感器,可以模拟光线传感器。 随着 Windows 7 的发布,越来越多的设备将支持传感器抽象 API。
在我的网站中,我还创建了一个 GPS 传感器驱动程序,它从 COM 端口读取实际的 GPS 数据。 更多信息请阅读 这里。
概述
这里的示例提供了用于完整(浏览器)传感器功能以及一个简单的 SENSOR
命名空间的 [代码],该命名空间在您可以使用的库中实现传感器。 完整浏览器的步骤是
- 调用
CoCreateInstance()
实例化一个ISensorManager
。 - 使用请求的类别(MSDN 中的所有类别)调用
ISensorManager::GetSensorsByCategory
。 - 从返回的
ISensorCollection
中,调用GetCount()
以获取该类别中的传感器数量,然后调用GetAt()
检索一个ISensor
。 - 使用
ISensor
方法来了解传感器属性、类型、ID 等。 - 要获取支持的数据字段,请调用
ISensor::GetSupportedDataFields()
。 - 使用从返回的
IPortableDeviceCollection
中调用GetCount()
和GetAt()
来获取数据字段。 - 使用
ISensor::GetData()
检索ISensorDataReport
中的当前数据。 - 使用
ISensorDataReport::GetSensorValue
获取特定值,使用ISensorDataReport::GetTimestamp
返回收集数据的时间。
默认情况下禁用传感器,因此当您在检索传感器状态时收到访问被拒绝错误时,您可能需要调用 ISensorManager::RequestPermissions
。
所有这些东西都用在 main.cpp 中。
传感器管理器事件
传感器管理器可以在发生某些事情时通知您。 实现一个 ISensorManagerEvents
,然后将其传递给 ISensorManager::SetEventSink
。 目前,此接口实现 OnSensorEnter()
函数,当传感器可用时会调用该函数。
传感器事件
传感器可以在发生某些事情时通知您。 实现一个 ISensorEvents
,然后将其传递给 ISensor::SetEventSink
,然后调用 ISensor::SetEventInterest
以指示您要接收的通知类型。 目前,ISensorEvents
实现了四个成员函数,这些函数在发生事件、数据更改、状态更改以及传感器被禁用时通知您。
使用实际传感器
虚拟光线传感器适合用于测试目的,但我们需要真实数据。 我创建了一个小型示例驱动程序项目,GPSDirect,它可以从 COM 端口(蓝牙、USB 等)读取和解析实际的 GPS 信息。 此驱动程序目前支持解析 GGA 和 RMC 语句以提供位置信息。
SensorLib
如果您只需要一个简单的接口,您可以使用我的 senslib* 项目和 SENSOR
命名空间。 这目前实现了 SENSOR
和 LIGHTSENSOR
类,用于如下使用
INT_PTR CALLBACK D_DP(HWND hh,UINT mm,WPARAM ww,LPARAM ll)
{
HWND hT = GetDlgItem(hh,701);
HWND hL2 = GetDlgItem(hh,902);
static SENSOR::LIGHTSENSOR* ls = 0;
switch(mm)
{
case WM_INITDIALOG:
{
SetClassLongPtr(hh,GCLP_HICONSM,(LONG_PTR)hIcon1);
SetClassLongPtr(hh,GCLP_HICON,(LONG_PTR)hIcon1);
if (!SENSOR::InitializeSensorManager())
// Make sure we are running under Windows 7
{
EndDialog(hh,-1);
break;
}
// Install the light sensor, giving it our HWND and a custom message
ls = new SENSOR::LIGHTSENSOR(hh,WM_USER);
break;
}
case WM_USER:
{
// Sent by LIGHTSENSOR.
// ww == 0 -> ll == address of a SENSOR_DATA containing the sensor data
// ww == 1 -> Sensor is disabled
// ww == 2 -> State changed, ll = the new SensorState
if (ww == 0)
{
SENSOR::SENSOR_DATA* data = (SENSOR::SENSOR_DATA*)ll;
if (data)
{
for(unsigned int i = 0 ; i < data->Num ; i++)
{
if (data->keys[i] == SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX)
{
TCHAR x[100];
_stprintf(x,_T("Lux: %f"),data->data[i].fltVal);
SetDlgItemText(hh,701,x);
}
}
}
}
return 0;
}
case WM_CLOSE:
{
delete ls;
SENSOR::FreeSensorManager();
EndDialog(hh,0);
return 0;
}
}
return 0;
}
待办事项...
- 添加 Location API。
历史
- 2009 年 9 月 28 日:库更新和 GPS 传感器。
- 2009 年 5 月 2 日:首次发布。