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 发现过程介绍相关推荐

  1. ble系统知识介绍(较为完整,持续更新中)

    BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵 ...

  2. 电大计算机dm编写程序,渭南电大计算机应用基础网考答题过程介绍

    渭南电大计算机应用基础网考答题过程介绍 (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 渭南电大计算机应用基础网考答题过程介绍1.单 ...

  3. .NetCore框架Surging系列(三)HTTP本地路由发现过程

    .NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 .NetCore框架Sur ...

  4. 电大计算机网考怎么过,电大计算机应用基础网考答题过程介绍

    电大计算机应用基础网考答题过程介绍 (19页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 电大计算机应用基础网考答题过程介绍1.单选题答题 ...

  5. androidP wpa_supplicant启动参数以及过程介绍

    大致的启动参数如下: service wpa_supplicant /vendor/bin/hw/wpa_supplicant \     -O/data/vendor/wifi/wpa/socket ...

  6. 针对蓝牙4.0 BLE通讯过程的逆向和攻击

    本文讲的是针对蓝牙4.0 BLE通讯过程的逆向和攻击,从6个月前,我就开始针对BLE设备进行学习和研究,其中接触到了一些关于BLE逆向的博客和文章,但是相关内容都没有给出很好的方案.因此通过我的这篇文 ...

  7. python利器怎么编程-bluepy 一款python封装的BLE利器简单介绍

    1.bluepy 简介 bluepy 是github上一个很好的蓝牙开源项目,其地址在 LINK-1, 其主要功能是用python实现linux上BLE的接口. This is a project t ...

  8. csg显示寻找专用服务器失败,支持邻近发现过程的方法和装置

    1. 一种由网络节点执行来进行用于具有设备到设备D2D能力的无线发射/接收单元 WTRU的发现过程以促进与位于所述具有D2D能力的WTRU的邻近区域中的另一具有D2D能力 的WTRU通信的方法,所述方 ...

  9. C++调用Lua出现 unproteted error in call to Lua API错误的发现过程与解决方法

    用C++调用Lua时,无论怎么调,都发现程序在调用PCall的时候会触发这个错误 这里记录下自己的发现过程: 在pcall之前打印了下 lua_tonumber 取出来的内容,发现没有压进去,考虑文件 ...

最新文章

  1. 一口气用 Python 写了13个小游戏,摸鱼达人!
  2. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息
  3. 【新媒体】现阶段新闻聚合的玩法
  4. 微信小程序 body属性的问题
  5. [洛谷P4819][中山市选]杀人游戏
  6. java计算器问题反馈,Java开发网 - 求教计算器问题(急~~~)
  7. Ubuntu和Mac使用gdbserver远程调试android源码
  8. 企业微信 发送或接收 图片失败,怎么办?
  9. php 将rgb转cmyk,将CMYK颜色值和RGB颜色相互转换的PHP代码
  10. STM32L431 I2S/IIS slaver使用
  11. 学计算机用14寸电脑,14寸笔记本多大?
  12. 更高检测灵敏度的谷氨酰胺测定试剂盒
  13. 学习 Rust Futures - Future 和 Stream
  14. Spark SQL概述
  15. 提示找不到 XXX.dll 解决方法
  16. 考博英语-连接词What与although的用法
  17. Redis 分布式锁笔记
  18. 微信好友信息统计-图、词云和热图
  19. 把一个数据库中的数据导入到另一个数据库中的方法
  20. 如何使用计算机自带的刻录软件,windows自带刻录软件,联想自带的刻录软件

热门文章

  1. HDU - 1753 - 大明A+B
  2. 编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标
  3. 除了学习PHP,还应该学什么?
  4. Linux 的 Fedora 安装重新配置
  5. 财富时报:错过社交网站就错过未来
  6. 智能烧水壶(WIFI版)05——水温调节和灯光提示功能实现篇
  7. Java助农水果平台_助农-创业项目 | 投缘帮官方网站
  8. 【记一次ensp模拟器Telnet实验】
  9. android MD5校验码的生成与算法实现
  10. 沈师PTA数据结构2021编程复习题