0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CC26xx BLE添加indication属性的特征值

电子设计 来源:电子设计 作者:电子设计 2022-01-13 17:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Yan Zhang

摘要

CC26xx 是TI 提供的高性能2.4GHz射频SOC芯片。最新一代CC2652可以支持BLE,ZigBee,Thread,TI15.4以及私有协议。能以multi-protocol模式同时运行BLE+ZigBee ,BLE+TI15.4,或者BLE+2.4G 私有协议,任意两种组合。

TI提供CC26xx的SDK,SDK里面包含了各种协议支持,其中就包含BLE。BLE协议里,TI提供了很多例程。其中simple peripheral例程是最为广泛使用的一个,里面提供了BLE最基本的各种read, write,notify属性的特征值,唯独没有indication属性的特征值。Indication 属性和notify属性类似,但又不一样,它是需要BLE Client设备收到数据后回复确认的一种机制。

本文基于CC2652的SDK V3.30版本的simple peripheral 例程实现indication。本文提供的方式适用于所有CC26xx系列的芯片。

目录

1. BLE 特征值的indication属性........................................................................................................... 2

2. CC2652 indication的实现................................................................................................................ 2

2.1 特征值2的定义............................................................................................................................. 2

2.1.1 特征值2 属性修改.................................................................................................................... 2

2.1.2 特征值2 的配置属性添加......................................................................................................... 3

2.2 特征值2的CCC值操作................................................................................................................. 4

2.3 特征值2的indication数据发送...................................................................................................... 4

2.3.1 调用GATTServApp_ProcessCharCfg()................................................................................... 4

2.3.2 调用GATT_Indication()............................................................................................................ 5

2.4 应用层代码添加........................................................................................................................... 6

3. Indication 测试................................................................................................................................ 7

4. 参考文献........................................................................................................................................... 9

图表

图1. BLE indication............................................................................................................................ 2

图2. 特征值2的属性.............................................................................................................................. 8

图3. 使能特征值2的indication............................................................................................................. 9

图4. Indication发送和确认................................................................................................................... 9

1 BLE 特征值的indication属性

BLE特征值的indication是由server端主动向client端发送数据的一种方式,和notification方式类似,但indication不一样的地方是需要client端收到数据后回复confirm包给server端。这些行为都是在GATT层完成,并可以通知client应用层对方成功接收数据。由于有自动确认机制,indication在很多应用层级的协议制定中有比较广泛应用。

poYBAGGKS8yAC6AIAAA8IWRiqZc083.png

图1. BLE indication

2 CC2652 indication的实现

本文基于CC2652的SDK V3.30版本的simple peripheral 例程实现indication,在simple GATT service中的特征值2上添加indication机制,特征值2将同时支持read和indication的属性。

2.1 特征值2的定义

2.1.1 特征值2 属性修改

在simple_gatt_profile.c中,给Characteristic 的属性添加indication 属性:

poYBAGGKS82AdaCYAAAi-nvoYLM705.jpg

同时,在特征值定义表格中,特征值2的读写属性里,把GATT_PERMIT_READ这一定义去掉,完全交由前面定义的simpleProfileChar2Props来决定,不然该特征值还是会被认为只有read属性:

pYYBAGGKS8-AE5NtAAAhpv25FB4808.jpg

2.1.2 特征值2 的配置属性添加

就像带有notification属性的特征值一样,作为带有indication属性的特征值,也必须有一个CCC(Client Characteristic Configuration)紧随该特征值的value定义,将它添加在特征值2的value定义后面:

pYYBAGGKS9GAc4OBAADcV7-U-Hc979.jpg

同时,我们需要在特征值定义表格中把这个CCC的定义attribute也添加进去,位置是在特征值2的value定义之后,该attribute的读写属性为可读+可写。

pYYBAGGKS9KAEk6rAABLTH92z3Q779.jpg

注意,由于在表格里添加了一个attribute,表格数组的尺寸定义也要加1,由17变为18:

poYBAGGKS9SAGodCAAAN2dhxDo4547.jpg

在service初始化函数中,把特征值2的CCC值也进行初始化,位置在SimpleProfile_AddService() 函数:

pYYBAGGKS9aASFeTAABhyQNwOS0752.jpg

特征值的定义部分完成。

2.2 特征值2的CCC值操作

Indication或者notification的CCC值是由client(通常是central设备,极个别profile可以是peripheral设备)来用来使能server端的indication或者notification。这个操作本质上是client对CCC值的一个写操作,而写操作的处理在simpleProfile_WriteAttrCB()函数里,区分和例程里特征值4的notification的CCC值,添加代码如下,替换原来的:

poYBAGGKS9eAdFuTAABtc9qrRWs044.jpg

注意GATT_CLIENT_CFG_INDICATE和GATT_CLIENT_CFG_NOTIFY的区别,分别对应indication和notification。这里的添加,就会修改simpleProfileChar2Config值,并且使能或者关闭特征值2的indication功能。

