ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows-universal-samples 之 Custom sensors 示例:基于 Windows.Devices.Sensors.Custom 的自定义传感器读取实战

Windows-universal-samples 之 Custom sensors 示例:基于 Windows.Devices.Sensors.Custom 的自定义传感器读取实战 示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载本篇文章以仓库中archived/CustomSensors示例配套的非归档 C# 版本位于Samples/CustomSensors为研究对象系统讲解 UWP 应用如何通过Windows.Devices.Sensors.Custom命名空间访问由驱动程序暴露的自定义传感器。示例围绕一个 CO2 浓度模拟传感器展开演示了数据事件流式订阅与按需轮询读取两种典型接入方式读完本文你将掌握自定义传感器厂商类型 ID、属性键Property Key、报告间隔Report Interval、设备监视器与设备访问状态监听等核心概念的用法并能在自己的 UWP 项目中复现同样的接入流程。示例概览为 CO2 自定义传感器而生该示例的目标非常聚焦让用户查看基于自定义传感器驱动实现的 CO2 浓度值。示例使用Windows.Devices.Sensors.Custom命名空间该命名空间允许 UWP 应用读取由第三方厂商驱动提供的、不在系统标准传感器体系内的传感器数据。示例提供两个并列的接入场景见 sample-configuration.js 中的scenarios声明Custom Sensor Data Events数据事件点击Enable按钮后应用实时流式接收传感器读数界面持续刷新 CO2 值Polling Custom Sensor Readings轮询读取点击Get CO2 level按钮应用一次性拉取当前时刻的传感器读数并显示。两个场景共享同一套底层 API 调用链区别仅在于持续订阅与按需获取的数据获取策略这也正是Windows.Devices.Sensors.Custom与标准传感器 API如Windows.Devices.Sensors.Accelerometer在编程模型上的共通之处。两个核心标识厂商定义类型 ID 与属性键理解自定义传感器接入必须先理解驱动侧约定的两个标识它们贯穿整个示例源码1. 厂商定义类型 IDVendor-Defined Type ID该 ID 由传感器厂商定义对每种自定义传感器类型唯一每个自定义传感器驱动都应定义唯一的一个 ID。示例中使用的 ID 对应 WDKWindows Driver Kit自带的 CO2 模拟传感器驱动示例var customSensorDeviceVendorDefinedTypeID {4025a865-638c-43aa-a688-98580961eeae};在 C# 版本Scenario1_DataEvents.xaml.cs中写作new Guid(4025a865-638c-43aa-a688-98580961eeae)。应用通过该 ID 生成设备选择器从而在系统设备枚举中按类型找到对应传感器。2. 属性键Property Key属性键由厂商为驱动暴露的每一个数据字段定义同样按驱动划分、对每种自定义传感器类型唯一。示例只定义了一个键即 CO2 浓度值注释明确指出其他驱动若暴露多个字段可以通过递增属性键索引index定义更多键var co2LevelKey {74879888-a3cc-45c6-9ea9-058838256433} 1;注意其格式为GUID 空格 索引序号读取读数时通过reading.properties.hasKey(co2LevelKey)判断字段是否存在再通过reading.properties.lookup(co2LevelKey)取出数值。从源码结构看CustomSensorReading的属性集合是驱动与上层应用之间传递自定义数据的主要通道。场景一通过 Data Events 流式订阅 CO2 读数事件场景的核心页面逻辑位于 scenario1_DataEvents.js对应界面模板 scenario1_DataEvents.html。界面仅包含Enable/Disable两个按钮与一个 CO2 浓度输出元素。页面初始化启动设备发现与访问状态监听var customSensorSelector Windows.Devices.Sensors.Custom.CustomSensor.getDeviceSelector(customSensorDeviceVendorDefinedTypeID); watcher Windows.Devices.Enumeration.DeviceInformation.createWatcher(customSensorSelector, null); watcher.addEventListener(added, onCustomSensorAdded); watcher.start(); // 注册监听用户可能在隐私设置中关闭对自定义传感器的访问 deviceAccessInformation Windows.Devices.Enumeration.DeviceAccessInformation.createFromDeviceClassId(customSensorDeviceVendorDefinedTypeID); deviceAccessInformation.addEventListener(accesschanged, onAccessChanged);关键点CustomSensor.getDeviceSelector()以厂商类型 ID 为参数生成 AQS 选择器用于过滤出匹配的传感器设备DeviceInformation.createWatcher()启动异步设备枚举当发现匹配设备时触发added事件DeviceAccessInformation.createFromDeviceClassId()与accesschanged事件用于感知用户在系统隐私设置中撤销传感器访问权限的情况——访问被拒绝时示例将customSensor置为null并输出错误日志。发现设备计算合适的报告间隔onCustomSensorAdded回调通过CustomSensor.fromIdAsync()依据设备 ID 异步获取CustomSensor实例var minimumReportInterval customSensor.minimumReportInterval; reportInterval minimumReportInterval 200 ? minimumReportInterval : 200;这里体现了报告间隔的选择策略优先取传感器支持的最小间隔但保证应用侧至少以 200ms 为周期获得数据若最小间隔大于 200ms 则退而使用驱动的最小值。该值在用户点击Enable时才真正生效。点击 Enable激活传感器事件流function enableReadingChangedScenario() { if (customSensor) { customSensor.reportInterval reportInterval; // 设置报告间隔以启用传感器事件 document.addEventListener(visibilitychange, onVisibilityChanged, false); customSensor.addEventListener(readingchanged, onDataChanged); ... } }readingchanged事件处理器从e.reading中取读数并刷新界面function onDataChanged(e) { var reading e.reading; if (document.getElementById(eventOutputCO2Level) reading.properties.hasKey(co2LevelKey)) { document.getElementById(eventOutputCO2Level).innerText reading.properties.lookup(co2LevelKey).toFixed(1); } }toFixed(1)将 CO2 值格式化为一位小数C# 版本则使用String.Format({0,5:0.00}, ...)保留两位小数。事件可能在页面卸载后仍留在队列中因此代码先检查输出元素是否存在。点击 Disable 与页面卸载释放传感器资源customSensor.removeEventListener(readingchanged, onDataChanged); customSensor.reportInterval 0; // 恢复默认报告间隔释放传感器资源将reportInterval重置为 0 是释放底层传感器资源的标准做法C# 版本的OnNavigatingFrom中同样执行customSensor.ReportInterval 0。可见性处理避免后台误触发示例还注册了visibilitychange监听当应用进入后台时移除readingchanged监听回到前台时重新注册。源码注释明确指出只有当应用不可见时处理传感器数据可能引发非预期行为时才需要这类处理属于面向场景的优化而非强制要求。场景二通过 Polling 按需读取当前 CO2 值轮询场景的核心页面逻辑位于 scenario2_Polling.js界面模板为 scenario2_Polling.html。初始化阶段的设备监视器与访问监听逻辑与场景一完全一致区别在于点击Get CO2 level按钮后的处理function getCO2Level() { if (customSensor) { var reading customSensor.getCurrentReading(); if (reading reading.properties.hasKey(co2LevelKey)) { document.getElementById(eventOutputCO2Level).innerText reading.properties.lookup(co2LevelKey).toFixed(1); } } else { WinJS.log WinJS.log(No custom sensor found, sample, error); } }轮询模式不依赖readingchanged事件也无需设置reportInterval每次调用getCurrentReading()同步取回当前时刻的读数快照。该模式适合低频、按需的数据获取需求资源占用更低事件模式则适合需要持续、实时监控数据的场景。应用清单中的传感器能力声明自定义传感器的访问必须在应用清单中显式声明设备能力见 Package.appxmanifestCapabilities DeviceCapability Namesensors.custom Device Idany Function TypeinterfaceId:4025A865-638C-43AA-A688-98580961EEAE/ /Device /DeviceCapability /Capabilities其中Namesensors.custom声明自定义传感器能力Function Type中的interfaceId必须与代码中的厂商定义类型 ID 对应清单中为大写形式代码中为小写形式两者等效。缺少该声明时应用将无法枚举到对应传感器。该清单还声明了Windows.Universal目标设备家族MinVersion10.0.10240.0即最低支持 Windows 10 初始版本。C# 版本的对照实现非归档目录Samples/CustomSensors提供了 C# 版本两个场景的代码结构、常量定义与 JS 版本一一对应Scenario1_DataEvents.xaml.cs使用CustomSensor.GetDeviceSelector(Guid)生成选择器、DeviceInformation.CreateWatcher启动监视、CustomSensor.FromIdAsync获取实例并在ScenarioEnable中设置customSensor.ReportInterval desiredReportInterval后挂接ReadingChanged事件Scenario2_Polling.xaml.csGetCO2Level处理器直接调用customSensor.GetCurrentReading()并通过reading.Properties[CO2LevelKey]取数两个 C# 场景在OnCustomSensorAdded中都会先取一次当前读数并检查reading.Properties.ContainsKey(CO2LevelKey)用于确认找到的传感器确实提供 CO2 读数否则将实例置空并提示错误——这是一个值得借鉴的设备能力校验模式。从仓库结构看Samples/CustomSensors/README.md 指明该 JS 实现已归档C# 版本为当前维护形态两者共享同一套 Windows 运行时 API编程模型完全等价。系统要求、构建与运行原文档列出的环境要求为客户端Windows 10服务器Windows Server 2016 Technical Preview手机Windows 10结合清单中的MaxVersionTested10.0.18362.0可以认为该示例面向 Windows 10 全平台桌面、移动端等的 UWP 应用开发。构建步骤若通过 ZIP 下载整个示例集合务必解压整个压缩包而不是只解压单个示例目录——仓库中的共享依赖如 SharedContent 下的通用框架代码需要一并解压才能编译使用 Visual Studio 打开解决方案File → Open → Project/Solution在解压目录下依次进入对应示例子目录与语言子目录JS 版为archived/CustomSensors/js双击 CustomSensor.slnC# 版为Samples/CustomSensors/cs双击 CustomSensors.sln按CtrlShiftB或选择Build → Build Solution构建。运行步骤仅部署选择Build → Deploy Solution部署并调试运行按F5或选择Debug → Start Debugging不带调试运行按CtrlF5或选择Debug → Start Without Debugging。需要特别说明的是示例依赖 WDK 中配套的 CO2 模拟传感器驱动在没有该驱动或对应硬件或模拟器环境的情况下应用会按代码路径输出 No custom sensor found 或访问被拒绝的提示这正是代码中大量WinJS.log错误分支与DeviceAccessInformation监听的用武之地。实战要点小结双标识缺一不可厂商类型 ID 用于设备选择与清单声明属性键用于从读数属性集合中取具体字段二者均以驱动侧定义为准事件模式记得释放资源停止监听后务必把reportInterval重置为 0避免传感器持续占用硬件资源应用挂起、页面导航离开时也应同步处理C# 版本在OnNavigatingFrom中完成轮询模式零配置getCurrentReading()不需要设置报告间隔适合低频读取隐私访问状态要监听用户可能随时在系统设置中关闭传感器权限DeviceAccessInformation的accesschanged事件是感知这一变化的标准途径设备能力校验拿到传感器实例后先读一次属性集合确认目标字段存在再决定后续流程是否继续。赞分享示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载相关推荐Windows-universal-samples 之 CustomSensorsUWP 自定义传感器CO2事件流与轮询读取实战指南Windows universal samples 之 CustomSensorsUWP 自定义传感器CO2事件流与轮询读取实战指南 本指南以 Windo示例工程Windows 通用传感器开发实战基于 Windows-universal-samples 的 Inclinometer 倾斜传感器示例深度解析Windows 通用传感器开发实战基于 Windows universal samples 的 Inclinometer 倾斜传感器示例深度解析 本篇文章以本示例工程Windows-universal-samples 之 IoT-I2C 示例用 Windows.Devices.I2c 在 IoT 设备上读取传感器数据Windows universal samples 之 IoT I2C 示例用 Windows.Devices.I2c 在 IoT 设备上读取传感器数据 本文示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表