打印
[蓝牙]

CC2640R2F增加一个具有通知属性的characteristic

[复制链接]
834|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coshi|  楼主 | 2020-2-2 11:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
介绍
本章使用simple_peripheral作为实验平台。创建一个自定义属性的characteristic。simple_peripheral的IAR工程可以在目录C:\ti\simplelink_cc2640r2_sdk_1_35_00_33\examples\rtos\CC2640R2_LAUNCHXL\ble5stack\simple_peripheral\tirtos\iar下找到。


硬件环境

使用UBS连接我们的开发板。如下图所示


成功连接开发板之后,打开电脑的设备管理器。可以看见XDS110的两个端口,BLE Device Monitor将会使用XDS110 Class Application/User UART(COM25)


使用特权

评论回复

相关帖子

沙发
coshi|  楼主 | 2020-2-2 11:25 | 只看该作者
软件环境
  • IAR Embedded workbench 7.80.3
  • BLE-STACK V3.0.1
  • flash_programmer 2
  • BLE Device Monitor

使用特权

评论回复
板凳
coshi|  楼主 | 2020-2-2 11:26 | 只看该作者
开发步骤
在simple_perpheral工程中添加一个characteristic 6,主要通过修改simple_gatt_profile.c和simple_perpheral.c两个文件完成。

1.在simple_gatt_profile.h文件里面添加以下宏定义:
#define SIMPLEPROFILE_CHAR6                   5       //特征值
#define SIMPLEPROFILE_CHAR6_UUID              0xFFF6  //特征值UUID
#define SIMPLEPROFILE_CHAR6_LEN               5       //特征值长度

2.在simple_gatt_profile.c文件中设置特征值初始值,添加如下代码:
uint8_t charValue6[SIMPLEPROFILE_CHAR6_LEN] = { 'a', 'b', 'c', 'd', 'e' };
SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR6, SIMPLEPROFILE_CHAR6_LEN,
                               charValue6);

3.由于我们调用了SimpleProfile_SetParameter这个函数,该函数作用是设置特征值,当特征值具有通知属性就使用通知发送出来。由于该函数没有characteristic6的处理过程,所以需要我们自己添加,在simple_gatt_profile.c文件中,增加如下代码。
case SIMPLEPROFILE_CHAR6:
if ( len == SIMPLEPROFILE_CHAR6_LEN ) {
    VOID memcpy( simpleProfileChar6, value, SIMPLEPROFILE_CHAR6_LEN );
    // See if Notification has been enabled
    GATTServApp_ProcessCharCfg( simpleProfileChar6Config, simpleProfileChar6, FALSE,
                                simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ),
                                INVALID_TASK_ID, simpleProfile_ReadAttrCB );
} else{
    ret = bleInvalidRange;
}break;   

4.同理在SimpleProfile_GetParameter函数中也没有characteristic6的处理过程,在SimpleProfile_GetParameter中增加如下代码。
case SIMPLEPROFILE_CHAR6:
  VOID memcpy( value, simpleProfileChar6, SIMPLEPROFILE_CHAR6_LEN );
  break;


使用特权

评论回复
地板
coshi|  楼主 | 2020-2-2 11:26 | 只看该作者
5.在simple_gatt_profile.c定义characteristic6属性变量,并在simpleProfileAttrTbl属性数组表中添加。static uint8 simpleProfileChar6Props = GATT_PROP_NOTIFY;
static gattCharCfg_t *simpleProfileChar6Config;
static uint8 simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = { 0, 0, 0, 0, 0 };
static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6";

// Characteristic 6 UUID: 0xFFF6
CONST uint8 simpleProfilechar6UUID[ATT_BT_UUID_SIZE] ={
  LO_UINT16(SIMPLEPROFILE_CHAR6_UUID), HI_UINT16(SIMPLEPROFILE_CHAR6_UUID)
};

// Characteristic 6 Declaration
{ { ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar6Props },
// Characteristic Value 6
{ { ATT_BT_UUID_SIZE, simpleProfilechar6UUID },
0,
0,
simpleProfileChar6 },
{ { ATT_BT_UUID_SIZE, clientCharCfgUUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
(uint8 *)&simpleProfileChar6Config },
// Characteristic 6 User Description
{ { ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar6UserDesp },


使用特权

评论回复
5
coshi|  楼主 | 2020-2-2 11:27 | 只看该作者
6.接下来在simple_gatt_profile.c的SimpleProfile_AddService函数中对characteristic6的simpleProfileChar4Config参数分配内存。并初始化配置属性表。simpleProfileChar6Config = (gattCharCfg_t *)ICall_malloc( sizeof(gattCharCfg_t)*linkDBNumConns );
if ( simpleProfileChar6Config == NULL ){     
return ( bleMemAllocError );
}
GATTServApp_InitCharCfg( INVALID_CONNHANDLE, simpleProfileChar6Config );

7.回调改写,走读一下SimpleProfile_SetParameter()这个函数,可以发现,TI的处理过程是每次设置参数后会调用回调读取当前值,然后使用通知发送出来,所以如果要成功的使用通知发送数据,还必须在simpleProfile_ReadAttrCB回调函数中增加characteristic6的代码。在simple_gatt_profile.c文件中simpleProfile_ReadAttrCB函数里添加如下代码:
case SIMPLEPROFILE_CHAR6_UUID:
  *pLen = SIMPLEPROFILE_CHAR6_LEN;
  VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR6_LEN );
  break;
经过上面7步就完成了在增加通知属性的characteristic特征值,我们可以通过按键方式或者将就程序现成的定时器来每秒进行一次通知。这里我们演示使用定时器每秒通知一次characteristic6的值。在simple_peripheral.c文件里SimpleBLEPeripheral_performPeriodicTask函数中增加下面代码。

uint8_t charValue6[SIMPLEPROFILE_CHAR6_LEN] = { 'a', 'b', 'c', 'd', 'e' };
SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR6, SIMPLEPROFILE_CHAR6_LEN, charValue6);
如下图所示,使用BLE Device Monitor就能接收到开发板发送出来的数据,这里显示的abcde和我们设置的一样。


使用特权

评论回复
6
qcliu| | 2020-3-1 11:19 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
wiba| | 2020-3-1 11:24 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
zljiu| | 2020-3-1 11:29 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
9
drer| | 2020-3-1 11:33 | 只看该作者
非常感谢楼主分享

使用特权

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

本版积分规则

95

主题

3301

帖子

4

粉丝