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属性
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发送和确认
行业资讯 I 芯片短缺对汽车供应链有何影响?
微软告诉你:Win 10操作系统中无法卸载预装应用
华人学者颠覆智能穿戴,用“智能创口贴”无创监测中心血压
在OPencv中采用的是Bouguet的极线校正的算法
RC微分器和RC高通滤波器是完全一样的吗
CC26xx BLE 添加indication属性的特征值
riscv64上运行完整Linux的流程
大型固定翼无人机如何实现规模化商用?
一款自动控制的全自动加湿器电路图
毕业季·看那些4000价位的锐龙本带你扬帆再起航
OPPO联手通信技术服务商加速5G商用落地
曝荣耀智慧屏X1将推75英寸版
龙尚科技助力煤矿智能化建设进入新发展阶段
如何去选择开关电源型号 开关电源选型指南
腾讯积极进行机器人测试,意图进军配送机器人领域
广和通精彩亮相第六届STM32中国峰会,释放嵌入式技术创造力
宇凡微荣获2022年粤港澳大湾区战略性新兴产业“领航企业”50强
手机售后服务有多重要?OPPO用户的真实评价暴露了太多
人工智能预测其他行星上的生命迹象
零度智控发布跟手机一样大小的无人机