另外注意simpleProfileChar2Config本质是一个指针,指向gattCharCfg_t结构体:

poYBAGGKS9mAM45fAAA2HauiYds031.jpg

每一个CCC的value,对应一个connection handle,也就是对应一个BLE的连接。从其在SimpleProfile_AddService()函数里的初始化也可以看出,simpleProfileChar2Config被分配了MAX_NUM_BLE_CONNS个gattCharCfg_t尺寸的空间,这就为每个BLE连接都单独预留了indication的CCC的配置,每一个连上本设备的central设备都能单独开关特征值2的indication。

2.3 特征值2的indication数据发送

在CC26xx的SDK中,发送indication或者notification有两种方式,一种是调用封装的函数GATTServApp_ProcessCharCfg(),另一种是直接调用GATT的API函数GATT_Indication()和GATT_Notification()。

2.3.1 调用GATTServApp_ProcessCharCfg()

在SimpleProfile_SetParameter()中,应用层会调用该函数来做特征值操作,把对应的特征值2的部分修改如下:

pYYBAGGKS9uAUts3AACAVAL_s1c499.jpg

这里把len的长度加1的目的是为了得到应用层的task ID。这就是indication和notification的区别之一,蓝牙协议规定indication发送后是需要对方回复confirm确认的,这个确认必须要有一个对应的实体也就是task去接收并且处理(也可以不处理,只是当作一个indication成功的通知,接收这个动作是必须的)。所以indication发送的时候必须要提前制定确认消息的接收task ID。这里就会通过SimpleProfile_SetParameter() 被应用层调用来指定发送的indication的值和接收确认消息的task ID,一般就由应用层task本身接收。

2.3.2 调用GATT_Indication()

另一种方法直接调用GATT层API GATT_Indication(),实现代码如下。由于CC26xx支持一从多主模式,所以有可能同时存在多条BLE链路,因此代码的实现也考虑到这一点,所有当前存在的BLE链路都要进行判断,根据CCC值的开关状态决定是否需要向对应的主机发送该特征值的indication。

pYYBAGGKS92AbE3uAAD4bO1XGO0932.jpg

上面这段代码同时也实现了如何在service的表格里查找某特征值对应的attribute handle,可以借鉴用到其他地方。

2.4 应用层代码添加

添加用于indication的值,该值会每发送一次就累加一次:

poYBAGGKS96APn__AAAPYO5x8g0346.jpg

在SimplePeripheral_performPeriodicTask()中定时发送特征值2的indication,和特征值4的notification一起发送:

poYBAGGKS-CAanFdAADMygulkxQ282.jpg

针对特征值2操作的参数是两个字节长度,第一个字节是要发送的值,第二个字节就是indication发送后central回复确认的时候进行接收的task ID,这里用的就是应用层task本身的ID。

注意,TI-RTOS的每个task有个entity ID,这个其实就是task ID:

pYYBAGGKS-GAeNOHAAAdtu8qOrE887.jpg

在应用层中添加indication发送后,收到central的确认消息的操作。在函数SimplePeripheral_processGATTMsg() 中添加ATT_HANDLE_VALUE_CFM的操作:

pYYBAGGKS-OAKc47AAAzMN4fOCs702.jpg

这里只简单打印一下结果,打印的值为这一次发送成功的indication的值,具体可以根据实际情况进行修改,比如需要收到confirm之后发送下一个indication数据等。

3 Indication 测试

编译下载代码到CC2652 LaunchPad上。

打开手机上BLE的APP,比如LightBlue,查找Simple Peripheral,找到后连接。可以看到特征值2已经带indication属性。

poYBAGGKS-WAQACnAABLMb3Hfqw650.jpg

图2. 特征值2的属性

3. 点进特征值2界面,点击Listetn for notification。这里“notification”只是界面显示,其实是indication。因为特征值2的属性显示已经是indication。

poYBAGGKS-aAfZP1AABJe9StI9w627.jpg

图3. 使能特征值2的indication

4. 手机收到CC2652发送过来的indication,并且在CC2652连接PC的串口终端上能看到手机回复收到indication之后的确认包。

