主要来自:http://blog.csdn.net/qutiezhu/article/details/52318073
主要是讲主从连接后主机如何在从机上找到自己需要的服务的过程,需要和主从通信过程分析教程一起看:
服务查找过程就是主从连接后,主机需要在从机上查找所有的服务以及服务下面的特征值和描述等信息,不过SDK中的主从通信例子因为是个
简单的主从点灯demo,所以服务查找过程中并不是找从句上所有服务,而是根据初始化时注册的要查找的服务来定向找从机的服务,以及下面的特征
和描述符信息。
在ble_db_discovery_start函数中,会提取main函数中调用的db_discovery_init 注册的要找的服务的uuid,来执行服务查找
提取之前注册的服务,执行服务查找,
当服务查找完后,协议栈传递BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP事件给派发函数,派发函数在递交给事件处理函数,在该事件处理函数中调用
ble_db_discovery_on_ble_evt函数,该函数就是处理服务发现过程中的相关事件,收到服务发现完成事件后,在进一步到on_rpimary_srv_discovery_rsp函数
中处理,而该函数内部的处理就是开始启动服务中特性的查找
每个特性查找万都会返回BLE_GATTC_EVT_CHAR_DISC_RSP事件,于是再进入on_characteritic_discovery_rsp函数处理
其主要功能就是更新已经查找到的特性总数的值,并且判断是否还有可能的特性需要发现,如果有,那么继续执行上面说额特性发现,如果
没有,就开始执行描述符发现过程:
综上,当特性发现后就开始调用descriptor_discover来执行描述符发现过程,该函数的主要就是判断描述符需要发现,如果有的话设置发现需要句柄范围,
描述符发现完成后就会收到BLE_GATTC_EVT_DESC_DISC_RSP,并由相应的函数处理,
该函数中首先会判断发现的描述符是不是CCCD,如果是就记录其下的句柄,然后当发现的描述符是第几个特性下,如果还没达到之前发现的特性总数,
就继续执行查找描述符来查找下一个特性描述符
当所有的买是否发出完成后就会调用下面两个函数
discovery_complete_evt_trigger函数会产生服务发现完成事件给之前main中初始化函数里main注册db_discovery_init的要找的服务找到后会执行回到函数,并将当所 所有注册的要找的都找完后就调用那些回到函数,
而on_srv_disc_completion函数负责判断是否找之前调用db_discovery_init注册所有的服务,如果没有就继续寻找下一个需找的服务,
这两个函数不是一定会在描述符发现完成后才会调用,而可能特性发现完后就直接调用,因为可能没有描述符需要发现