CC2540蓝牙4.0协议栈里增加特征值详细步骤解析。

转载注明出处,尊重原创

基于蓝牙协议栈1.3.2

第一往属性表里增加特征值

主要有如下几个步骤:
- 1 在simpleGATTprofile.h文件增加特征值的宏定义
- 2在simpleGATTprofile.c文件增加属性权限的定义,以及UUID的封装,并将特征值加到属性表simpleProfileAttrTbl里
- 3对simpleGATTprofile.c文件四个函数的修改
- 4 在simpleBLEPeripheral.c文件初始化函数 void simpleBLEPeripheral_Init()增加对特征值初始化代码
下面是详细解析:

1 在simpleGATTprofile.h文件增加特征值的宏定义

#define SIMPLEPROFILE_CHAR7 7
#define SIMPLEPROFILE_CHAR8 8

特征值uuid定义

#define SIMPLEPROFILE_CHAR7_UUID 0XFFF8
#define SIMPLEPROFILE_CHAR8_UUID 0XFFF9

特征值长度定义

#define SIMPLEPROFILE_CHAR7_LEN 15
#define SIMPLEPROFILE_CHAR8_LEN 15

2在simpleGATTprofile.c文件增加属性权限的

定义,以及UUID的封装,并将特征值加到属性表

simpleProfileAttrTbl里

首先对UUID进行封装
//Character 7
CONST uint8 simpleProfilechar7UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR7_UUID), HI_UINT16(SIMPLEPROFILE_CHAR7_UUID)
};
//Character 8
CONST uint8 simpleProfilechar8UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR8_UUID), HI_UINT16(SIMPLEPROFILE_CHAR8_UUID)
};

然后设置属性权限
//设置CHAR7 可读可写
static uint8 simpleProfileChar7Props = GATT_PROP_READ | GATT_PROP_WRITE;
static uint8 simpleProfileChar7[SIMPLEPROFILE_CHAR7_LEN] = {0, 0, 0, 0, 0};
static uint8 simpleProfileChar7UserDesp[17] = “Characteristic 7\0”;

//设置CHAR8 不能直接读写,通过通知发送
static uint8 simpleProfileChar8Props = GATT_PROP_NOTIFY;
static uint8 simpleProfileChar8[SIMPLEPROFILE_CHAR8_LEN] = {0, 0, 0, 0, 0};
static gattCharCfg_t simpleProfileChar8Config[GATT_MAX_NUM_CONN];
static uint8 simpleProfileChar8UserDesp[17] = “Characteristic 8\0”;

将SIMPLEPROFIEL_CHAR7
和SIMPLEPROFILE_CHAR8增加到属性表simpleProfileAttrTbl中
但是这里需要注意的是不能越界,需要把SERVAPP_NUM_ATTR_SUPPORTED改大一点,这里改为32;不然属性表会越界。
然后在属性表末尾增加如下内容
//Characteristic 7 Declaration
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar7Props
},
//Characteristic Value 7
{
{ ATT_BT_UUID_SIZE, simpleProfilechar7UUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
simpleProfileChar7
},
//Characteristic 7 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar7UserDesp
},
//Characteristic 8 declaration
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar8Props
},
//Characteristic Value 8
{
{ ATT_BT_UUID_SIZE, simpleProfilechar8UUID },
0,
0,
simpleProfileChar8
},
//Characteristic 8 Configuration
{
{ ATT_BT_UUID_SIZE, clientCharCfgUUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
(uint8 *)simpleProfileChar8Config
},
//Characteristic 8 User description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID},
GATT_PERMIT_READ,
0,
simpleProfileChar8UserDesp
},

这样我们就把属性在属性表里建立完成,第二步是在相应的函数里增加对它的响应。

对simpleGATTprofile.c文件四个函数的修改

这四个函数是
static uint8 simpleProfile_ReadAttCB( );
static bStatus_t simpleProfile_WriteAttrCB( );
bStatus_t SimpleProfile_SetParameter();
bStatus_t SimpleProfile_GetParameter();
我把所有函数的参数都省去,她们每个参数的意义自己找到相应的头文件自己看吧

以下两个是特征值参数设置函数

bStatus_t SimpleProfile_SetParameter()函数中增加如下代码
这段代码的作用是可以对特征值的内容进行设置
case SIMPLEPROFILE_CHAR7:
if(len == SIMPLEPROFILE_CHAR6_LEN)
{
VOID osal_memcpy( simpleProfileChar6, value, SIMPLEPROFILE_CHAR6_LEN );
}
else
{
ret = bleInvalidRange;
}
break;
case SIMPLEPROFILE_CHAR8:
if( len == SIMPLEPROFILE_CHAR8_LEN )
{
VOID osal_memcpy( simpleProfileChar8, value, SIMPLEPROFILE_CHAR8_LEN );
// See if Notification has been enabled查看通知是否启用
同时因为char8设置成是从机通知主机,所以这里增加查看通知是否打开
GATTServApp_ProcessCharCfg( simpleProfileChar8Config, simpleProfileChar8, FALSE,
simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ),
INVALID_TASK_ID );
}
else
{
ret = bleInvalidRange;
}

