六、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内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...
随机推荐
- svn patch用法
最近遇到了一个patch的使用场景: 有一个同事对源码做了一些修改,但是又不想将源码提交到SVN服务器,而我又想得到他所做的修改. patch的使用方法: 创建patch 在要导出“修改”的目录中,单 ...
- ASP.NET 5系列教程 (一):领读新特性
近期微软发布了ASP.NET 5.0,本次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使ASP.NET应用不再受限于IIS.Cloud-ready环境配置降低了云端部 ...
- kvm 简介
1. 基础概念 1.1 kvm整合入linux 内核: 1.2 kvm模型中,每一个虚拟机对于linux而言都是一个标准进程: 1.3 普通的linux进程有用户和内核两个空间,在kvm模型中定义了客 ...
- Java多线程9:ThreadLocal源码剖析
ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...
- [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)
在前两章 ( 一 , 二 ) ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor . RECAP 这是上一节我们的Actor代码: class ...
- java系统性能分析
netstat -ano | findstr 31900 注意最后是pid 堆栈的作用: 线程死锁分析 辅助CPU过高分析 线程资源不足分析 性能瓶颈分析 关键线程异常退出 Windows:在运行ja ...
- IBatisNet:让insert操作返回新增记录的主键值
项目引用ibatis包: IBatisNet.Common.dll --文件版本1.6.2.0 IBatisNet.DataAccess.dll IBatisNet.DataMapper.dll 项目 ...
- 爱上MVC系列~带扩展名的路由失效问题
回到目录 对MVC中,对URL进行重写变得非常方便,你只要设置相应的路由规则即可完成,但进行MVC3后,发现设置了以下路由,系统具体不认 routes.MapRoute( name: "De ...
- Linux之VSFTP服务
一 .文件服务器简介 ftp:在内网和公网使用. 服务器:windows,linux 客户端:windows,linux samba:只能在内网使用(文件共享服务) 服务器:windows,linux ...
- 锋利的JQuery —— 事件和动画
大图猛戳