TI BLE 新增自己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;
...
}
實驗結果:
使用CC2540 Dongle 作為 central 開啟Btool完成連線,
利用UUID通訊,讀寫資料
central傳送資料:
串列埠輸出