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的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  2. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  3. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  4. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

  6. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  8. ASP.NET MVC Model绑定(六)

    ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...

  9. redis成长之路——(六)

    redis配置 为了码农在代码上只关心业务以及代码上的统一性,wenli.drive.redis内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...

随机推荐

  1. Task Runner Explorer for vs2015找不到啊

    https://visualstudiogallery.msdn.microsoft.com/8e1b4368-4afb-467a-bc13-9650572db708/view/ 编译typescri ...

  2. Java IO5:字符流

    字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为上一篇文章写了,一个Unicod ...

  3. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

    概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 ...

  4. MyBatis入门学习(一)

    一.MyBatis入门简要介绍(百科) MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyB ...

  5. Java-继承,多态练习0922-03

    编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void ...

  6. DDD~我们应该知道的Model,DomainModel和ViewModel

      回到目录 图在前 目前项目中可能出现的三种Model模式,对于我们现在开发的一个项目,我觉得使用DDD的思想来设计模型比较清晰,使用DDD的思想把模型model分成了如下三种: 下面是我微博中的截 ...

  7. atitit..代码生成流程图 流程图绘制解决方案 java  c#.net  php v2

    atitit..代码生成流程图 流程图绘制解决方案 java  c#.net  php v2 1.1. Markdown 推荐,就是代码和flow都不能直接使用.1 1.2. Java code2fl ...

  8. “胡”说IC——菜鸟工程师完美进阶

    “胡”说IC——菜鸟工程师完美进阶(数十位行业精英故事分享,顶级猎头十多年来经验总结,对将入或初入IC电子业“菜鸟”职业发展.规划的解惑和点拨.) 胡运旺 编著   ISBN 978-7-121-22 ...

  9. iOS-网络爬虫

    1.iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据 2.iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据 3.iOS—网络实用技术OC篇&am ...

  10. Jquery判断数组中是否包含某个元素$.inArray()的用法

    判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...