给 TI BLE 添加自己UUID

给 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发送数据:

串口输出



液晶屏的输出:




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

john_liqinghan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值