文档章节

蓝牙协议栈代码分析

xiaocui911
 xiaocui911
发布于 2016/07/27 11:10
字数 675
阅读 178
收藏 0

那么现在回到程序上去吧,这个比较适合已经看过一些蓝牙SDK代码。

1,首先协议栈是如何运作的?

协议栈是基于100%的事件驱动,也就是说协议栈向app发送任何数据都是基于事件的。

当设备收到数据,协议栈得到数据处理后,然后将数据打包成一个结构体,并附上事件id,比如BLE_GAP_EVT_CONNECTED,BLE_GATT_EVT_WRITE来分别告诉上层app这个事件结构体代表的事件。

比如BLE_GAP_EVT_CONNECTED代表链接事件,那么这个事件结构体中包含的数据就是连接参数等数据。而BLE_GATT_EVT_WRITE代表写事件,那么结构体中数据就是对端设备写给板子的数据。

根据上图可以明显看出ble_evt_dispatch()函数就是事件派发函数,举个例子:

static void ble_evt_dispatch(ble_evt_t *p_ble_evt)

{

    ble_conn_params_on_evt(p_ble_evt);

    ble_nus_ble_evt(&m_nus,p_ble_evt);

    on_ble_evt(p_ble_evt);

}

连接参数管理处理函数ble_conn_params_on_evt(p_ble_evt);

UART服务时间处理函数ble_nus_ble_evt(&m_nus,p_ble_evt);

通用事件处理函数 on_ble_evt(p_ble_evt);

不同的事件在事件结构体ble_evt_t中通过id来区别。

然后创建一个服务应该添加到哪里?

在main()函数中有一个services_init();这个函数的内部就是添加服务,特征值等代码。

该函数内部其实就是注册了一个回调函数nus_data_handler(该函数会在手机发数据给板子时将数据从电脑串口打印出来)然后再执行真正的初始化函数ble_nus_init。该函数内部又会调用sd_ble_gatts_service_add这个协议栈的api接口来添加服务。后面也会调用 sd_ble_gatts_characteristic_add这个协议栈的api接口来添加特征值。如图所示:

 

最后手机发送的数据在哪里,如何发送数据给手机?

手机发送给设备的数据是在哪个函数里出来的? 没有函数,协议栈会抛上来一个事件结构体,收到的数据在结构体里。蓝牙数据接收在底层,接收完后会返回事件给上层的ble_evt_dispatch分发函数,他将事件分发给各个服务或者事件处理函数。服务或处理函数会捕获是否存在写事件case BLE_GATTS_EVT_WRITE:存在就做相应处理。BLE的发送数据给手机是有API接口的,即sd_ble_gatts_hvx(),可以通过参数来设置是以通知方式发送还是指示方式发送(通知不需要回复确认,指示需要)。但是手机发过来的数据没有接受函数,因为他是基于事件驱动的。

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 蓝牙代码分析二
下一篇: 蓝牙协议栈
xiaocui911
粉丝 6
博文 69
码字总数 14765
作品 0
深圳
程序员
私信 提问
第四章 怎样开发低功耗蓝牙产品

1.1,准备 Nordic Semiconductors的开发工具包nRF51-DK nRFgo Studio综合开发环境 nRF51 SDK(软件开发套件)软件开发包(含芯片开发的参考代码以及文档) 用于模拟低功耗蓝牙主机的USB加密狗...

weixin_38915701
04/22
0
0
蓝牙协议栈

蓝牙协议框架体系基本上就是这个图了,有点乱。 然后,我们先从底层开始分析,主要是由基带层和链路管理层组成。 无线连接(RF)通过2.4GHZ无需申请的ISM频段,实现数据的过滤与传输。 基带层...

xiaocui911
2016/07/25
58
0
三个Android蓝牙组件漏洞详情

  写在前面的话   2018年3月,Quarkslab向Google报告了Android蓝牙协议栈中的一些漏洞:      问题编号74882215:蓝牙L2CAP L2CAPCMDCONN_REQ远程内存泄露   问题编号74889513:蓝...

FreeBuf
08/28
0
0
IVT 发布世界上首个支持 Moblin 和 Android 的蓝牙最新标准 V3.0 协议栈

北京2009年4月29日电 /美通社亚洲/ -- 全球主要的蓝牙软件供应商 IVT 宣布,该公司已发布了世界上第一个支持英特尔 Moblin 和谷歌 Android 平台的蓝牙最新标准 V3.0+HS 的协议栈。多年来,I...

老枪
2009/04/30
494
0
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探

0x00 目录 0x00 目录 0x01 前言 0x02 BLE概述    BLE 协议栈总览    GAP-通用访问规范    GATT-通用属性协议 0x03 BLE嗅探 0x04 伪造BLE通信 0x05 分析BLE私有数据协议(灯泡、跳...

广岛秋泽
2015/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
3
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部