TI CC2541 使用自定义的128bit UUID

来源:互联网 发布:工业软件市场规模 编辑:程序博客网 时间:2024/06/02 12:29

参考文档1:http://blog.chinaunix.net/uid-21411227-id-5750680.html
参考文档2:http://blog.csdn.net/feilusia/article/details/52334125

参考文档3:http://blog.csdn.net/u012862871/article/details/51702627

一、简介

本文介绍如何在SimpleBLEPeripheral工程中,将16bitUUID转换成128bitUUID

 

二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 9.20.2

硬件平台:Smart RF(主芯片CC2541

首先了解下基本概念(参考文档1)


2.7    UUID

 “GATT层”中定义的所有属性都有一个UUID值,UUID是全球唯一的128位的号码,它用来识别不同的特性。

2.7.1 蓝牙技术联盟 UUID

       蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。

所有的蓝牙技术联盟定义UUID共用了一个基本的UUID:

0x0000xxxx-0000-1000-8000-00805F9B34FB

为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为:

0x00002A37-0000-1000-8000-00805F9B34FB

虽然蓝牙技术联盟使用相同的基本UUID,但是16位的UUID足够唯一地识别蓝牙技术联盟所定义的各种属性。

蓝牙技术联盟所用的基本UUID不能用于任何定制的属性、服务和特性。对于定制的属性,必须使用另外完整的128位UUID。

2.7.2 供应商特定的UUID

       SoftDevice 根据蓝牙技术联盟定义UUID类似的方式定义UUID:先增加一个特定的基本UUID,再定义一个16位的UUID(类似于一个别名),再加载在基本UUID之上。这种采用为所有的定制属性定义一个共用的基本UUID的方式使得应用变为更加简单,至少在同一服务中更是如此。

使用软件nRFgo Studio非常容易产生一个新的基本UUID:

例如,在LED BUTTON示例中,采用0x0000xxxx-1212-EFDE-1523-785FEABCD123作为基本UUID。

 

蓝牙核心规范没有任何规则或是建议如何对加入基本UUID的16位UUID进行分配,因此你可以按照你的意图来任意分配。

例如,在LED BUTTON示例中,0x1523作为服务的UUID,0x1524作为LED特性的UUID,0x1525作为按键状态特性的UUID。

根据实际项目需要,TI的baseUUID需要保留给SDK用,自定义的UUID便是供应商特定的UUID

接着用nRFgo Studio生成了一个新的128BIT base UUID:

7586xxxx-3884-465C-A034-C242988B0000

三、具体步骤

1.   simpleGATTprofile.h添加自定义的128 bit UUIDbase

#define My_base_UUID(uuid)       0x00, 0x00, 0x8B, 0x98, 0x42, 0xC2, 0x34, 0xA0,0x5C, 0x46, 0x84, 0x38, LO_UINT16(uuid), HI_UINT16(uuid), 0x86, 0x75


2.simpleBLEPeripheral.cadvertData中增加条件编译(如果,此广播的service用的是TI16bitUUID,则不需要修改,我实际项目不修改此部分)

例如:#if defined (USE_128_BIT_UUID)  0x11,   // length of this data  GAP_ADTYPE_128BIT_MORE,      // some of the UUID's, but not all  My_base_UUID (SIMPLEPROFILE_SERV_UUID),  #else  0x03,   // length of this data  GAP_ADTYPE_16BIT_MORE,      // some of the UUID's, but not all  LO_UINT16( SIMPLEPROFILE_SERV_UUID ),  HI_UINT16( SIMPLEPROFILE_SERV_UUID ),  #endif

3.用条件编译替换

// Simple GATT Profile Service UUID: 0xFFF0CONST uint8 simpleProfileServUUID[ATT_BT_UUID_SIZE] ={   LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)};// Characteristic 1 UUID: 0xFFF1CONST uint8 simpleProfilechar1UUID[ATT_BT_UUID_SIZE] ={   LO_UINT16(SIMPLEPROFILE_CHAR1_UUID), HI_UINT16(SIMPLEPROFILE_CHAR1_UUID)};替换成:#if (defined USE_128_BIT_UUID)// Simple GATT Profile Service UUID: 0xFFF0CONST uint8 simpleProfileServUUID[ATT_UUID_SIZE] = {  My_base_UUID(SIMPLEPROFILE_SERV_UUID)};// Characteristic 1 UUID: 0xFFF1CONST uint8 simpleProfilechar1UUID[ATT_UUID_SIZE] ={   My_base_UUID(SIMPLEPROFILE_CHAR1_UUID)};对于其他的自己添加的Characteristic做类似替换

4.修改simpleProfileService(simpleGATTprofile.c中

将ATT_BT_UUID_SIZE改为ATT_UUID_SIZE,将uuid[0]uuid[1],改为uuid[12] uuid[13]  if ( pAttr->type.len == ATT_UUID_SIZE )  {    //128-bit UUID    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[12], pAttr->type.uuid[13]);    switch ( uuid )    {      case SIMPLEPROFILE_CHAR1_UUID:      case SIMPLEPROFILE_CHAR3_UUID:到这里特征值的读写没问题了,但是notify不起作用,继续做如下修改:

5.修改Profile的属性表simpleProfileAttrTbl的(simpleGATTprofile.c中)

Characteristic 1 Value 项的ATT_BT_UUID_SIZE 改为ATT_UUID_SIZE
// Characteristic Value 1      {         { ATT_UUID_SIZE, simpleProfilechar1UUID },        GATT_PERMIT_READ | GATT_PERMIT_WRITE,         0,         &simpleProfileChar1       },对于其他的自己添加的Characteristic做类似替换。

6.修改simpleProfile_WAttriterCB函数(simpleGATTprofile.c中)

将ATT_BT_UUID_SIZE改为ATT_UUID_SIZE,
将uuid[0]uuid[1],改为uuid[12] uuid[13]
else if ( pAttr->type.len == ATT_UUID_SIZE )  {    //128-bit UUID    uint16 uuid = BUILD_UINT16( pAttr->type.uuid[12], pAttr->type.uuid[13]);    switch ( uuid )    {      case SIMPLEPROFILE_CHAR1_UUID:      case SIMPLEPROFILE_CHAR3_UUID:

到这里特征值的读写没问题了,但是notify不起作用,继续做如下修改:

7.继续修改simpleProfile_WriteAttrCB函数(simpleGATTprofile.c中)以支持notify

据说主机对开启notify的操作是基于16bitUUID的,所以要这样改:
关于ATTRTBL_CHAR4_CCC_IDX的定义实际是属性表的特征值char4的config项的偏移位置,我的代码属性表中这项位置为12, 
所以定义为
#define ATTRTBL_CHAR4_CCC_IDX               12//Ccc ADD

8.最后修改工程的option,宏定义支持128bit UUID


9.REBUILD ALL,结果OK,所有特征值,读写notify正常




1 0