文档章节

蓝牙协议栈代码分析

xiaocui911
 xiaocui911
发布于 2016/07/27 11:10
字数 675
阅读 289
收藏 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
2018/04/22
0
0
蓝牙协议栈

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

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

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

FreeBuf
2018/08/28
0
0
物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探

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

广岛秋泽
2015/12/04
0
0
Android源码分析(六)-----蓝牙Bluetooth源码目录分析

一 :Bluetooth 的设置应用 packagesappsSettingssrccomandroidsettingsbluetooth* 蓝牙设置应用及设置参数,蓝牙状态,蓝牙设备等。 BluetoothDevicePreference.java 顾名思义,蓝牙设备首选...

—莫言—
05/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
2
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
12
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
13
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部