给 TI BLE 添加自己UUID
个人觉得这里的UUID就像USB报告的里面的ID作用一样,一个USB的设备可以根据ID读写不同数据长度的数据块,蓝牙也如此通过特性的UUID来识别读写不同长度的数据块!
可以参考demo的给 的 SIMPLEPROFILE_CHAR1 的样式
我这里使用 CHAR5 因为在demo中CHAR5 没有配置成我想要的,我就配置为 16byte的数据长度的可读写!
simpleGATTprofile.h 文件
1、
// Profile Parameters
#define SIMPLEPROFILE_CHAR1 0 // RW uint8 - Profile Characteristic 1 value
#define SIMPLEPROFILE_CHAR2 1 // RW uint8 - Profile Characteristic 2 value
#define SIMPLEPROFILE_CHAR3 2 // RW uint8 - Profile Characteristic 3 value
#define SIMPLEPROFILE_CHAR4 3 // RW uint8 - Profile Characteristic 4 value
#define SIMPLEPROFILE_CHAR5 4 // RW uint8 - Profile Characteristic 4 valuet
// Key Pressed UUID
#define SIMPLEPROFILE_CHAR1_UUID 0xFFF1
#define SIMPLEPROFILE_CHAR2_UUID 0xFFF2
#define SIMPLEPROFILE_CHAR3_UUID 0xFFF3
#define SIMPLEPROFILE_CHAR4_UUID 0xFFF4
#define SIMPLEPROFILE_CHAR5_UUID 0xFFF5
// Length of Characteristic 5 in bytes
#define SIMPLEPROFILE_CHAR5_LEN 16 //数据长度
simpleGATTprofile.c文件
// Characteristic 5 UUID: 0xFFF5
CONST uint8 simpleProfilechar5UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID)
};
// Simple Profile Characteristic 5 Properties
static uint8 simpleProfileChar5Props = GATT_PROP_READ | GATT_PROP_WRITE ;
// Characteristic 16 Value
static uint8 simpleProfileChar5[SIMPLEPROFILE_CHAR5_LEN] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
// Simple Profile Characteristic 5 User Description
static uint8 simpleProfileChar5UserDesp[17] = "Characteristic 5\0";
//如果要添加自己的,注意SERVAPP_NUM_ATTR_SUPPORTED这个下标值
static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED]={
...
...
// Characteristic 5 Declaration
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ ,
0,
&simpleProfileChar5Props
},
// Characteristic Value 5
{
{ ATT_BT_UUID_SIZE, simpleProfilechar5UUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
simpleProfileChar5
},
// Characteristic 5 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar5UserDesp
},
}
bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value ){
....
case SIMPLEPROFILE_CHAR5:
if ( len == SIMPLEPROFILE_CHAR5_LEN )
{
VOID osal_memcpy( simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN );
}
else
{
ret = bleInvalidRange;
}
break;
....
}
bStatus_t SimpleProfile_GetParameter( uint8 param, void *value ){
....
case SIMPLEPROFILE_CHAR5:
VOID osal_memcpy( value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN );
break;
.....
}
static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen )
{
....
case SIMPLEPROFILE_CHAR5_UUID:
*pLen = SIMPLEPROFILE_CHAR5_LEN;
VOID osal_memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR5_LEN );
break;
...
}
static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
uint8 *pValue, uint8 len, uint16 offset ){
..
case SIMPLEPROFILE_CHAR5_UUID:
//Validate the value
// Make sure it's not a blob oper
if ( offset == 0 )
{
if ( len != SIMPLEPROFILE_CHAR5_LEN )
{
status = ATT_ERR_INVALID_VALUE_SIZE;
}
}
else
{
status = ATT_ERR_ATTR_NOT_LONG;
}
//Write the value
if ( status == SUCCESS )
{
osal_memcpy(pAttr->pValue,pValue,SIMPLEPROFILE_CHAR5_LEN);
notifyApp = SIMPLEPROFILE_CHAR5;
}
break;
...
}
//app
// simpleBLEPeripheral.c
void SimpleBLEPeripheral_Init( uint8 task_id ){
..
uint8 charValue1 = 1;
uint8 charValue2 = 2;
uint8 charValue3 = 3;
uint8 charValue4 = 4;
uint8 charValue5[SIMPLEPROFILE_CHAR5_LEN];
osal_memset(charValue5,0,SIMPLEPROFILE_CHAR5_LEN);
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR1, sizeof ( uint8 ), &charValue1 );
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR2, sizeof ( uint8 ), &charValue2 );
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR3, sizeof ( uint8 ), &charValue3 );
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR4, sizeof ( uint8 ), &charValue4 );
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5 );
..
}
static void simpleProfileChangeCB( uint8 paramID ){
uint8 temp[HAL_LCD_MAX_BUFF];
//前面的省略.....
case SIMPLEPROFILE_CHAR5:
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR5, temp ); //获取特征值
//可以对自己的数据进行分析,实现自己想要的功能,
//这里仅仅用来串口和LCD打印出来
temp[SIMPLEPROFILE_CHAR5_LEN] = '\0';
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
;
//HalLcdWriteStringValue( "Char 5:", (uint16)(newValue), 10,HAL_LCD_LINE_3 );
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
#if(HAL_OLED)
LCD_CLSLineAt8x16Pix(CLS_START_LINE3, CLS_LINE2);
LCD_P8x16Str(0,WRITE_START_LINE3,"Char 5:");
LCD_P8x16Str(0,WRITE_START_LINE4,temp);
uart_printNotline("Char 5:");
uart_printLine((char*)temp);
#endif
break;
<pre code_snippet_id="574739" snippet_file_name="blog_20150108_9_5222020" name="code" class="cpp">//省略.....
}
实验结果:
使用CC2540 Dongle 作为 central 打开Btool完成连接,
利用UUID通信,读写数据
central发送数据:
串口输出
液晶屏的输出: