六、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内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...
随机推荐
- SqlServer2012 数据库的同步之发布+订阅
文章参考了百度过的文章,因为版本不同,操作中也遇到了很多问题,现在整理一下,希望对各位朋友有所帮助. 发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在 ...
- Expression Tree 扩展MVC中的 HtmlHelper 和 UrlHelper
表达式树是LINQ To everything 的基础,同时各种类库的Fluent API也 大量使用了Expression Tree.还记得我在不懂expression tree时,各种眼花缭乱的A ...
- 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)
返回目录 概念 Microsoft.Practices.Unity.Interception是一个拦截器,它隶属于Microsoft.Practices.Unity组成之中,主要完成AOP的功能,而实 ...
- Atitti css transition Animation differ区别
Atitti css transition Animation differ区别 1.1. transition的优点在于简单易用,但是它有几个很大的局限. 1 1.2. Transition ...
- Atitit html5 Canvas 如何自适应屏幕大小
Atitit html5 Canvas 如何自适应屏幕大小 可以用JS监控屏幕大小,然后调整Canvas的大小.在代码中加入JS 1 2 3 4 5 6 7 $(window).resize ...
- 据说,每一个 iOSer 都想要一张 Swift 大会门票
据说,每一个 iOSer 都想要一张中国首届 Swift 开发者大会的门票: 那么,福利来了-- fir.im 作为中国首届 Swift 大会的唯一钻石赞助商,有最后 2 张价值 600 多的门票(已 ...
- css3实现超出文本指定行数(指定文本长度)用省略号代替
测试代码: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- 简单的跨平台c/c++日志记录
CLog.h #include <stdlib.h> #pragma once #ifndef _CLOG #define _CLOG #define CLOG_DEBUG 0 #defi ...
- javaweb回顾第八篇如何创建自定义标签
前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...
- 关于json序列化和反序列的问题,没事写个案例,希望能帮到那些需要帮忙的朋友!
现在关于json的读写问题,有许许多多的解决方法,因人而异,根据实际问题去选择自己想要的最容易方法.我觉得自带的Newtonsoft.Json是个不错的选择,随便写两个例子吧! 一:关于简单的json ...