【BLE-CC2640】CC2640之使用自定义128bit的UUID
来源:互联网 发布:凯撒大帝 知乎 编辑:程序博客网 时间:2024/06/10 07:15
本篇博文最后修改时间:2016年08月27日,15:04。
一、简介
本文以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
甜甜的大香瓜的小店(淘宝店):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)修改代码1(GUA_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)修改代码2(GUA_Profile.c中)
将
static CONST gattAttrType_t GUAProfile_Service = { ATT_BT_UUID_SIZE, GUAServUUID };改为
static CONST gattAttrType_t GUAProfile_Service = { TI_UUID_SIZE, GUAServUUID };
4)修改代码3(GUA_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)修改代码4(GUA_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)修改代码5(GUA_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)修改代码6(GUA_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)修改香瓜服务中的UUID(GUA_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, 066, 0x77, 0x88, \ 0x99, 0xaa, 0xbb, 0xcc, LO_UINT16( uuid ), HI_UINT16( uuid ), 0xdd, 0xeeUUID在这里是倒叙的,跟注释对比一下即能明白。
七、实验结果
上图可见香瓜服务的128bit的UUID被我修改成功。
因此实验成功。
0 0
- 【BLE-CC2640】CC2640之使用自定义128bit的UUID
- 【BLE-CC2640】CC2640之自定义按键
- 【BLE-CC2640】CC2640之添加自定义服务
- 【BLE-CC2640】CC2640之自定义周期事件
- 【BLE-CC2640】CC2640之LED
- 【BLE-CC2640】CC2640之按键
- 【BLE-CC2640】CC2640之串口
- 【BLE-CC2640】CC2640之RTC
- 【BLE-CC2640】CC2640之OLED
- 【BLE-CC2640】CC2640之bootloader
- 【BLE-CC2640】CC2640之SNV
- BLE-CC2640之添加自定义服务
- [BLE]CC2640之ANCS
- 【BLE-CC2640】CC2640之快速入门
- 【BLE-CC2640】CC2640之配对与绑定
- 【BLE-CC2640】CC2640之修改发射功率
- 【BLE-CC2640】CC2640之广播MAC
- 【BLE-CC2640】CC2640之连接时广播
- java面试题摘录
- 分布式缓存技术redis学习系列(六)—— 深入理解Spring Redis的使用
- 虚拟地址,逻辑地址,线性地址,物理地址有什么区别
- 搭建SpringMVC框架,实现简单登陆功能
- 【Android移动开发技术】Android Studio常用快捷键(Windows&Mac)(自定义快捷键)
- 【BLE-CC2640】CC2640之使用自定义128bit的UUID
- iOS自定义UITabBar
- Python黑帽编程 3.1 ARP欺骗
- Spring in Action(第四章 面向切面编程)学习笔记
- 人工智能
- 小技巧,使用低版本的VS打开高版本的解决方案(使用VS2008打开VS2010的解决方案--同样适用于其他版本)
- .NET Core与.NET Framework、Mono之间的关系
- Android 开发中的日常积累
- AIM Tech Round 3 (Div. 1) C. Centroids(树形dp)