摘要: AliOS Things从1.2.0版本开始支持蓝牙协议栈(BLE),及基于蓝牙协议栈的应用层开发框架。本文分为三部分对蓝牙组件进行介绍:蓝牙组件,蓝牙协议栈介绍及接口说明,和应用开发框架介绍及示例说明。AliOS Things v1.2.0支持蓝牙4.2,提供完整的host端低功耗蓝牙协议栈支持。

点击查看原文

AliOS Things从1.2.0版本开始支持蓝牙协议栈(BLE),及基于蓝牙协议栈的应用层开发框架。本文分为三部分对蓝牙组件进行介绍:

蓝牙组件
蓝牙协议栈介绍及接口说明
应用开发框架介绍及示例说明
蓝牙组件

AliOS Things v1.2.0支持蓝牙4.2,提供完整的host端低功耗蓝牙协议栈支持。主要包括三部分内容:协议层API,蓝牙协议栈,HCI (Host Controller Interface)驱动接口。当开发者拿到一个全新平台的时候,需要完成HCI接口与AliOS Things提供的蓝牙协议栈的对接。目前,AliOS Things已经完成在乐鑫ESP32上面蓝牙协议栈部分的对接,开发者可以直接基于协议层API进行上层应用开发。

从应用开发者的角度,BLE应用开发过程中,经常会遇到的烦恼是蓝牙协议栈概念及细节的理解。为了解决应用业务开发者的烦恼,AliOS-Things设计与开发了BLE应用开发框架。期望开发者在使用了我们的应用开发框架后,能够极简的进行业务逻辑开发,再也不用纠缠于BLE协议栈概念及细节。

综上,AliOS Things蓝牙组件总体结构如下图所示。

蓝牙协议栈及接口

AliOS Things v1.2.0支持低功耗蓝牙主要包括以下功能:

Generic Access Profile (GAP)
Generic Attribute Profile (GATT)
清晰的HCI驱动层抽象
主要提供以下接口:

GAP
GATT
Logical Link Control and Adaptation Protocol (L2CAP)
HCI驱动
蓝牙协议栈在快速迭代中,后续会开发更多功能及接口。

应用开发框架及接口

AliOS Things BLE应用开发框架主要针对GATT Server,即peripheral,主要完成以下功能:

维护开发者添加的属性和特性
GATT (Generic Attribute Profile)相关读,写,通知,指示和连接
通过实现上述两项功能,为开发者提供清晰简单的应用开发接口,接口主要包括以下功能:

创建外设应用开发框架对象
创建和添加属性到BLE协议栈,即GATT
广播Attribute
回复和更新Central设备的请求和订阅信息
我们已经在庆科mk3239上支持了创建外设应用框架对象接口,发布添加属性接口,广播接口。开发者可以在创建了外设应用开发框架对象后,借助于接口轻松添加属性,完成服务的广播,连接的建立和信息的更新。我们正在丰富上述接口功能并提供全部功能,并将已经在mk3239上支持的应用开发能力做到与平台无关,让使用其他蓝牙芯片的开发者也能够享受到极简开发的快乐。

AliOS Things应用层规范接口的定义,可以在framework/bluetooth/ble_app_framework/ble_app_framework.h文件中找到。下面对应用层接口作一些说明:
ble_peripheral_init

接口定义:

     peripheral_hdl_t ble_peripheral_init(peripheral_init_t *p,ble_peripheral_conn_cb_t c,ble_peripheral_disconn_cb_t disc,const uint8_t *gatt_db,int db_len);

接口说明:
该函数用于初始化peripheral设备服务,包括协议栈初始化、设备初始化、GATT属性数据库初始化。设备初始化相关的参数由参数p指定,GATT属性数据库由参数gatt_db和db_len指定。参数c和disc分别指定有客户端设备连接时和断开连接时的回调函数。该函数返回值是对应peripheral设备的handle,handle可以用于标识peripheral设备及其属性。
ble_peripheral_deinit

接口定义:
void ble_peripheral_deinit(peripheral_hdl_t hdl);
接口说明:
该接口是接口ble_peripheral_init的反向操作,用于注销peripheral设备初始化和协议栈初始化等操作。
ble_adv_start

接口定义:

    void ble_adv_start(ble_adv_complete_cb_t adv_handler,const char *manufacture,peripheral_hdl_t hdl);

