windows蓝牙驱动开发-支持蓝牙事件通知

当配置文件驱动程序打开与远程设备的连接时,它应自行注册,以在连接关闭时或对连接做出任何其他更改时收到通知。 此外,当配置文件驱动程序自行注册以接受传入连接时,它必须能够在远程设备尝试连接到它时收到通知。

使用面向同步连接 (SCO) 的连接实现和注册 SCO 回调函数的配置文件驱动程序。 客户端配置文件驱动程序会在请求连接到远程设备时注册相应的回调函数。

当 SCO 配置文件驱动程序发出 BRB_SCO_OPEN_CHANNEL BRB 时,它会在 BRB 的相应 _BRB_SCO_OPEN_CHANNEL 结构的 Callback 成员中指定指向其 SCO 回调函数的指针。 如果远程设备接受 SCO 连接请求,则蓝牙驱动程序堆栈可以在发生对 SCO 连接的更改时通过该回调函数将通知发送到配置文件驱动程序。

使用逻辑链接控制器和适应协议 (L2CAP) 连接的配置文件驱动程序会实现并注册 L2CAP 回调函数。

当 L2CAP 配置文件驱动程序发出 BRB_L2CA_OPEN_CHANNEL BRB 时,它会在 BRB 的相应 _BRB_L2CA_OPEN_CHANNEL 结构的 Callback 成员中指定指向其 L2CAP 回调函数的指针。 如果远程设备接受 L2CAP 连接请求,则蓝牙驱动程序堆栈可以在发生对 L2CAP 连接的更改时通过该回调函数将通知发送到配置文件驱动程序。

同样,当配置文件驱动程序自行注册以接受传入(L2CAP、SCO)连接请求时,它必须注册回调函数,才能在远程设备尝试连接到它时收到通知。

使用 L2CAP 的配置文件驱动程序会在 _BRB_L2CA_REGISTER_SERVER 结构的 IndicationCallback 成员中指定其 L2CAP 回调函数。 然后,蓝牙驱动程序堆栈可以调用回调函数,以在远程设备尝试启动与配置文件驱动程序的 L2CAP 连接时通知配置文件驱动程序。

使用 L2CAP 的配置文件驱动程序会在 _BRB_SCO_REGISTER_SERVER 结构的 IndicationCallback 成员中指定其 L2CAP 回调函数。 然后,蓝牙驱动程序堆栈可以调用回调函数,以在远程设备尝试启动与配置文件驱动程序的 SCO 连接时通知配置文件驱动程序。

配置文件驱动程序注册适当的回调函数后,蓝牙驱动程序堆栈还可以在打开的连接中发生事件时通知配置文件驱动程序。

配置文件驱动程序可以注册同一回调函数,以发送有关打开的通道和尝试连接到它的远程设备的通知。

对于 L2CAP 连接,L2CAP 回调函数接受三个参数:

  • 为 L2CAP 连接定义的上下文。 对于 BRB_L2CA_REGISTER_SERVER 请求,此上下文是在随该请求一起传递的 _BRB_L2CA_REGISTER_SERVER 结构的 IndicationCallbackContext 成员中传递的值。 对于 BRB_L2CA_OPEN_CHANNEL 或 BRB_L2CA_OPEN_CHANNEL_RESPONSE 请求,此上下文是在随该请求一起传递的 _BRB_L2CA_OPEN_CHANNEL 结构的 CallbackContext 成员中传递的值;
  • 来自 INDICATION_CODE 枚举的值,指示传入 L2CAP 连接或绑定状态更改的通知事件的类型;
  • 指向包含与通知事件关联的参数的 INDICATION_PARAMETERS 结构的指针;

在 L2CAP 回调函数的 Indication 参数中传递的值用于指定配置文件驱动程序应使用的 Parameters 参数的 Parameters 联合中的哪个联合成员。

对于 SCO 连接,SCO 回调函数接受三个参数:

  • 为 SCO 连接定义的上下文。 对于 BRB_SCO_REGISTER_SERVER 请求,此上下文是在随该请求一起传递的 _BRB_SCO_REGISTER_SERVER 结构的 IndicationCallbackContext 成员中传递的值。 对于 BRB_SCO_OPEN_CHANNEL 或 BRB_SCO_OPEN_CHANNEL_RESPONSE 请求,此上下文是在随该请求一起传递的 _BRB_SCO_OPEN_CHANNEL 结构的 CallbackContext 成员中传递的值;
  • 来自 SCO_INDICATION_CODE 枚举的值,指示传入 SCO 连接或绑定状态更改的通知的类型;
  • 指向包含与通知事件关联的参数的 SCO_INDICATION_PARAMETERS 结构的指针;

在 SCO 回调函数的 Indication 参数中传递的值用于指定配置文件驱动程序应使用的 Parameters 参数的 Parameters 联合中的哪个联合成员。

处理即插即用移除 IRP

配置文件驱动程序应沿着将由蓝牙驱动程序堆栈立即处理的堆栈向下传递所有 IRP_MN_SURPRISE_REMOVAL IRP。 在处理意外移除 IRP 的过程中,请勿尝试关闭任何打开的通道。 不要在收到意外移除 IRP 后生成并发送任何将数据发送到基础无线电的更多 BR。 但是,配置文件驱动程序可以在处理意外移除 IRP 时执行其他清理。

在蓝牙驱动程序堆栈收到意外移除 IRP 后,它会将 ScoIndicationRemoteDisconnect 传递给由配置文件驱动程序在生成并发送了 BRB_SCO_OPEN_CHANNEL 或 BRB_SCO_OPEN_CHANNEL_RESPONSE 请求时指定的 SCO 回调函数,以关闭当前打开的任何 SCO 通道。 同样,蓝牙驱动程序堆栈会将 IndicationRemoteDisconnect 传递给由配置文件驱动程序在生成并发送了 BRB_L2CA_OPEN_CHANNEL 或 BRB_L2CA_OPEN_CHANNEL_RESPONSE 请求时指定的 L2CAP 回调函数,以关闭当前打开的所有 L2CAP 通道。

在处理 IRP_MN_REMOVE_DEVICE IRP 时,配置文件驱动程序应注销所有服务器。 若要注销 SCO 服务器,配置文件驱动程序应生成并发送BRB_SCO_UNREGISTER_SERVER 请求。 若要注销 L2CAP 服务器,配置文件驱动程序应生成并发送 BRB_L2CA_UNREGISTER_SERVER 请求。

相关推荐
小熊吃保安19 分钟前
Windows也能用 Apple Watch 解锁
windows·rust·开源
fengye2071611 小时前
Windows 环境下硬核编译 CPython 避坑指南
windows
lisw052 小时前
算法与软件的本质区别
驱动开发·算法·数学建模
泡海椒2 小时前
JQuick-SQL “数据源 SPI”辨析:应用适配器与 Function SPI 的正确边界
数据库·驱动开发·sql
万物智能信息科技3 小时前
Zigbee透传驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
驱动开发·华为·开源·harmonyos·鸿蒙
成成爱质评4 小时前
Windows 任务计划程序 + 唤醒定时器:让电脑按时开机干活
windows·单片机·电脑
禁默4 小时前
iPhone远程控制Windows电脑哪款好?四款工具实测横评
windows·电脑·iphone
AMASENSYS艾马斯4 小时前
低压变频器输入输出电抗器选型指南
驱动开发·单片机·机器学习·硬件工程·精益工程
Sakura_j_h_13 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
隔窗听雨眠16 小时前
PostgreSQL单表从Windows迁移到Linux:差异剖析、方案对比与全流程实战
linux·windows·postgresql