bStatus_t SimpleProfile_GetParameter()函数增加如下代码
主要是为了在从机(服务器)里获得当前特征值的数据,这个与特征值的权限概念不一样,权限的概念是指主机(客户端central)对特征值的访问权限以及怎么访问。
case SIMPLEPROFILE_CHAR7:
VOID osal_memcpy( value, simpleProfileChar7, SIMPLEPROFILE_CHAR7_LEN );
break;
case SIMPLEPROFILE_CHAR8:
VOID osal_memcpy( value, simpleProfileChar8, SIMPLEPROFILE_CHAR8_LEN );
break;

以下两个函数是对特征值读写操作的函数

simpleProfile_ReadAttrCB() 是读特征值函数,这个函数是不被上层应用调用的,他是一个回调函数;接下来的simpleProfile_WriteAttrCB()也是回调函数,她们一同赋值给这个结构体
CONST gattServiceCBs_t simpleProfileCBs =
{
simpleProfile_ReadAttrCB, // Read callback function pointer
simpleProfile_WriteAttrCB, // Write callback function pointer
NULL // Authorization callback function pointer
};
然后simpleProfileCBs在注册服务属性列表和GATT服务应用回调函数 GATTServApp_RegisterService中使用;这个函数位于simpleGATTprofile.c文件中
说明simpleProfile_ReadAttrCB与simpleProfile_WriteAttrCB函数被库函数调用,用于对属性表的特征值进行读写!!!
在simpleProfile_ReadAttrCB增加的代码
case SIMPLEPROFILE_CHAR7_UUID:
*pLen = SIMPLEPROFILE_CHAR7_LEN;
VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR7_LEN );
break;
case SIMPLEPROFILE_CHAR8_UUID:
*pLen = SIMPLEPROFILE_CHAR8_LEN;
VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR8_LEN );
break;
simpleProfile_WriteAttrCB函数中增加的代码:

case SIMPLEPROFILE_CHAR7_UUID:
{
//Validate the value
// Make sure it’s not a blob oper
if ( offset == 0 )
{
if ( len != SIMPLEPROFILE_CHAR7_LEN )
{
status = ATT_ERR_INVALID_VALUE_SIZE;
}
}
else
{
status = ATT_ERR_ATTR_NOT_LONG;
}
if(status == SUCCESS)
{
VOID osal_memcpy(pAttr->pValue, pValue, SIMPLEPROFILE_CHAR7_LEN);
notifyApp = SIMPLEPROFILE_CHAR7;
}
}
break;
case SIMPLEPROFILE_CHAR8_UUID:
{
//Validate the value
// Make sure it’s not a blob oper
if ( offset == 0 )
{
if ( len != SIMPLEPROFILE_CHAR8_LEN )
{
status = ATT_ERR_INVALID_VALUE_SIZE;
}
}
else
{
status = ATT_ERR_ATTR_NOT_LONG;
}
if(status == SUCCESS)
{
VOID osal_memcpy(pAttr->pValue, pValue, SIMPLEPROFILE_CHAR8_LEN);
notifyApp = SIMPLEPROFILE_CHAR8;
}
}
break;

4 在simpleBLEPeripheral.c文件初始化函数 void simpleBLEPeripheral_Init()增加对特征值初始化代码

uint8 charValue7[SIMPLEPROFILE_CHAR7_LEN] = { 1, 2, 3, 4, 5 };
uint8 charValue8[SIMPLEPROFILE_CHAR8_LEN] = { 1, 2, 3, 4, 5 };

SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR7, SIMPLEPROFILE_CHAR7_LEN, charValue7 );

SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR8, SIMPLEPROFILE_CHAR8_LEN, charValue8 );
另外这里要补充一点的是,你们知道char8对客户端开说是无读写功能,只有通知功能,所以要初始化客户端对相应特征值的配置,调用的函数是GATTServApp_InitCharCfg( INVALID_CONNHANDLE, simpleProfileChar7Config ),加在simpleGATTProfile.c文件SimpleProfile_AddService函数里,

现在特征值添加完毕 ,可以下载到开发版

联合Btool软件对特征值读写
选择 reading characteristc Value by UUID,输入下面的值,可以看到相应的

#define SIMPLEPROFILE_CHAR7_UUID 0XFFF8
#define SIMPLEPROFILE_CHAR8_UUID 0XFFF9

你可能感兴趣的:(蓝牙,特征值,CC2540)