六、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内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...
随机推荐
- Java中的受检异常
Java中的受检异常 Java提供了三种异常类型,受检异常(checked exception).运行时异常(runtime exception).错误(error).那么这受检异常在实际开发中又有什 ...
- Java设计模式5:原型模式
原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...
- AMD加载器实现笔记(四)
继续这一系列的内容,到目前为止除了AMD规范中config的map.config参数外,我们已经全部支持其他属性了.这一篇文章中,我们来为增加对map的支持.同样问题,想要增加map的支持首先要知道m ...
- ng-template寄宿方式
如果你是一个angular的开发者的话,对于ng-html2js你应该 很熟悉.对于angular的指令,我们经常需要定义模板( directive template/templateUrl),你可以 ...
- hadoop 学习笔记:mapreduce框架详解
开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能 ...
- HTML5文件上传插件 Huploadify V2.1发布
月初发布了HUploadify2.0版本,增加了文件的断点续传功能,得到了不少朋友的好评.本着按照Uploadify原样复制的原则,本次在一些朋友的建议中采纳了几点,做了一次较小的改动,定为2.1版本 ...
- java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3
上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...
- NSString NSUrl 相互转化
//NSString 转为 NSURL NSString *webStr = @"www.baidu.com"; NSURL *webUrl = [NSURL URLWithStr ...
- EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回 EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...