BLE 发现过程介绍
BLE 发现过程介绍
2019-10-15 by isyq
BLE 主从设备建立连接以后,先执行发现服务和特征的过程(Discovery Procedure),然后对着指定特征执行数据收发。
本文以一个Nordic LED Button服务为例(如下),介绍服务和特征发现过程的协议细节。
1. 发现服务
对于主机而言,首先找到目标服务的句柄范围,然后再在句柄范围内找下面的特征。
发现服务有两个方案:
- 发现全部服务
- 发现指定UUID的服务
1.1 发现全部服务
发现一个服务的基本思路是搜索Primary Service的UUID(0x2800),如果找到,即可获得它的句柄范围。
第一次我们从0x0001开始搜索,找到一个服务后,从该服务的句柄末尾开始继续搜索,可以找到第二个服务的句柄范围。
反复执行发现服务操作,就可以依次找到全部服务的句柄范围。
执行发现服务时,GATT协议层主机会产生一个请求(Read By Group Type Request),从机收到后返回一个响应(Read By Group Type Response)。
(为了说明一些问题,这个图片不对应上面的Nordic LED Button服务)
图中,请求包中包含了起始和末尾的句柄,第一次发现默认是0x0001~0xFFFF。
响应帧中包含了两个服务的UUID,代表它发现的两个服务。(为啥一次性发现两个?原因未知,它仅限于Generic Access和Generic Attribute)。
第二次的响应帧就比较正常,返回了发现的一个服务UUID。如果检查该数据帧的细节,能够看到该服务的起始和结束UUID。
SDK 15.3中执行发现全部服务的函数是: sd_ble_gattc_primary_services_discover(uuid),注意要将uuid参数设置为NULL。 在该函数的回调事件中即可获得发现的服务的UUID和句柄范围。
1.2 发现指定UUID服务
发现指定UUID的服务,顾名思义,除了查找0x2800,还查找指定的UUID。
通过它可以快速找到目标服务,对于不关心的服务项可以快速略过,加快整体发现过程的速度。
当执行发现指定UUID服务时,主机发出一个请求(Find By Type Value Request),从机返回一个响应(Find By Type Value Response)。
观察请求包,它包含了一个UUID的输入参数。响应包中,返回数据中的11就是该服务的句柄。
SDK 15.3中执行发现全部服务的函数是: sd_ble_gattc_primary_services_discover(uuid),注意要将uuid参数设置为目标UUID。 在该函数的回调事件中即可获得发现的服务的UUID和句柄范围。
值得一提的是, 如果你做一个nRF Connect APP这种通用性主机,肯定要使用发现全部服务。对于一个特定的主机,比如针对这个Blinky从机做的主机,我们知道Blinky服务的UUID,则更适合选择第二种方案。
2. 发现特征
发现特征一定是发现某个指定服务下面的特征,所以一定要先发现服务,再发现特征。
现在我们有了一个服务的句柄范围,比如0x000B ~ 0x0010。
与发现服务类似,发现特征也有两个方案:
- 发现全部特征
- 发现指定UUID的特征
发现特征时,主机在服务的句柄范围内搜索特征声明的UUID(0x2803),一旦找到就返回响应,响应中包含了特征的关键信息,比如:特征的句柄范围,特征值的UUID,特征的属性、权限等。
根据特征的句柄范围,我们能够判断服务下面的特征是否都被发现,如果没有,则需要重复执行发现特征,直到所有的特征都被发现。
发现特征时,主机发出一个请求(Read By Type Request ),从机返回一个响应(Read By Type Response)。
图中,从响应包中可以看到该特征的属性(read, Notify),句柄(13)和UUID。
在SDK 15.3中,可以利用sd_ble_gattc_characteristics_discover()来执行发现全部特征的操作。
但是很遗憾,没有一个API能够发现指定UUID的特征,只能一个一个的发现。
3. 发现描述符
如果特征具有Notify或Indicate属性,它一定携带一个CCCD描述符。
我们在发现特征的时候检测其属性,如果属性包含Notify或Indicate,则执行发现描述符的过程。
发现描述符相对简单,搜索描述符的UUID(0x2902或其他),并在响应包中给出其句柄和UUID信息。
发现描述符时,主机发出一个请求(Find Information Request),从机返回一个响应(Find Information Response)。
通过这几个步骤,就可以完整的发现目标服务和特征。
如果服务下面有多个特征,一个一个的发现会非常繁琐,代码上需要进行大量的判断,代码逻辑必然不简单,所以SDK 提供了一个库来完成这些繁冗的操作,它就是ble_db_discovery库。
如果理解了上面这套发现过程,使用ble_db_discovery必然能驾轻就熟,反过来则很可能搞不懂它的设计思路并在使用中产生疑惑,这也是本文产生的原因。
(完)
BLE 发现过程介绍相关推荐
- ble系统知识介绍(较为完整,持续更新中)
BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵 ...
- 电大计算机dm编写程序,渭南电大计算机应用基础网考答题过程介绍
渭南电大计算机应用基础网考答题过程介绍 (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 渭南电大计算机应用基础网考答题过程介绍1.单 ...
- .NetCore框架Surging系列(三)HTTP本地路由发现过程
.NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 .NetCore框架Sur ...
- 电大计算机网考怎么过,电大计算机应用基础网考答题过程介绍
电大计算机应用基础网考答题过程介绍 (19页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 电大计算机应用基础网考答题过程介绍1.单选题答题 ...
- androidP wpa_supplicant启动参数以及过程介绍
大致的启动参数如下: service wpa_supplicant /vendor/bin/hw/wpa_supplicant \ -O/data/vendor/wifi/wpa/socket ...
- 针对蓝牙4.0 BLE通讯过程的逆向和攻击
本文讲的是针对蓝牙4.0 BLE通讯过程的逆向和攻击,从6个月前,我就开始针对BLE设备进行学习和研究,其中接触到了一些关于BLE逆向的博客和文章,但是相关内容都没有给出很好的方案.因此通过我的这篇文 ...
- python利器怎么编程-bluepy 一款python封装的BLE利器简单介绍
1.bluepy 简介 bluepy 是github上一个很好的蓝牙开源项目,其地址在 LINK-1, 其主要功能是用python实现linux上BLE的接口. This is a project t ...
- csg显示寻找专用服务器失败,支持邻近发现过程的方法和装置
1. 一种由网络节点执行来进行用于具有设备到设备D2D能力的无线发射/接收单元 WTRU的发现过程以促进与位于所述具有D2D能力的WTRU的邻近区域中的另一具有D2D能力 的WTRU通信的方法,所述方 ...
- C++调用Lua出现 unproteted error in call to Lua API错误的发现过程与解决方法
用C++调用Lua时,无论怎么调,都发现程序在调用PCall的时候会触发这个错误 这里记录下自己的发现过程: 在pcall之前打印了下 lua_tonumber 取出来的内容,发现没有压进去,考虑文件 ...
最新文章
- 一口气用 Python 写了13个小游戏,摸鱼达人!
- R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息
- 【新媒体】现阶段新闻聚合的玩法
- 微信小程序 body属性的问题
- [洛谷P4819][中山市选]杀人游戏
- java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
- Ubuntu和Mac使用gdbserver远程调试android源码
- 企业微信 发送或接收 图片失败,怎么办?
- php 将rgb转cmyk,将CMYK颜色值和RGB颜色相互转换的PHP代码
- STM32L431 I2S/IIS slaver使用
- 学计算机用14寸电脑,14寸笔记本多大?
- 更高检测灵敏度的谷氨酰胺测定试剂盒
- 学习 Rust Futures - Future 和 Stream
- Spark SQL概述
- 提示找不到 XXX.dll 解决方法
- 考博英语-连接词What与although的用法
- Redis 分布式锁笔记
- 微信好友信息统计-图、词云和热图
- 把一个数据库中的数据导入到另一个数据库中的方法
- 如何使用计算机自带的刻录软件,windows自带刻录软件,联想自带的刻录软件
热门文章
- HDU - 1753 - 大明A+B
- 编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标
- 除了学习PHP,还应该学什么?
- Linux 的 Fedora 安装重新配置
- 财富时报:错过社交网站就错过未来
- 智能烧水壶(WIFI版)05——水温调节和灯光提示功能实现篇
- Java助农水果平台_助农-创业项目 | 投缘帮官方网站
- 【记一次ensp模拟器Telnet实验】
- android MD5校验码的生成与算法实现
- 沈师PTA数据结构2021编程复习题