当前位置: 首页 > news >正文

windows蓝牙驱动开发-在蓝牙配置文件驱动程序中接受 L2CAP 连接

L2CAP 服务器配置文件驱动程序会响应来自远程设备的传入逻辑链接控制和适应协议 (L2CAP) 连接请求。 例如,PDA 的 L2CAP 服务器配置文件驱动程序将响应来自 PDA 的传入连接请求。

接收传入 L2CAP 连接请求

1. 若要接收来自特定 PSM 的任何远程设备的传入 L2CAP 连接请求,配置文件驱动程序应先生成并发送BRB_L2CA_REGISTER_SERVER 请求,并在请求的 _BRB_L2CA_REGISTER_SERVER 结构的 BtAddress 成员中指定 NULL,并 Psm 成员中指定 0。 发送 BRB_L2CA_REGISTER_SERVER 请求时,配置文件驱动程序还必须向蓝牙驱动程序堆栈注册 L2CAP 回调函数。 这使蓝牙驱动程序堆栈能够通知配置文件驱动程序有传入 L2CAP 连接请求。

然后,配置文件驱动程序应生成并发送BRB_REGISTER_PSM 请求,以便蓝牙驱动程序堆栈将接受请求注册的 PSM 的连接。 否则,蓝牙驱动程序堆栈将拒绝具有未知(未注册)连接请求的所有连接请求。 

2. 若要接收来自特定远程设备/PSM 对的传入 L2CAP 连接请求,配置文件驱动程序应生成并发送BRB_L2CA_REGISTER_SERVER 请求,并在请求的随附 _BRB_L2CA_REGISTER_SERVER 结构的 BtAddress 成员中指定远程设备的地址,并在 Psm 成员中指定 PSM。 发送 BRB_L2CA_REGISTER_SERVER 请求时,配置文件驱动程序还必须向蓝牙驱动程序堆栈注册 L2CAP 回调函数。 这使蓝牙驱动程序堆栈能够通知配置文件驱动程序有传入 L2CAP 连接请求。

3. 配置文件驱动程序应发出 IOCTL_BTH_SDP_SUBMIT_RECORD。 然后,配置文件驱动程序可以注册描述配置文件驱动程序支持的服务的 SDP 记录,以便远程系统可以使用 SDP 发现新服务。

4. 当蓝牙驱动程序堆栈接收来自远程设备的传入 L2CAP 连接请求时,蓝牙驱动程序堆栈会调用配置文件驱动程序之前注册的 L2CAP 回调函数。 蓝牙驱动程序堆栈会将值 IndicationRemoteConnect 传递给回调函数的指示参数。

5. 若要响应传入连接请求,配置文件驱动程序应生成并发送BRB_L2CA_OPEN_CHANNEL_RESPONSE 请求。 服务器配置文件驱动程序使用从回调函数的 Parameters 参数中的蓝牙驱动程序堆栈传递的值来与远程设备协商连接设置。 根据使用此请求传递的 _BRB_L2CA_OPEN_CHANNEL 结构的 Response 成员的值,服务器配置文件驱动程序接受或拒绝连接请求。

6. 如果服务器配置文件驱动程序接受连接,则蓝牙驱动程序堆栈可以调用 _BRB_L2CA_OPEN_CHANNEL 结构的 Callback 成员中指定的 L2CAP 回调函数。 蓝牙驱动程序堆栈使用此函数通知服务器配置文件驱动程序有 L2CAP 连接更改。

特点

单个配置文件驱动程序可以通过生成和发送多个 BRB_L2CA_REGISTER_SERVER 请求来注册多个 L2CAP 服务器,从而注册来自多个、不同远程设备/PSM 对的传入 L2CAP 连接请求,并在请求的BtAddress 和 Psm 成员中指定唯一的远程设备地址和 PSM 对。

单个配置文件驱动程序可以注册以接收来自特定 PSM 的任何远程设备的传入 L2CAP 连接请求,并接收来自多个不同远程设备/PSM 对的传入 L2CAP 连接请求,方法是首先注册以接收来自特定 PSM 的任何远程设备的传入 L2CAP 连接请求,然后注册以接收来自特定远程设备/PSM 对的传入 L2CAP 连接请求,前提是注册了特定的 PSM 在第一步中未再次注册。

多个配置文件驱动程序无法注册以接收来自同一 PSM 的任何远程设备的传入 L2CAP 连接请求。 蓝牙驱动程序堆栈仅允许一个配置文件驱动程序接收来自特定 PSM 的任何远程设备的传入 L2CAP 连接请求。

配置文件驱动程序接受连接请求后,可以使用其他 BRB 通过新建立的 L2CAP 连接发送和接收数据。

若要停止接收远程设备 L2CAP 连接尝试的通知,则在配置文件驱动程序处理 IRP_MN_REMOVE_DEVICE 即插即用删除通知时,配置文件驱动程序应生成并发送BRB_L2CA_UNREGISTER_SERVER 请求,以注销服务器。

http://www.lryc.cn/news/537048.html

相关文章:

  • 【原理图PCB专题】自制汉字转码工具,适配Allgero 17版本 Skill
  • 欧拉公式在信号处理中的魔法:调幅信号的生成与频谱分析
  • 如何在Ubuntu中切换多个PHP版本
  • 基于opencv的HOG+角点匹配教程
  • Linux线程概念与线程操作
  • AI软件栈:LLVM分析(五)
  • Git指南-从入门到精通
  • Linux 文件系统挂载
  • Qt QSpinBox 总结
  • 【OJ项目】深入剖析题目接口控制器:功能、实现与应用
  • 周考考题(学习自用)
  • 【matlab】大小键盘对应的Kbname
  • LabVIEW与小众设备集成
  • Android 系统Service流程
  • Gartner预测2025年网络安全正在进入AI动荡时期:软件供应链和基础设施技术堆栈中毒将占针对企业使用的人工智能恶意攻击的 70% 以上
  • 华为最新OD机试真题-最长子字符串的长度(一)-Python-OD统一考试(E卷)
  • HAL库框架学习总结
  • 基于Spring Integration的ESB与Kettle结合实现实时数据处理技术
  • qt QOpenGLContext详解
  • 探索顶级汽车软件解决方案:驱动行业变革的关键力量
  • Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力
  • DeepSeek 概述与本地化部署【详细流程】
  • FFmpeg Video options
  • 从51到STM32:PWM平滑迁移方案
  • openCV中如何实现滤波
  • BGP配置华为——路由汇总
  • 机器学习核心算法解析
  • 【C++学习篇】C++11
  • SQLite 数据库:优点、语法与快速入门指南
  • 数据结构——二叉树(2025.2.12)