三、BLE(上)
1. BLE
1.1 模块构成与结构体层次关系

如上图所示,BLE模块有独立的application layer,这是因为该模块可以直接从BlueCore接收数据(通过GATT模块),application layer主要用来分发信号,处理一些需要用户接入的操作。
一般而言,每个模块都会定义两个回调函数,这些回调函数为了配合系统提供的message系列函数(messageSend/messageCancel等),都定义(封装)成Task形式。其中一个回调函数以API的形式公开提供,通常是工application layer直接调用,这里姑且称之为外部钩子函数;另外一个通常用来与其管理模块进行通信,通常一个模块在初始化时通过注册的方式,添加到其管理模块内部,这样管理模块通过这个注册的回调函数发送信号,从而进行数据传递(单向),这内钩子函数姑且称之为内部钩子函数。例如,GATT Service Server的lib_task就是内部钩子函数,当向GATT MGR模块添加注册GATT Service Server时,注册了该回调函数,当GATT MGR模块需要向GATT Service Server传递数据时,只需要找到已注册的回调函数,向其发送相应的信号即可。GATT Service Server模块的sinkGattManagerMsgHandler()就是外部钩子函数,通常在application Layer的sinkBleMsgHandler()中如果检测到信号范围处在GATT Manager模块预分配的信号范围内,则通过调用该API,将该信号直接分发出去。GATT Service Server的app_task指向application Layer的task,当该模块需要向“用户”传递消息时,只需要向该task发送对应信号即可。
BLE各个模块的信号传递关系可以通过下图看出。从图中可以看到,大部分模块的app_task都指向application layer的task,即这些模块如果需要向上层传递数据,则他们的上家都是application layer。application layer是一个大的消息集散地和分发地。一个例外是,GATT模块的app_task指向了GATT MGR模块,即GATT模块消息上报给GATT MGR模块。GATT模块的消息来源于:Blue Core和GATT MGR模块。
我们也不必花太多精力去了解每个task都在处理哪些信号,这些信号从哪个模块产生,去往哪个模块,只需要抓住重点transaction的流程,典型操作所涉及的模块交互流程即可。

最后来一张BLE模块的主要骨干结构体层次关系图。

三、BLE(上)的更多相关文章
- 三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader
发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"up ...
- invesments 第三章 上
1. How firms issue securities: 公司如何发行股票 A. primary market: 新的股票,债券和其他的证券第一次发行的market B. ...
- Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数
python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作: 一:使用内置open()函数操作文件,基本语法如下: with ...
- Java基础学习(三)—面向对象(上)
一.理解面向对象 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...
- 三 : spring-uploadify上传文件
一 : applicationContext.xml中:必须声明不然获取不到<!-- 上传文件的配置 --> <bean id="multipartResolver&quo ...
- upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件
上传前进行的配置选项: 1.在下方的Servers中,右键你的tomcat--open,选中下面两个配置. 第一个:Serve modules without publishing 作用:tomcat ...
- Android AOP之路三 Android上的注解
一.简单介绍 啥是注解.不懂的能够先看我上一篇文章. 在android 里面 注解主要用来干这么几件事: 和编译器一起给你一些提示警告信息. 配合一些ide 能够更加方便快捷 安全有效的编写java代 ...
- jQuery插件之路(三)——文件上传(支持拖拽上传)
好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下, ...
- Rust 入门 (三)_上
这部分我们学习 rust 语言的 变量.数据类型.函数.注释.流程控制 这五个方面的内容.本文我们介绍前两个内容,下一篇文章介绍后三个内容. 变量 默认情况下,rust 语言中声明的变量是不可变的,比 ...
- web自动化之selenium(三)文件上传
1.上传标签为input #若上传文件的标签为<input>可以直接定位标签,然后send_keys(文件路径)可以直接上传 2.利用第三方软件Autoit上传 1.下载Autoit:ht ...
随机推荐
- 细说.NET中的多线程 (二 线程池)
上一章我们了解到,由于线程的创建,销毁都是需要耗费大量资源和时间的,开发者应该非常节约的使用线程资源.最好的办法是使用线程池,线程池能够避免当前进行中大量的线程导致操作系统不停的进行线程切换,当线程数 ...
- node.js调试
用了几天node.js感觉很新奇,但是调试问题实在是愁煞人,开始的时候懒的学习调试方法,看看异常内容就可以了,但随着代码复杂程度的上升,并不是所有错误都是语法错误了,不调试搞不定了,只好搜搜资料,学习 ...
- JavaScript 常用功能总结
小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...
- Field 'id' doesn't have a default value
首先原因在于没有设置主键自增长. mysql的自增长模式是IDENTITY. jpa标签: @Id @GeneratedValue(strategy=GenerationType.IDENTITY) ...
- C#获取文本文件的编码,自动区分GB2312和UTF8
C# 获取文本文件的编码,自动区分GB2312和UTF8 以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// < ...
- linux命令 - alias
linux命令 - alias 为自己的常用命令语句指定别名,快捷方式 $ alias /? Usage: alias [/reload] [/d] [name=full command] /relo ...
- How Google TestsSoftware - Part Five
Instead of distinguishingbetween code, integration and system testing, Google uses the language ofsm ...
- 浏览器端获取局域网IP地址,本机的MAC,以及机器名
原文链接:http://www.orlion.ga/59/ 只针对IE且客户端的IE允许AcitiveX运行 code: <html> <head> <title> ...
- javascript类型系统——字符串String类型
× 目录 [1]定义 [2]引号 [3]反斜线[4]特点[5]转字符串 前面的话 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串S ...
- 一个在ASP.NET中利用服务器控件GridView实现数据增删改查的例子
备注:这是我辅导的一个项目开发组的一个例子,用文章的方式分享出来,给更多的朋友参考.其实我们这几年的项目中,都不怎么使用服务器控件的形式了,而是更多的采用MVC这种开发模式.但是,如果项目的历史背景是 ...