支持蓝牙事件通知

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

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

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

有关创建 SCO 连接的详细信息,请参阅创建 SCO 客户端与远程设备的连接

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

当 L2CAP 配置文件驱动程序发出 BRB_L2CA_OPEN_CHANNEL BRB 时,它会在 BRB 的相应 _BRB_L2CA_OPEN_CHANNEL 结构的 Callback 成员中指定指向其 L2CAP 回调函数的指针。 如果远程设备接受 L2CAP 连接请求,则蓝牙驱动程序堆栈可以在发生对 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_CHANNELBRB_L2CA_OPEN_CHANNEL_RESPONSE 请求,此上下文是在随该请求一起传递的 _BRB_L2CA_OPEN_CHANNEL 结构的 CallbackContext 成员中传递的值。

  • 来自 INDICATION_CODE 枚举的值,指示传入 L2CAP 连接或绑定状态更改的通知事件的类型。

  • 指向包含与通知事件关联的参数的 INDICATION_PARAMETERS 结构的指针。

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

如果 Indication 参数的值等于... ...使用 Parameters参数的以下联合成员
IndicationRemoteConnect 连接
IndicationRemoteConfigRequest ConfigRequest
IndicationRemoteConfigResponse ConfigResponse
IndicationFreeExtraOptions FreeExtraOptions
IndicationRemoteDisconnect 断开连接
IndicationRecvPacket RecvPacket

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

  • 为 SCO 连接定义的上下文。 对于 BRB_SCO_REGISTER_SERVER 请求,此上下文是在随该请求一起传递的 _BRB_SCO_REGISTER_SERVER 结构的 IndicationCallbackContext 成员中传递的值。 对于 BRB_SCO_OPEN_CHANNELBRB_SCO_OPEN_CHANNEL_RESPONSE 请求,此上下文是在随该请求一起传递的 _BRB_SCO_OPEN_CHANNEL 结构的 CallbackContext 成员中传递的值。

  • 来自 SCO_INDICATION_CODE 枚举的值,指示传入 SCO 连接或绑定状态更改的通知的类型。

  • 指向包含与通知事件关联的参数的 SCO_INDICATION_PARAMETERS 结构的指针。

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

如果 Indication 参数的值等于... ...使用 Parameters参数的以下联合成员
ScoIndicationRemoteConnect 连接
ScoIndicationRemoteDisconnect 断开连接

处理即插即用移除 IRP

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

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

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