文档章节

蓝牙协议栈代码分析

xiaocui911
 xiaocui911
发布于 2016/07/27 11:10
字数 675
阅读 153
收藏 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
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探

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

广岛秋泽
2015/12/04
0
0
IVT 发布世界上首个支持 Moblin 和 Android 的蓝牙最新标准 V3.0 协议栈

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

老枪
2009/04/30
460
0

没有更多内容

加载失败,请刷新页面

加载更多

Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
27分钟前
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
27分钟前
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
31分钟前
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0
开发5分钟,调试2小时 - 该如何debug?

几年来我在答疑群、论坛、公众号、知乎回答的各种问题,没有一万也有八千。其中有三分之二以上都是在帮人看报错,帮人 debug(调试代码)。 可以说,会不会 debug,有没有 debug 的意识,懂不...

crossin
昨天
4
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部