审核编辑:金巧

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • soc
    soc
    +关注

    关注

    40

    文章

    4652

    浏览量

    230507
  • 嵌入式处理
    +关注

    关注

    0

    文章

    341

    浏览量

    10556
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1113

    浏览量

    52140
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CC1310-TC-008超小体积低功耗嵌入式433M无线数传模块解析

    CC1310-TC-008超小体积低功耗嵌入式433M无线数传模块。 文件下载: CC1310-TC008.pdf 一、模块介绍 1.1 模块概述 CC1310属于德州仪器(TI)CC26x
    的头像 发表于 05-09 10:55 210次阅读

    智慧交通属性升级,BLE SoC赋能车载OBU从收费终端迈向智能节点

    BLE SoC赋能车载OBU,实现智能交互与服务升级,提升用户体验与系统安全性。
    的头像 发表于 04-03 11:44 495次阅读
    智慧交通<b class='flag-5'>属性</b>升级,<b class='flag-5'>BLE</b> SoC赋能车载OBU从收费终端迈向智能节点

    LuatOS平台下BLE蓝牙开发从入门到实践

    ,全面介绍LuatOS中BLE模块的基础知识,涵盖角色定义(主机/从机)、服务配置、特征值操作与事件回调机制,并通过一个完整的温湿度数据上报案例,逐步演示应用开发全过程。 一、BLE总体介绍   1.1 什么是
    的头像 发表于 02-02 16:32 8257次阅读
    LuatOS平台下<b class='flag-5'>BLE</b>蓝牙开发从入门到实践

    探索CC85xx系列:2.4 GHz无线数字音频的理想之选

    探索CC85xx系列:2.4 GHz无线数字音频的理想之选 在当今数字化的时代,无线数字音频技术正以前所未有的速度发展。而德州仪器(TI)的CC8520、CC8521、CC8530和
    的头像 发表于 01-06 10:35 6532次阅读

    探索CC85xx系列:2.4GHz无线数字音频流的理想之选

    探索CC85xx系列:2.4GHz无线数字音频流的理想之选 在当今的电子世界中,无线数字音频技术的发展日新月异。对于电子工程师而言,选择一款性能卓越、功能丰富的无线音频芯片至关重要。今天,我们就来
    的头像 发表于 01-06 09:55 7154次阅读

    探索CC85xx系列:2.4 GHz无线数字音频的理想之选

    探索CC85xx系列:2.4 GHz无线数字音频的理想之选 在当今的无线音频领域,寻找一款高性能、低成本且易于集成的解决方案是众多电子工程师的目标。德州仪器(TI)的CC8520、CC
    的头像 发表于 01-06 09:45 8762次阅读

    深入剖析CC2630:高性能无线MCU的卓越之选

    和应用这款芯片。 文件下载: cc2630.pdf 一、CC2630概述 CC2630是CC26xx家族中的一员,具有低成
    的头像 发表于 01-05 14:55 1235次阅读

    CC3130:开启低功耗物联网连接新时代

    丰富的功能和出色的性能,为物联网应用提供了强大的支持。 文件下载: cc3130.pdf 一、CC3130核心特性 (一)集成功能与协议支持 CC3130集成了Wi-Fi和互联网协议,支持与B
    的头像 发表于 12-22 11:10 2038次阅读

    TI CC2642R BLE 5.2低功耗蓝牙模块:以核心芯片驱动智能连接革新

    TI CC2642R BLE 5.2 低功耗蓝牙模块 凭借其卓越性能与灵活应用,正重新定义无线通信的边界。本文将从技术特性、核心优势、应用场景及开发支持四大维度,深度解析这款模块如何赋能行业创新。 一、技术特性:BLE 5.2
    的头像 发表于 12-18 15:41 964次阅读

    ‌TI CC1311P3 LaunchPad™开发套件技术解析与应用指南

    Texas Instruments CC1311P3 LaunchPad™ 开发套件设计用于加速开发SimpleLink™ 亚1GHz无线MCU。该器件支持TI 15.4堆栈和专有射频协议。CC13XX-CC26XX软件开发套件 (SDK) 提供TI
    的头像 发表于 09-01 15:19 1846次阅读
    ‌TI <b class='flag-5'>CC</b>1311P3 LaunchPad™开发套件技术解析与应用指南

    ATT读取由组请求CYBLE-416045-02 gatt服务器响应,带有错误的起始和结束属性句柄怎么解决?

    过程中,需要经过 ATT 按组类型请求读取,我的服务器响应如下: ... 客户端 ATT 按组请求读取:起始属性句柄 = 70 / 结束属性句柄 = 65535 我的服务器响应:句柄对{Start
    发表于 08-14 07:28

    STM32WBA55CG连接上手机时如何自动开启Notify而不需要手机端手动开启呢?

    这是我手机用STBLETOOlBOX连接上开发板后的图片 我发现手机一旦连接上开发板有的特征值是自动开启的notify 有的特征值还需要手动点击Notify才能收到通知,这是为什么?在哪里可以让所有特征值能够连接上手机后自动打
    发表于 07-25 09:21

    外围设备通过手机连接到BLE应用程序,为什么不能连接到Infineaon BLE

    使用 ch06_ex01_periab \" le 项目创建了外围设备。\" \" 使用像 LightBlue 这样的移动应用程序,我能够连接到这个外围设备并更改特征值。 我已经使用 \"
    发表于 07-07 08:06

    【沁恒CH585开发板免费试用体验】4、从ADC采集到BLE-Web实时可视化

    = await service.getCharacteristic(characteristicUuid); // 检查特征值属性 const properties
    发表于 07-04 15:43

    BLE连接未启动的原因?

    我们遇到了与 BLE 连接相关的问题,详情如下 添加了新的详细日志(Detailed-logs.zip)。 移动设备:Android Samsung z flip 设备:M63 KA 设备应用程序
    发表于 06-05 07:12