参考文档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工程中,将16bit的UUID转换成128bit的UUID
二、实验平台
协议栈版本: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三、具体步骤
#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
例如:
#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
// Simple GATT Profile Service UUID: 0xFFF0
CONST uint8 simpleProfileServUUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)
};
// Characteristic 1 UUID: 0xFFF1
CONST 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: 0xFFF0
CONST uint8 simpleProfileServUUID[ATT_UUID_SIZE] =
{
My_base_UUID(SIMPLEPROFILE_SERV_UUID)
};
// Characteristic 1 UUID: 0xFFF1
CONST uint8 simpleProfilechar1UUID[ATT_UUID_SIZE] =
{
My_base_UUID(SIMPLEPROFILE_CHAR1_UUID)
};
对于其他的自己添加的Characteristic做类似替换
将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不起作用,继续做如下修改:
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做类似替换。
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: