65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (11投票s)

2009年5月2日

CPOL

2分钟阅读

viewsIcon

76832

downloadIcon

1345

在 Windows 7 中演示传感器 API 的“传感器浏览器”

引言

传感器 API 是一个简单的 Windows 7 ActiveX 接口,允许您与传感器通信。 传感器可以检测光线、温度、电力、位置(GPS)、运动等。(支持的类别列表可在 MSDN 中找到)。

您需要

在哪里找到传感器?

在 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 命名空间。 这目前实现了 SENSORLIGHTSENSOR 类,用于如下使用

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 日:首次发布。
© . All rights reserved.