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工程中,将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三、具体步骤
1. 在simpleGATTprofile.h添加自定义的128 bit UUID的base
#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.c中advertData中增加条件编译(如果,此广播的service用的是TI的16bitUUID,则不需要修改,我实际项目不修改此部分)
例如:#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中)
将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
关于ATTRTBL_CHAR4_CCC_IDX的定义实际是属性表的特征值char4的config项的偏移位置,我的代码属性表中这项位置为12,
所以定义为
#define ATTRTBL_CHAR4_CCC_IDX 12//Ccc ADD
8.最后修改工程的option,宏定义支持128bit UUID
9.REBUILD ALL,结果OK,所有特征值,读写notify正常
- TI CC2541 使用自定义的128bit UUID
- 【BLE-CC2640】CC2640之使用自定义128bit的UUID
- 【BLE】CC2541 低功耗蓝牙16bit的UUID与128bit的UUID有什么区别
- CC2541 128bit UUID 官方教程有错修改方法!
- 【BLE】CC2541 imageA GATT添加自定义UUID实例
- 使用Mac OS X的Terminal.app,用uuidgen命令生成一个128bit的UUID
- TI CC2541 OAD流程
- TI BLE CC2541 Notification
- UUID 16bit和128bit切换
- 蓝牙4.0 128bit UUID
- TI CC2541.h的头文件 for IAR
- 读书笔记-TI的cc2541蓝牙芯片程序学习记录
- TI BLE CC2541 关于Notification的设置及应用
- TI BLE CC2541 关于Notification的设置及应用
- 关于TI CC2541和Nordic NRF51822的AES ECB加密
- TI cc2541协议栈开发环境的搭建
- TI CC2541 配对与绑定
- TI BLE 1.4.1 协议栈 定义128位UUID的方法
- Google 的开源技术protobuf 简介与例子
- ios学习笔记
- Android studio 设置背景颜色,护眼色
- 关于tap事件与tableView的点击冲突
- ToolStrip和ToolStripButton的用法
- TI CC2541 使用自定义的128bit UUID
- Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释
- killall与killall-9
- caffe测试已经训练好的模型的迭代次数修改
- 九大基础排序总结与对比
- 第十二章
- Navicat client 安装失败
- PHP开发小技巧①—实现时间日期友好显示
- TagSupport与BodyTagSupport的区别