六、GAIA
1. GAIA
CSR GAIA (Generic Application Interface Architecture)提供了一个端到端的,与主机无关的生态系统来实现主机应用程序对设备的功能集访问。
1.1 接口实现
GAIA是处于较上层的应用层协议,其依赖的传输协议有多个,目前ADK支持的传输协议有:RFCOMM,SPP,GATT,不同的传输协议,实现相同的功能,但是在实现这些功能时一些机制和细节又存在着一些差异。因此ADK对传输层定义了多个抽象的接口,这些接口根据当前连接所采取的传输协议而自动映射到该协议对应的接口,具体映射关系如下图所示:

当采用不同传输协议时,部分通用接口可能无法找到对应的接口,比如当采用GATT传输协议时,gaiaTransportGetSink()通用接口没有对应的实现接口,因为GATT没有SINK和SOURCE这些实体。
下面来看看GAIA库和Sink_GAIA的主要结构体和函数接口。Sink_gaia.c主要提供了GAIA可注册事件发生时,向GAIA_Client推送事件的接口,如gaiaReportEvent()等。另外一个主要功能是管理GAIA事务,这主要通过handleGaiaMessage()对外提供的外部钩子函数实现。

Gaia.c提供了GAIA库的大部分功能实现,主要包括以下几个部分:
1.初始化GAIA库,开启GAIA服务器。
2.处理连接,断开连接请求和响应。
3.构建GAIA数据包,应答包,接收并解析GAIA数据包。
4.GAIA模块参数获取和修改接口。
1.2 重要流程
先来看看GAIA如何建立GAIA连接的。连接通常用GAIA_Client通过调用GaiaBtConnectRequest()发起。断开连接的请求可以有个client或者server任何一端发起。

再来看看GAIA连接建立之后,如何进行GAIA交互的。

在上图中,上半部分展示了一次典型的GAIA交互——GAIA_Client构造一个GAIA后,通过GAIA传输层发送给对端,GAIA_Server在接收到GAIA命令后,进行解析,如果参数合法,处理该请求后应答该次请求的结果,如果参数有错,则应答错误。
下半部分展示了GAIA_Client向GAIA_Server注册某个事件,并得到成功应答,在后续时间里,如果该注册的事件发生时,GAIA_Server向GAIA_Client发送notification通知。
对于到来的GAIA请求,GAIA lib库能够处理少部分请求(比如重启之类),大部分请求需要转发给应用层(sink_gaia.c)进行处理,这中情况下,只需要向应用层发送一条GAIA_UNHANDLED_COMMAND_IND消息即可。
1.3 GAIA Over GATT
下面来看看当传输层采用GATT时,整个流程是怎么样的?
首先,GATT Client和GATT Server都必须支持GATT GAIA Service,GATT Server添加和初始化了GATT GAIA Service。
gaiaGattServerInitialise()->
GaiaStartGattServer()->
gaiaTransportStartGattServer();->
gaiaTransportGattRegisterServer()->
GattManagerRegisterServer(); /*GATT MANAGER Module*/
其次,如果尚未开始GATT连接,则开始GATT连接过程,GATT连接后,在建立的GATT上,通过notify或者indication的方式向BLE_Centural发送消息。
GaiaSendPacket()->
gaiaTransportSendPacket()->
gaiaTransportGattSendPacket()->
GattManagerRemoteClientNotify()||GattManagerRemoteClientIndicate();
GaiaBuildAndSendSynch ()->
gaiaTransportGattSend ()->
GattManagerRemoteClientNotify()||GattManagerRemoteClientIndicate();
如何接收来自GATT_Client(BLE_Centural)的数据呢?根据前面GATT部分的了解,那肯定是放在了GAIA GATT库文件里面的内部回调函数里面了。GATT Service在向GATT MANAGER模块注册时指定了该回调函数,在该回调函数里面GATT_MANAGER_SERVER_ACCESS_IND消息提示来自GATT Client的access请求。
gaiaTransportGattRegisterServer()->
registration_params.task = &gaia->task_data;
message_handler()(gaia->task_data,gaia.c)-> GATT_MANAGER_SERVER_ACCESS_IND
gaiaHandleGattManagerAccessInd();
六、GAIA的更多相关文章
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- CRL快速开发框架系列教程六(分布式缓存解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- ASP.NET MVC Model绑定(六)
ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...
- redis成长之路——(六)
redis配置 为了码农在代码上只关心业务以及代码上的统一性,wenli.drive.redis内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...
随机推荐
- 设计模式之美:Manager(管理器)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的变化独立于类本身,并且管理 ...
- 犀利的background-clip:text,实现K歌字幕效果
今天学到了一个新的CSS3属性,更准确的说是属性值,那就是background-clip:text.利用此属性值可以制作出很神奇的效果.可惜只有chrome支持,不过今天可以先来玩玩这个属性. 先来介 ...
- js实现快速排序
非原创: var quickSort = function(arr){ if(arr.length<=1){return arr;} var pivotIndex = Math.floor(ar ...
- Caliburn实现MVVM模式的编程
引言:什么是Caliburn ? 一个夜晚,一处教堂,人们忏悔结束后抬头看到一把宝剑插在一块石头上.石上字述“英格兰人,凡能从石头上拔出剑者,为王者!”,Caliburn就是英格兰人心中的石中剑,这把 ...
- [专业名词·硬件] 1、等效串联电阻ESR概述及稳压电路中带有一定量ESR电容的好处
一.等效串联电阻ESR概述 ESR是Equivalent Series Resistance的缩写,即“等效串联电阻”.理想的电容自身不会有任何能量损失,但实际上,因为制造电容的材料有电阻,电 ...
- [安卓] 14、安卓HTTP——POST和GET用法分析
内容简介 本文通过建立一个简单的Servlet服务器来分析安卓上用HTTP和服务器通信的细节,旨在演示C/S模式下服务器端和客户端的工作过程. 目录 part.1 用MyEclipse建立一个简单的s ...
- Android开发学习之路-Palette颜色提取工具类使用
视频(要FQ):https://www.youtube.com/watch?v=5u0dtzXL3PQ Palette是一个在support-v7包中的一个颜色提取工具类,用法比较简单,而且是谷歌官方 ...
- Java线程:创建与启动
Java线程:创建与启动 一.定义线程 1.扩展java.lang.Thread类. 此类中有个run()方法,应该注意其用法: public void run() 如果该线程是使用独立的 R ...
- Atitit DbServiceV4qb9 数据库查询类库v4 新特性
Atitit DbServiceV4qb9 数据库查询类库v4 新特性 V4新特性 安全特性,屏蔽了executeUpdate,使用v2版 Sql异常转换,特别转换了DuplicateEnt ...
- Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求
Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本