【BLE-CC2640】CC2640之使用自定义128bit的UUID

版权声明:喝水不忘挖井人,转载请注明出处,897503845@qq.com。 https://blog.csdn.net/feilusia/article/details/52334125

本篇博文最后修改时间:2017年06月16日,21:08。


一、简介

本文以SimpleBLEPeripheral工程为例,介绍如何在工程中使用自定义128bit的UUID


二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

编译软件:IAR Embedded Workbench for ARM Version 7.40

硬件平台:CC26xxDK开发板

仿真器:XDS100V3(香瓜)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
香瓜单片机之Linux群:512598061
香瓜单片机之职场交流群:450154342
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
暂无

2、在进行本文步骤前,请先实现以下博文:
1)《CC2640之添加自定义服务》:http://blog.csdn.net/feilusia/article/details/52333664#userconsent#



五、基础知识
1、什么是UUID?
答:UUID(Universally Unique Identifier)是通用唯一识别码。
在蓝牙设备中,每个服务、特征值都有一个对应的UUID。
UUID是128bit的,但在CC2541、CC2640的协议栈中默认使用的是简短的16bit的UUID。代码中看起来是简短,实际上最终还是会补齐为128bit。
例如simpleGATTprofile服务的16bit的UUID是0xFFF0,特征值的16bit的UUID是0xFFF1~0xFFF5,它会被补齐为128bit,如下图


2、UUID的作用是什么?
答:如果假设设备是一所学校,那么UUID是你的姓名、句柄handle是你的学号。
一开始学校会通过姓名(UUID)找到你,然后按顺序给大家分配学号(句柄handle),然后学校就可以通过学号(句柄handle)来找跟你沟通。
类似于学校人数有增减时学号可能会重新调整一样,蓝牙设备在上电时也会按顺序重新调整句柄handle。

举个例子,UUID为0xFFF4的特征值,上电时被蓝牙设备的系统分配为0x2E的句柄,app通过0xFFF4的UUID获取到0x2E的句柄值,之后就可用0x2E的句柄对该特征值进行读写。而如果0xFFF4之前的0xFFF3特征值被删除,那么下一次上电0xFFF4对应的句柄可能就是0x2B(往前挪了几位)。

六、实验步骤
1、工程中添加st_util.c和st_util.h文件
1)拷贝文件至自己的工程
将“……\CC2640\ble_cc26xx_2_01_00_44423\Projects\ble\Profiles\SensorProfile\CC26xx\”中的st_util.c和st_util.h,
拷贝至
“\CC2640\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\”

2)工程中添加st_util.c和st_util.h


3)设置中添加文件路径(默认就有路径,此处步骤可省)

2、将使用16bit改为使用128bit
1)添加头文件GUA_Profile.c中
#include "st_util.h"

2)修改代码1GUA_Profile.c中
CONST uint8 GUAServUUID[ATT_BT_UUID_SIZE] =  
{   
  LO_UINT16(GUAPROFILE_SERV_UUID), HI_UINT16(GUAPROFILE_SERV_UUID)  
};  
  
// GUA char1 UUID: 0xFFE1  
CONST uint8 GUAChar1UUID[ATT_BT_UUID_SIZE] =  
{   
  LO_UINT16(GUAPROFILE_CHAR1_UUID), HI_UINT16(GUAPROFILE_CHAR1_UUID)  
}; 
改为
CONST uint8 GUAServUUID[TI_UUID_SIZE] =  
{   
  TI_UUID(GUAPROFILE_SERV_UUID),  
};  
  
// GUA char1 UUID: 0xFFE1  
CONST uint8 GUAChar1UUID[TI_UUID_SIZE] =  
{   
  TI_UUID(GUAPROFILE_CHAR1_UUID), 
};  

3)修改代码2GUA_Profile.c中
static CONST gattAttrType_t GUAProfile_Service = { ATT_BT_UUID_SIZE, GUAServUUID }; 
改为
static CONST gattAttrType_t GUAProfile_Service = { TI_UUID_SIZE, GUAServUUID };  

