Windows 蓝牙驱动开发-安装蓝牙设备
蓝牙配置文件驱动程序有两种安装类型:
- 客户端安装,在此类安装中,远程设备播发其服务,并且计算机与之连接。 示例包括:鼠标、键盘和打印机;
- 服务器端安装,在此类安装中,计算机播发服务,并且远程设备可以连接到计算机以使用这些服务;
例如,供应商可以创作服务器端安装,使移动设备能够打印到附加到计算机的打印机。这两种安装类型需要不同的安装过程。
安装客户端配置文件驱动程序
想要使用启用蓝牙的设备的用户将设备置于计算机范围内,并使用客户端配置文件驱动程序的以下安装序列启动从计算机到远程设备的连接。
- 在“控制面板”中选择“添加蓝牙设备”以查找计算机范围内的所有设备;
- 选择要与之配对的设备;
- 将设备与本地无线电配对,这可能涉及也可能不涉及 PIN 交换;
- 本地无线电会发出 SDP 查询,以识别远程设备上支持的服务;
- “找到新硬件向导”将搜索本地硬盘驱动器和 Windows Update 上的相应驱动程序;
- 如果“找到新硬件向导”找不到适用于设备的驱动程序,它会提示用户插入配置文件驱动程序安装介质,其中包含配置文件驱动程序的设备安装信息文件(INF 文件);
安装服务器端配置文件驱动程序
蓝牙驱动程序堆栈支持蓝牙 SIG 定义的服务 GUID,以及蓝牙 SIG 未定义的自定义 GUID。
随 Microsoft Windows SDK 一起提供的 guidgen.exe 工具可用于创建自定义 GUID。
必须编写用户模式安装应用程序,以公开远程蓝牙设备可以使用的计算机功能。
安装应用程序必须与蓝牙驱动程序堆栈通信,才能为要公开的功能创建服务 GUID。 供应商在应用程序及其设备安装 INF 文件中指定服务 GUID。
安装应用程序必须调用用户模式 API BluetoothSetLocalServiceInfo。 在应用程序可以调用此 API 之前,应用程序必须具有 SE_LOAD_DRIVER_NAME 安全特权。 下面的代码示例演示如何获取此特权。 请注意,该示例不演示错误处理。
HANDLE procToken;
LUID luid;
TOKEN_PRIVILEGES tp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &procToken);
LookupPrivilegeValue(NULL, SE_LOAD_DRIVER_NAME, &luid);
Tp.PrivilegeCount = 1;
Tp.privileges[0].Luid = luid;
Tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(procToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD)NULL)
配置文件驱动程序 INF 文件
配置文件驱动程序的 INF 文件包含有关客户端安装蓝牙设备的信息。 对于服务器端安装,INF 文件会指定与安装应用程序创建的服务 GUID 对应的设备 ID。 所有蓝牙设备都是蓝牙类的成员。 蓝牙类安装程序 (Bthci.dll) 可协助安装配置文件驱动程序。
即插即用 ID
蓝牙驱动程序堆栈会根据以下模板生成硬件 ID:
- BTHENUM\{ ServiceGUID}_VID& nnnnnnnn
- BTHENUM\{ ServiceGUID}_VID& nnnnnnnn_PID& nnnn
- BTHENUM\{ ServiceGUID}_LOCALMFG& nnnn
蓝牙驱动程序堆栈会根据以下模板生成兼容的 ID:
- BTHENUM\{ ServiceGUID}
ServiceGUID 是扩展为 128 位 GUID 的 16 位 GUID,由蓝牙规范定义。 例如,{00001124-0000-1000-8000-00805F9B34FB} 对应于 HID 设备。
- VID& 后面的八位数字对应于供应商 ID 代码;
- PID& 后面的四位数字对应于产品 ID 代码;
- LOCALMFG& 后面的四位数字对应于本地蓝牙无线电制造商;
- VID/PID 和 LOCALMFG 标记彼此独立;
最通用的设备 ID 本身是 ServiceGUID。 例如:
BTHENUM\{00001124-0000-1000-8000-00805F9B34FB}
通过在远程设备和 INF 文件中使用即插即用 ID,可以将蓝牙驱动程序堆栈限制为加载配置文件驱动程序和软件,以便仅在特定版本的远程设备上运行。 仅当设备发布堆栈可以使用 SDP 检测到的即插即用 ID 时,蓝牙驱动程序堆栈才会生成 VID/PID 对。 例如:
BTHENUM\{00001124-0000-1000-8000-00805F9B34FB}_VID& nnnnnnnn_PID& nnnn
可以通过在 INF 文件中的设备 ID 中指定 LOCALMFG 标记,将蓝牙驱动程序堆栈限制为加载配置文件驱动程序和软件,以便仅在特定的本地蓝牙无线电上运行。 例如:
BTHENUM\{00001124-0000-1000-8000-00805F9B34FB}_LOCALMFG& nnnn