Chinaunix首页 | 论坛 | 博客

fx

  • 博客访问: 1372310
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3964
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-02 14:36
文章分类
文章存档

2022年(2)

2019年(2)

2018年(10)

2017年(1)

2016年(50)

2015年(12)

2014年(9)

2013年(29)

分类: 嵌入式

2016-07-26 20:33:59

本讲主要针对 主从连接后主机如何在从机上找到自己需要的服务的过程。需要和 主从通信过程分析教程一起看。

 

服务查找过程就是主从连接后,主机需要在从机上查找所有的服务以及服务下面的特征值和描述符等信息。 不过Sdk中的主从通信例子因为是个 简单的主从点灯demo,所以服务查找过程中并不是搜寻从机上的所有服务,而是根据初始化时注册的要查找的服务来定向搜寻从机上的服务,已经其下面的特征值和描述符信息。

 

服务发现过程的细节比较多,文字描述不方面将所有考虑的细节都说到,所以这里描述的是 服务发现的主要过程。

 

在主机代码中,当连接到从机后,协议栈会将BLE_GAP_EVT_CONNECTED事件传递给上层派发函数ble_evt_dispatch

该函数会将事件传递给所有事件处理函数,设备管理模块的事件处理函数dm_ble_evt_handler对连接事件进行了处理



dm_ble_evt_handler处理连接事件时会生成一个 设备管理模块的内部事件DM_EVT_CONNECTION,然后再将其传递给 设备管理模块 初始化时注册的回调函数。如下图


所以最终由device_manager_event_handler函数来处理DM_EVT_CONNECTION这个事件。

 

而该函数在处理DM_EVT_CONNECTION事件时会调用client_handling_create函数,该函数内部就会启动服务发现过程


ble_db_discovery_start函数中,会提取 main函数中调用client_handling_init注册的要找的服务的uuid。来执行服务查找

如下图所示:


当服务查找完成后 协议栈传递BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP事件给派发函数,派发函数再递交给事件处理函数,在事件处理函数client_handling_ble_evt_handler 的最后调用了ble_db_discovery_on_ble_evt函数,该函数就是处理服务发现过程中的相关事件。


在收到服务发现完成事件后,再进一步到on_primary_srv_discovery_rsp函数中处理

   

而该函数内部的处理就是开始启动 服务中特性的查找。如下图

    


每个特性查找完成后都会返回BLE_GATTC_EVT_CHAR_DISC_RSP事件,于是再进入

on_characteristic_discovery_rsp函数处理


该处理函数比较长不便于整体截图,这里部分截图其主要功能部分,其主要功能就是更新已经查找到的特性的总数量的值,并且判断是否还有可能的特性需要发现,如果可能还有(目前查找到的特性的特征值的handle小于服务的end handle),那么就继续执行上面说的特性发现发现,如果没有了,就开始执行描述符发现过程。







综上,当特性发现完成后就开始调用descriptors_discover来执行描述符发现过程了。

该函数的主要功能就是 判断是否有描述符需要发现,如果有的话设置发现寻找过程中要寻找的句柄范围,部分截图如下


然后根据是否需要查找描述符标志来执行发现描述符函数


描述符发现完成后会收到事件BLE_GATTC_EVT_DESC_DISC_RSP,并由相应事件处理函数处理


该处理函数中首先会判断发现的描述符是不是CCCD,如果是就记录下其句柄。然后判断当发现的是描述符是第几个特性下的,如果还没达到之前发现的特性总数,就继续执行查找描述符来查找下一个特性的描述符的



当所有描述符发现完成后就会调用下面两个函数


 discovery_complete_evt_trigger函数会产生服务发现完成事件给之前 main中初始化client_handling_init函数里面注册的要找的服务找到后会执行的回调函数,并且当所有注册的要找的服务都找完后就调用那些回调函数。

on_srv_disc_completion函数负责判断是否查找玩了之前调用client_handling_init中注册的所有要找的服务,如果没有就继续寻找下一个需要找的服务。

PS:这两个函数不是一定会在描述符发现完成后才被调用,也可能特性发现完后就直接调用。因为可能并没有描述符需要发现

阅读(5068) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

lkyailx2016-11-23 16:30:21

虽然博主写的很详细 但是我还是听的云里雾里的