打印
[CC2640]

TI博文--CC26xx BLE 添加indication属性的特征值

[复制链接]
1574|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2020-10-14 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
         摘要
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在很多应用层级的协议制定中有比较广泛应用。
图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 属性:
同时,在特征值定义表格中,特征值2的读写属性里,把GATT_PERMIT_READ这一定义去掉,完全交由前面定义的simpleProfileChar2Props来决定,不然该特征值还是会被认为只有read属性:
2.1.2    特征值2 的配置属性添加
就像带有notification属性的特征值一样,作为带有indication属性的特征值,也必须有一个CCC(Client Characteristic Configuration)紧随该特征值的value定义,将它添加在特征值2的value定义后面:
同时,我们需要在特征值定义表格中把这个CCC的定义attribute也添加进去,位置是在特征值2的value定义之后,该attribute的读写属性为可读+可写。
注意,由于在表格里添加了一个attribute,表格数组的尺寸定义也要加1,由17变为18:


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


特征值的定义部分完成。
2.2      特征值2的CCC值操作
Indication或者notification的CCC值是由client(通常是central设备,极个别profile可以是peripheral设备)来用来使能server端的indication或者notification。这个操作本质上是client对CCC值的一个写操作,而写操作的处理在simpleProfile_WriteAttrCB()函数里,区分和例程里特征值4的notification的CCC值,添加代码如下,替换原来的:
注意GATT_CLIENT_CFG_INDICATE和GATT_CLIENT_CFG_NOTIFY的区别,分别对应indication和notification。这里的添加,就会修改simpleProfileChar2Config值,并且使能或者关闭特征值2的indication功能。
另外注意simpleProfileChar2Config本质是一个指针,指向gattCharCfg_t结构体:


每一个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的部分修改如下:
这里把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。
上面这段代码同时也实现了如何在service的表格里查找某特征值对应的attribute handle,可以借鉴用到其他地方。
2.4      应用层代码添加
添加用于indication的值,该值会每发送一次就累加一次:


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


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


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


这里只简单打印一下结果,打印的值为这一次发送成功的indication的值,具体可以根据实际情况进行修改,比如需要收到confirm之后发送下一个indication数据等。
3       Indication 测试
  • 编译下载代码到CC2652 LaunchPad上。
  • 打开手机上BLE的APP,比如LightBlue,查找Simple Peripheral,找到后连接。可以看到特征值2已经带indication属性。
图2.  特征值2的属性
3. 点进特征值2界面,点击Listetn for notification。这里“notification”只是界面显示,其实是indication。因为特征值2的属性显示已经是indication。
图3.  使能特征值2的indication
4. 手机收到CC2652发送过来的indication,并且在CC2652连接PC的串口终端上能看到手机回复收到indication之后的确认包。
图4.  Indication发送和确认           

使用特权

评论回复

相关帖子

沙发
kkzz| | 2020-11-2 13:34 | 只看该作者
蓝牙会干掉ZigBee吗        

使用特权

评论回复
板凳
hudi008| | 2020-11-2 13:34 | 只看该作者
谢谢楼主分享的资料了。   

使用特权

评论回复
地板
lzmm| | 2020-11-2 13:35 | 只看该作者
ZigBee是如何组网的           

使用特权

评论回复
5
minzisc| | 2020-11-2 13:35 | 只看该作者
如何定义一个zigbee的数据格式,  

使用特权

评论回复
6
selongli| | 2020-11-2 13:35 | 只看该作者
Zigbee模块中cc2591功率放大电路及参数  

使用特权

评论回复
7
fentianyou| | 2020-11-2 13:36 | 只看该作者
BLE(低功耗蓝牙)的MTU是什么  

使用特权

评论回复
8
xiaoyaodz| | 2020-11-2 13:36 | 只看该作者
蓝牙4.0和BLE有什么差别吗?  

使用特权

评论回复
9
febgxu| | 2020-11-2 13:37 | 只看该作者
蓝牙BLE如何连接连接多台设备   

使用特权

评论回复
10
sdlls| | 2020-11-2 13:37 | 只看该作者
蓝牙4.0ble服务端与客户端怎么区分

使用特权

评论回复
11
pixhw| | 2020-11-2 13:37 | 只看该作者
哪个版本的Linux支持蓝牙BLE4.0  

使用特权

评论回复
12
lzmm| | 2020-11-2 13:38 | 只看该作者
类似于ZigBee网络的还有什么网络  

使用特权

评论回复
13
hudi008| | 2020-11-2 13:38 | 只看该作者
BLE是低功耗、小数据传送。Zigbee组网比较有优势  

使用特权

评论回复
14
minzisc| | 2020-11-2 13:38 | 只看该作者
zigbee智能家居应用前景优势如何?  

使用特权

评论回复
15
kkzz| | 2020-11-2 13:38 | 只看该作者
蓝牙智能家居真的能超越ZigBee智能家居的领域吗

使用特权

评论回复
16
selongli| | 2020-11-2 13:38 | 只看该作者
五花八门的物联网IoT设备   

使用特权

评论回复
17
sdlls| | 2020-11-2 13:38 | 只看该作者
ble搜到一个蓝牙怎么跟特征值通信的  

使用特权

评论回复
18
febgxu| | 2020-11-2 13:38 | 只看该作者
如何测试设置是否支持蓝牙ble  

使用特权

评论回复
19
xiaoyaodz| | 2020-11-2 13:38 | 只看该作者
有支持蓝牙5.0的BLE蓝牙模块吗?  

使用特权

评论回复
20
pixhw| | 2020-11-2 13:38 | 只看该作者
ble 怎样接发数据            

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