4)修改代码3GUA_Profile.c的属性表GUAProfileAttrTbl

      // GUA Characteristic 1 Value  
      {   
        { ATT_BT_UUID_SIZE, GUAChar1UUID },  
        GATT_PERMIT_READ | GATT_PERMIT_WRITE,   
        0,   
        GUAProfile_Char1  
      },
改为
// GUA Characteristic 1 Value    
{     
  { TI_UUID_SIZE, GUAChar1UUID },    
  GATT_PERMIT_READ | GATT_PERMIT_WRITE,     
  0,     
  GUAProfile_Char1    
},  

5)修改代码4GUA_Profile.c的GUAProfile_ReadAttrCB
  if ( pAttr->type.len == ATT_BT_UUID_SIZE )  
  {  
    // 16-bit UUID  
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);  
改为
  if ( pAttr->type.len == ATT_UUID_SIZE )  
  {  
    // 128-bit UUID  
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[12], pAttr->type.uuid[13]); 
注:不这么改的话,读取时会出错。


6)修改代码5GUA_Profile.c的GUAProfile_WriteAttrCB
  if ( pAttr->type.len == ATT_BT_UUID_SIZE )  
  {  
    // 16-bit UUID  
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); 
改为
  if ( pAttr->type.len == ATT_UUID_SIZE )  
  {  
    // 128-bit UUID  
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[12], pAttr->type.uuid[13]); 
注:不这么改的话,写入时会出错。

7)修改代码6GUA_Profile.c的GUAProfile_WriteAttrCB中添加
  else if ( pAttr->type.len == ATT_BT_UUID_SIZE )  
  {  
    // 16-bit UUID  
    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]); 
    switch ( uuid )  
    { 
      case GATT_CLIENT_CHAR_CFG_UUID:  
        //char1通道,则打开notify开关  
        if ( pAttr->handle == GUAProfileAttrTbl[ATTRTBL_GUA_CHAR1_CCC_IDX].handle )//GUA CHAR1 NOTIFY    
        {    
          status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len,    
                                                   offset, GATT_CLIENT_CFG_NOTIFY );    
        }               
        else    
        {    
          status = ATT_ERR_INVALID_HANDLE;    
        }    
        break;  
         
      default:  
        status = ATT_ERR_ATTR_NOT_FOUND;  
        break; 
    }
  }
加这一段,是因为notify开关的UUID是16bit的,并不像特征值一样属于128bit。不加这一段会出现notify开关开不起来的情况。

8)添加IAR设置的128bit预编译宏
GATT_TI_UUID_128_BIT

3、修改UUID
1)修改香瓜服务中的UUIDGUA_Profile.h中
// GUA Service UUID  
#define GUAPROFILE_SERV_UUID                   0xFFE0  
      
// GUA CHAR1 UUID  
#define GUAPROFILE_CHAR1_UUID                  0xFFE1  
香瓜在这里使用默认的,暂时没改。可自定义。

2)修改协议栈的UUID补齐数字(bcomdef.h中
// TI Base 128-bit UUID: F000XXXX-0451-4000-B000-000000000000
#define TI_BASE_UUID_128( uuid )  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, \
                                  0x00, 0x40, 0x51, 0x04, LO_UINT16( uuid ), HI_UINT16( uuid ), 0x00, 0xF0
修改为
// TI Base 128-bit UUID:eeddXXXX-ccbb-aa99-8877-665544332211
#define TI_BASE_UUID_128( uuid )  0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, \
                                  0x99, 0xaa, 0xbb, 0xcc, LO_UINT16( uuid ), HI_UINT16( uuid ), 0xdd, 0xee
UUID在这里是倒叙的,跟注释对比一下即能明白。

七、实验结果

上图可见香瓜服务的128bit的UUID被我修改成功。
因此实验成功。








没有更多推荐了,返回首页