打印
[蓝牙芯片]

Win10系统用于BLE蓝牙开发的win32库介绍

[复制链接]
2201|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WCH@TECH39|  楼主 | 2020-1-15 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 WCH@TECH39 于 2020-1-16 16:16 编辑
前言
在Win10平台上开发BLE,微软提供了UWP的例程。考虑到为了方便在其他桌面应用程序中也可以开发BLE,因此我们封装了一个包含BLE操作的Win32开发库,配合安装的UWP后台应用,可实现在其他桌面应用程序,如MFC,Qt中进行BLE开发。
库安装包和例程下载链接:download.csdn.net/download/WCH_TechGroup/12073410
p.s.如遇积分不够或是使用时出现问题等情况,请联系tech@wch.cn

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,具体定义见下表:
返回值\功能
订阅
0
×
×
×
1
×
×
2
×
×
3
×
4
×
×
5
×
6
×
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


2.5 参考资料链接

1. CSDN上的BLE库介绍:blog.csdn.net/WCH_TechGroup/article/details/103778978

2. BLE库调用例程的使用说明:blog.csdn.net/WCH_TechGroup/article/details/103892909







使用特权

评论回复
评论
chenchuan2020 2020-5-15 14:58 回复TA
你好,我在使用demo的时候,提示:0x77383E28 处(位于 BLEHostDemo.exe 中)引发的异常: Microsoft C++ 异常: Platform::COMException ^,位于内存位置 0x00F5E628 处。 感觉是dll出现了问题?麻烦博主解答疑惑,谢谢。 
沙发
zhang..yb| | 2020-1-15 11:59 | 只看该作者
很不错的库

使用特权

评论回复
板凳
拙见成章| | 2020-1-15 16:28 | 只看该作者
有python例程否

使用特权

评论回复
地板
WCH@TECH39|  楼主 | 2020-1-16 13:05 | 只看该作者

暂时只有MFC调用库的例程

使用特权

评论回复
5
Kelan| | 2020-5-19 10:39 | 只看该作者
刚发现这么酷的资源!赞10个!
请问,这个库对应用的硬件是多数是笔记本自身带的蓝牙通讯功能)吧?!
如果是外置的USB 蓝牙dongle,可以支持吗? 或者说特定需要的蓝牙模块或设备是如何的?

谢谢!

使用特权

评论回复
6
春光一乍| | 2020-6-16 09:57 | 只看该作者
积分不够,能否发下库和例程到这个邮箱:750473175@qq.com

使用特权

评论回复
7
春光一乍| | 2020-6-17 17:04 | 只看该作者
谢谢,已收到例程和库了,我这边测试了下Peripheral例程,发现在读取特征5的值时提示“!读取失败”,但我检查了下位机程序发现特征2和特征5设置的权限不都是可读吗?(特征2能正常读),但CH579_List里介绍的Peripheral例程里特征5是安全可读吗?请问这是什么问题导致的读取失败?

使用特权

评论回复
8
春光一乍| | 2020-6-17 17:17 | 只看该作者
春光一乍 发表于 2020-6-17 17:04
谢谢,已收到例程和库了,我这边测试了下Peripheral例程,发现在读取特征5的值时提示“!读取失败”,但我检 ...

哦,是看漏了,确实特征5是安全可读,那安全可读的情况是怎么读取值的?

使用特权

评论回复
9
WCH@TECH39|  楼主 | 2020-8-21 16:41 | 只看该作者
不好意思,回复稍晚。最新库/例程大家可以发邮件到tech@wch.cn索取。

使用特权

评论回复
10
namedjmd| | 2020-11-11 16:11 | 只看该作者
刚好有用,先看看,谢谢楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

145

帖子

1

粉丝