本帖最后由 WCH@TECH39 于 2020-1-15 11:22 编辑
前言
在Win10平台上开发BLE,微软提供了UWP的例程。考虑到为了方便在其他桌面应用程序中也可以开发BLE,因此我们封装了一个包含BLE操作的Win32开发库,配合安装的UWP后台应用,可实现在其他桌面应用程序,如MFC,Qt中进行BLE开发。库安装包链接:download.csdn.net/download/WCH_TechGroup/12073410
1 WCH_BLE_DLL概述
WCH_BLE_DLL是一款用于在Win10系统下进行BLE开发的开发库,可实现BLE设备扫描,连接,特征值的读写等功能。调用该库前,需要安装配套的WCH_DLL_BackgroundTask后台应用。
2 开发流程和库函数详解
2.1 开发前准备
打开安装包中的WCH_DLL_BackgroundTask文件夹,双击其中的Run.bat脚本,待安装完成后,即可通过调用WCH_BLE_DLL.dll进行BLE相关开发。
2.2 库函数介绍
2.2.1 建立后台应用通讯连接
void WINAPI WCHBLEConnectToService(Notify_AppService fun, Notify_ErrorStatus errorFun, Notify_ReadBytes readFun);
该函数通过异步方式实现桌面应用程序与后台任务之间的连接,连接结果通过Notify_AppService和Notify_ErrorStatus两回调函数返回。
2.2.2 断开后台应用通讯连接
void WINAPI WCHBLECloseConnection();
该函数作用,断开后台通讯。
2.2.3 扫描附近所有BLE设备
void WINAPI WCHBLEStartScanBLEDevices(Notify_DeviceWatcher fun);
该函数调用后,会扫描附近所有BLE设备并通过Notify_DeviceWatcher返回扫描到的设备名称和mac地址。
2.2.4 停止扫描BLE设备
void WINAPI WCHBLEStopScanBLEDevices(Notify_DeviceWatcher fun);
该函数作用是停止扫描附近所有BLE设备并释放资源。
2.2.5 传递BLE设备信息
void WINAPI WCHBLESendBLEDeviceID(PCHAR deviceID, Notify_AppService fun, Notify_ErrorStatus errorFun);
该函数将扫描到的指定BLE设备信息通过参数deviceID传递给后台。
2.2.6 连接BLE设备
void WINAPI WCHBLECreateConnection(Notify_AppService fun, Notify_ErrorStatus errorFun);
连接指定mac地址的BLE设备,通过回调函数查看连接结果以及可能出现的异常信息。
2.2.7 断开BLE设备
void WINAPI WCHBLEReleaseResource(Notify_AppService fun, Notify_ErrorStatus errorFun);
断开已连接的BLE设备,并释放资源。
2.2.8 获取BLE设备的服务列表
void WINAPI WCHBLEGetServicesEnum(Notify_AppService fun, Notify_ErrorStatus errorFun);
获取BLE设备的所有服务,通过回调函数返回服务的字符串信息。
2.2.9 获取指定服务的特征列表
void WINAPI WCHBLEGetCharacteristicEnum(INT nService, Notify_AppService fun, Notify_ErrorStatus errorFun);
nService参数为选定服务的索引值,调用该函数后,可通过回调函数返回该服务的特征字符串信息。
2.2.10 枚举指定特征所支持的功能
void WINAPI WCHBLEGetCharacteristicAction(INT nCharacteristic, Notify_AppService fun, Notify_ErrorStatus errorFun);
nCharacteristic参数为选定特征的索引值,调用该函数后,可通过回调函数返回该特征支持的功能,表示功能的为一个int型变量,范围0-7,具体定义见下表:
2.2.11 读取特征值
void WINAPI WCHBLEGetReadBuffer(Notify_ReadBytes fun, Notify_ErrorStatus errorFun);
特征支持读取功能时,可调用该函数,异步读取特征值,结果通过回调函数参数返回读取的16进制和字节长度。
2.2.12 写入特征值
void WINAPI WCHBLEWriteBuffer(PCHAR bufferStr, Notify_AppService fun, Notify_ErrorStatus errorFun);
特征支持写入功能时,可调用该函数,异步写入特征值,bufferStr参数为待写入的十六进制字符串。
2.2.13 开启Notify
void WINAPI WCHBLEStartMonitoring(Notify_AppService fun, Notify_ErrorStatus errorFun);
开启Notify通知,当特征值每次改变时可收到通知,通过回调函数可读取特征值。
2.2.13 关闭Notify
void WINAPI WCHBLEStopMonitoring(Notify_AppService fun, Notify_ErrorStatus errorFun);
关闭Notify通知。
2.3 回调函数详解
2.3.1 Notify_AppService//
// 摘要:
// 回调,通知应用上层BLE操作已成功和相关信息
//
// 参数:
// uAction_Service:
// BLE操作的序号:
// 0:建立通讯
// 1:建立蓝牙设备连接
// 2:获取服务
// 3:获取特征
// 4:查看特征支持的操作
// 5:无
// 6:写操作
// 7:打开订阅
// 8:关闭订阅
// 9:释放资源
// 10:传输设备ID值
// 11:无
// 12:关闭后台通讯
// tmpStr:
// 具体操作完成时的返回值
// iExtraInfo:
// 1.指定特征值所具有的操作序号(Read, Write, Subscribe):0-7。仅用在枚举特征值功能时
//
// 返回结果:
// 无。
typedef void (CALLBACK* Notify_AppService)(ULONG uAction_Service, PCHAR tmpStr, INT iExtraInfo);
2.3.2 Notify_DeviceWatcher
//
// 摘要:
// 回调,通知应用上层DeviceWatcher的操作结果
//
// 参数:
// deviceName:
// 枚举到的设备名称。
// deviceID:
// 枚举到的设备ID。
//
// 返回结果:
// 无。
typedef void (CALLBACK* Notify_DeviceWatcher)(PCHAR deviceName, PCHAR deviceID);
2.3.3 Notify_ErrorStatus
//
// 摘要:
// 回调,通知应用上层AppService出现异常的值
// 包括了:BLE操作的异常;桌面应用和后台任务通讯间的异常
//
// 参数:
// errorString:
// 异常的属性。
//
// 返回结果:
// 无。
typedef void (CALLBACK* Notify_ErrorStatus)(PCHAR errorString);
2.3.4 Notify_ReadBytes
//
// 摘要:
// 回调,返回读取的字节
//
// 参数:
// readBytes:
// 读取的字节。
// iLength:
// 字节数。
//
// 返回结果:
// 无。
typedef void (CALLBACK* Notify_ReadBytes)(PUCHAR readBytes, INT iLength);
2.4 接口调用顺序介绍
1.服务通讯 WCHBLEConnectToService
2.扫描设备 WCHBLEStartScanBLEDevices
3.结束扫描 WCHBLEStopScanBLEDevices
4.选择BLE设备 WCHBLESendBLEDeviceID
5.连接BLE设备 WCHBLECreateConnection
6.获取服务列表 WCHBLEGetServicesEnum
7.获取特征列表 WCHBLEGetCharacteristicEnum
8.获取特征支持的功能列表 WCHBLEGetCharacteristicAction
9.读取特征值 WCHBLEGetReadBuffer
10.写入特征值 WCHBLEWriteBuffer
11.开启ValueChanged事件订阅 WCHBLEStartMonitoring
12.关闭ValueChanged事件订阅 WCHBLEStopMonitoring
13.断开BLE设备连接 WCHBLEReleaseResource
14.断开服务连接 WCHBLECloseConnection
|