文档章节

蓝牙协议栈代码分析

xiaocui911
 xiaocui911
发布于 2016/07/27 11:10
字数 675
阅读 131
收藏 0
点赞 0
评论 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
博文 15
码字总数 14765
作品 0
深圳
程序员
第四章 怎样开发低功耗蓝牙产品

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

weixin_38915701 ⋅ 04/22 ⋅ 0

蓝牙协议栈

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

xiaocui911 ⋅ 2016/07/25 ⋅ 0

物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探

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

广岛秋泽 ⋅ 2015/12/04 ⋅ 0

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

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

老枪 ⋅ 2009/04/30 ⋅ 0

Android 蓝牙开发(六)hfp连接

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71106622 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛 即可关注 ...

VNanyesheshou ⋅ 2017/05/05 ⋅ 0

AliOS Things蓝牙协议栈及应用开发框架介绍

摘要: AliOS Things从1.2.0版本开始支持蓝牙协议栈(BLE),及基于蓝牙协议栈的应用层开发框架。本文分为三部分对蓝牙组件进行介绍:蓝牙组件,蓝牙协议栈介绍及接口说明,和应用开发框架介绍...

阿里云云栖社区 ⋅ 01/11 ⋅ 0

Android 蓝牙开发(十)A2DP源码分析

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/71811288 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛 即可关注 ...

VNanyesheshou ⋅ 2017/05/18 ⋅ 0

Android: Android Bluetooth

Android Bluetooth 原文链接:http://blog.csdn.net/zmyde2010/article/details/6619915

长平狐 ⋅ 2012/06/20 ⋅ 0

[ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

1、Zigbee协议栈简介   协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通...

史迪奇2号 ⋅ 01/01 ⋅ 0

无线技术众多,蓝牙5如何抢占物联网蓝海市场风口

随着智慧城市、人工智能、大数据等时代的来临,无线通信将实现万物连接,未来全球物联网将是万亿级的连接数时代。目前已经出现的无线连接,大多通过蓝牙、Wi-Fi等短距离通信技术承载。 众所周...

昇润科技 ⋅ 02/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 26分钟前 ⋅ 5

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 31分钟前 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部