三、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模块的主要骨干结构体层次关系图。

时间: 2024-10-21 12:27:27

三、BLE(上)的相关文章

技巧三 Chart上曲线的点鼠标放上去显示横纵坐标

技巧三: 在chart的上曲线上的点 鼠标放上去,显示此点的横纵坐标代码如下:procedure TForm1.pntsrsSeries1MouseEnter(Sender: TObject);vari:integer;x1,y1:string;begin pntsrsSeries1.Cursor:=crHandPoint; cht1.showHint:=true; i:=cht1.Series[1].GetCursorValueIndex; x1:=FormatFloat('0.000',ch

jQuery插件之路(三)——文件上传(支持拖拽上传)

好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下,上传文件的时候需要利用的一些必要的知识. 首先我们要说的就是FileReader对象,这是一个HTML5提出的,专门用来异步的读取用户计算机上文件的对象,这里有详细的介绍.所以如果我们想要使用它,那么首先我们得先创建一个FileReader对象. var fr = new FileReader()

三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader

发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"upload",其它的不做任何处理: <form method="POST" action="upload" enctype="multipart/form-data"> 名字 <input type="text&q

Android AOP之路三 Android上的注解

一.简介 啥是注解,不懂的可以先看我上一篇文章. 在android 里面 注解主要用来干这么几件事: 和编译器一起给你一些提示警告信息. 配合一些ide 可以更加方便快捷 安全有效的编写java代码.谷歌出的support-annotations这个库 就是主要干这个的. 和反射一起 提供一些类似于spring 可配置的功能,方便简洁. 二.Support Annotations栗子 这里使用官方的一个库,说明在开发中的简单一个应用. 2.1 导包 在新建项目的时候会自动导的,可以看build.

Android网络开源库-Retrofit(三) 批量上传及上传进度监听

由于gif图太大的原因,我将图放在了github,如果博客中显示不出来图,传送门 由于我是事先写在md上的,导致代码的可读性差,大家将就着看吧. 1. 前言 在上一篇博客中,我们介绍了Retrofit的文件上传,文件下载以及进度监听,这篇博客我们来了解下批量上传以及上传进度的监听. 2.批量上传 要想实现批量上传,我们要考虑下HTML中实现批量上传的方法,借助Form表单,所以,我们也可以通过借助Form表单来实现批量上传. 2.1 HTML FORM 表单的写法 <html> <bod

Java基础之路(三)上----流程控制语句

今天我们来聊一聊java中的流程控制. 我们首先来聊聊选择语句. 选择语句分两种:1.if语句.2.switch语句: if语句分三种:if.if else.if elseif else. Java中的条件语句与C/C++中一致,并没有太大的区别. 简单if语句例代码: /* *if条件语句"示例代码 *功能:输入三个数,输出最大值 */ import java.util.Scanner; public class Program { public static void main(String

Eclipse搭建springboot项目(三)文件上传

知识点:SpringBoot2.x文件上传:HTML页面文件上传和后端处理 1.springboot文件上传 MultipartFile file,源自SpringMVC 1)静态页面直接访问:localhost:8080/index.html 注意点:如果想要直接访问html页面,则需要把html放在springboot默认加载的文件夹下面 2)MultipartFile 对象的transferTo方法,用于文件保存(效率和操作比原先用FileOutStream方便和高效) 访问路径 http

大数据开发:(三)flume上传HDFS

开启hadoop:start-dfs.sh 通过浏览器访问node节点,http://IP:50070 检查 (如果无法访问,将防火墙关闭) 如果jps查看缺少了某个节点,首先查看xml文件是否正确,如果正确,删除hadoop/tmp文件夹,然后再次格式化,(格式化会重新创建hadoop/tmp),再次启动 操作分布式文件存储系统HDFS 查看hdfs中的文件内容 hadoop fs -ls / 查看hdfs中的详细内容hadoop fs -ls / 在HDFS中创建文件夹hadoop fs -

ABAP分享三 批量上传数据到内表简单示例

tYPE-POOLS: truxs. DATA: BEGIN OF build, name(10) TYPE c,   age(3)   TYPE c,   sex(2)   TYPE c,   spa      TYPE p DECIMALS 2, END OF build. DATA tabbuild LIKE TABLE OF build WITH HEADER LINE. DATA tabs LIKE  tabbuild. DATA: il_raw TYPE truxs_t_text_d

文件上传三:base64编码上传

介绍三种上传方式: 文件上传一:伪刷新上传 文件上传二:FormData上传 文件上传三:base64编码上传 Flash的方式也玩过,不喜欢不拿来说了. 优点: 1.浏览器可以马上展示图像,不需要先上传到服务端,减少服务端的垃圾图像 2.前端可以压缩.处理后上传到服务端,减少传输过程中的等待时间和服务器压力 缺点: 1.生成编码后保存成图片,倘若不做处理,会比原来的图片容量大,具体原因,搜索关键词:Base64编码为什么会使数据量变大 2.图片越大生成的编码越多,编码越多开发者工具中查看它时卡