接口说明:
该接口用于启动广播。参数adv_handler指定广播结束时的回调函数,参数manufacture指定设备的厂商名信息。广播的信息(服务、属性等)在初始化函数的GATT数据库中设定。
ble_adv_stop

接口定义:

void ble_adv_stop();

接口说明:
该接口停止广播。
ble_attr_add

接口定义:

     ble_gatt_attr_t *ble_attr_add(uint16_t hdl,uint16_t val_len,const uint8_t *val);

接口说明:
该接口用于添加peripheral设备属性值。参数hdl指定属性句柄,val指定属性值,val_len指定属性值的长度(以字节为单位)。该函数返回值为一个ble_gatt_attr_t类型的结构体,用于后续对该属性的操作。
ble_attr_indicate

接口定义:

     void ble_attr_indicate(ble_gatt_attr_t *attr,peripheral_hdl_t hdl,uint16_t len,const uint8_t *data);

接口说明:
该接口用于向客户端设备发送指示(indication)。参数attr表明指示对应的属性,hdl表明peripheral设备对应的handle,data指定需要指示的数据,len指定数据长度。
ble_attr_notify

接口定义:

    void ble_attr_notify(ble_gatt_attr_t *attr,peripheral_hdl_t hdl,uint16_t len,const uint8_t *data);

接口说明:
该函数功能与ble_attr_indicate类似,区别在于发送通知(notification)。
基于BLE应用框架的示例说明

AliOS Things目前提供了2个BLE示例sample,位于目录example/bluetooth/目录中。这2个sample均基于BLE应用框架和接口。下面对这2个sample作一些说明。

ble_advertisements

该示例sample展示了如何开发基于BLE应用框架和接口的应用。

第一步,初始化peripheral设备。

peripheral_init_t p = {BLE_DEVICE_NAME, 0, 1};
hdl = ble_peripheral_init(&p, connection_handler, disconnection_handler,adv_gatt_db, sizeof(adv_gatt_db));

peripheral_init_t中指定了设备名、最大连接数等信息。GATT数据库在adv_gatt_db中指定,包含了GATT服务、GAP服务、设备信息服务及他们的属性。

第二步,发布广播。广播的内容包括厂商名、第一步中指定的设备信息服务等。

ble_adv_start(adv_complete_cb, MANUFACURE_NAME, hdl);

ble_show_system_time

该示例程序是另外一个简单的基于BLE应用框架和接口的sample。该示例在上一个示例的基础上,增加了一个用户自定义服务(TIME Service),并为该服务添加了一个属性值,用于显示系统启动时长。

下面的代码展示了该示例程序的主要流程:

static void indicate_handler(void *arg)
{struct indicate_arg_s *ind = (struct indicate_arg_s *)arg;long long time = aos_now_ms();ble_attr_indicate(ind->attr, ind->hdl, sizeof(time), (uint8_t *)&time);aos_post_delayed_action(1000, indicate_handler, arg);
}int application_start( void )
{peripheral_hdl_t hdl;ble_gatt_attr_t *attr;struct indicate_arg_s ind_arg;peripheral_init_t p = {BLE_DEVICE_NAME, 0, 1};hdl = ble_peripheral_init(&p, connection_handler, disconnection_handler,adv_gatt_db, sizeof(adv_gatt_db));ble_adv_start(adv_complete_cb, MANUFACURE_NAME, hdl);attr = ble_attr_add(HDLC_TIME_OUT_VALUE, 0, NULL);ind_arg.hdl = hdl;ind_arg.attr = attr;aos_post_delayed_action(1000, indicate_handler, &ind_arg);aos_loop_run();return 0;
}

第一步,初始化peripheral设备。

第二步,启动广播。

第三步,添加时间属性的值。

第四步,每隔1s发送一次指示,该指示包含系统启动时长信息。

小结

目前,AliOS Things蓝牙组件提供了一些最基础的功能模块,开发者可以基于现有功能直接基于AliOS Things进行蓝牙开发。后续,我们会随着AliOS Things快速迭代,持续更新,主要包括:

升级到蓝牙5.0
支持更加丰富的应用开发示例和接口
支持SIG BLE mesh
AliOS Things uMesh支持蓝牙
支持更多的平台运行AliOS Things蓝牙协议栈

AliOS Things蓝牙协议栈及应用开发框架介绍相关推荐

  1. 蓝牙协议栈(Bluetooth stack)简介

    1 前言 本文只要对蓝牙协议栈做一个简单介绍,包含hci层.acl链路. l2cap层,sdp服务及几个常见的profile,让初学蓝牙协议栈的人 对整个蓝牙协议栈有一个整体框架的了解. 2 HCI层 ...

  2. 蓝牙 linux开发板,开源双模蓝牙协议栈 - 蓝牙模组以及开发板使用介绍

    零. 概述 本文章主要讲下我们的开发版(STM32F1+CSR8311)以及蓝牙模组扩展版(CSR8311)的功能以及使用简短说明 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容 ...

  3. BLE学习(1):蓝牙协议栈的介绍

    蓝牙官方(The Bluetooth Special Interest Group)定义了低功耗蓝牙(Bluetooth low energy,即LE)和基础/增强速率蓝牙(Bluetooth bas ...

  4. 蓝牙协议栈 电话免提协议HFP(Hands-Free)SDP介绍

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack) 电话免提协议HFP(Hands-Free) SDP的介绍,包括HF/AG角色的SDP. 一. 声明 本专栏文章我们会以连载的方式持续 ...

  5. 开源双模蓝牙协议栈 代码结构介绍

    零. 概述 本文章主要讲下双模蓝牙协议栈的代码结构以及常用的一些配置选项 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产 ...

  6. 吐血推荐历史最全的蓝牙协议栈介绍

    本文主要介绍蓝牙5.2协议栈,Bluetooth stack, 蓝牙5.2的架构,包含传统蓝牙/低功耗蓝牙的协议概述以及作用 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: ...

  7. AliOS Things SIG BLE Mesh网络的介绍和搭建

    摘要: 在最新的版本(1.2.1)中,AliOS Things 开始支持SIG BLE mesh.本文对SIG BLE mesh及如何使用AliOS Things搭建BLE mesh网络进行了详细的说 ...

  8. 蓝牙协议栈模组在linux ubuntu 跑蓝牙协议栈 --传统蓝牙搜索演示以及实现原理

    零. 概述 主要介绍下用Linux ubuntu虚拟机外接我们的蓝牙扩展版跑蓝牙协议栈的初始化以及搜索演示 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合 ...

  9. 分析蓝牙协议栈源码bstack

    参考:https://blog.csdn.net/lewanhah01/article/details/104029135 一.bstack支持的设备类型 BTStack支持多种接口的蓝牙模块,比如U ...

最新文章

  1. composer PHP Fatal error: Allowed memory size of 报错解决
  2. mongodb 压缩——3.0+支持zlib和snappy
  3. iis+nginx实现负载均衡
  4. MVC 支持同名路由,不同命名空间
  5. 第二百九十二节,RabbitMQ多设备消息队列-Python开发
  6. Pycharm-列出代码结构
  7. linux ftp图片服务器,linux ftp 图片服务器
  8. java cxf 调用wcf接口_JAVA 调用 WCF 服务流程
  9. scala中map添加值_如何在Scala Map中反转键和值
  10. Linux常用命令之文件和目录处理命令
  11. linux中安装wine运行windows程序
  12. 【转】NSArray排序方法
  13. mysqloffset什么意思_mysql查询时offset过大影响性能的原因和优化详解
  14. ad建集成库_手把手教你创建自己的Altium Designer集成元件库
  15. 教你看懂MOSFET数据手册
  16. 【老生谈算法】matlab实现Kmeans算法源码——Kmeans算法
  17. Faster-rcnn 源码学习(二)
  18. 在SQL Server 2008上遇到了删除作业失败的问题。 547错误
  19. 基于PHP+MySQL教务管理系统的设计与实现
  20. 【PR 基础】PR界面简介

热门文章

  1. android 外部内容分享到app内,外部跳转APP
  2. 逆向so_安卓逆向 | 分析调试与so调用实战
  3. python中的画布控制_使按钮在画布上工作(tkinter)
  4. 用c语言求最大公约数的流程图,如何用c语言求最大公约数和最小公倍数
  5. java arraylist 过滤_关于java:ArrayList过滤器
  6. 北大博士的论文发表经验:快写、细改、慢投
  7. 张文宏又爆“金句”:上班开会,要和关系最差的人坐一起……
  8. 故宫的“烧脑奇书”又火了!豆瓣9.2分,11种结局,可以玩一年!
  9. 【文末有福利】卷积学习与图像识别的技术发展
  10. 物理学家张首晟:如果世界末日来临,我会带这几句话上诺亚方舟|研习社演讲实录...