一、UUID基础知识
BLE通用属性(GATT)协议规定了服务端和客户端这两种角色,GATT服务端是提供数据,GATT客户端是通过访问GATT服务端获得数据。
GATT服务端通过属性表格来组织数据,其数据被用来真正发送,所以BLE通用属性(GATT)协议层是真正传输数据所在的层。
凡是通过GATT服务传输的数据,都会映射成一系列的特性,可以把特性中的数据看成单个单个独立捆绑的数据,而每个特性就作为包括自身而独立的数据点。每个特性都至少要包含用于声明和用于存放特性的值的两个属性。
特性中的属性通常定义为属性值和描述符,其描述符为人类提供可识别的特性描述的实例。
GATT属性表里的属性通常包含句柄、UUID、值。
UUID包含GATT属性表中的数据类型信息,它是理解属性表中的值的每一个字节的意义的关键信息。当然,在一个GATT属性表中有很多属性,但是这些属性的UUID有可能相同。UUID是全球唯一的128位的号码,它用来识别不同的特性。
二、基于AT指令开发自定义修改UUID
出厂的AT 0.8.0版本及以上版本固件支持修改蓝牙串口服务的UUID,见如下指令集表:
功能 | 指令 | 响应 | 参数说明 |
---|---|---|---|
查询服务UUID | AT+BLESERUUID? | +BLESERUUID:55E405D2AF9FA98FE54A7DFE43535355 OK | |
设置服务UUID | AT+BLESERUUID=uuid | OK | uuid:(16进制格式,共16字节)的数字) |
查询特征写UUID | AT+BLETXUUID? | +BLETXUUID:B39B7234BEECD4A8F443418843535349 OK | |
设置特征写UUID | AT+BLETXUUID=uuid | OK | uuid:(16进制格式,共16字节)的数字) |
查询特征读UUID | AT+BLERXUUID? | +BLERXUUID:16962447C62361BAD94B4D1E43535349 OK | |
设置特征读UUID | AT+BLERXUUID=uuid | OK | uuid:(16进制格式,共16字节)的数字) |
准备一个TB-01/02/03F/04蓝牙模组,通过串口助手或MCU向蓝牙模组发送如下AT指令,
AT+BLEMODE=0 //设置从机模式
AT+BLESERUUID=AA0102030405060708090A0C0D0E0F11 //设置服务UUID
AT+BLETXUUID=BB0102030405060708090A0C0D0E0F11 //设置特征写UUID
AT+BLERXUUID=CC0102030405060708090A0C0D0E0F11 //设置特征读UUID
AT+RST //重启
打开手机BLE调试助手APP,连接后可以看到设置效果如下图:
三、基于SDK开发自定义修改UUID
上述是AT指令实现自定义修改UUID,这部分介绍如何在SKD开发中实现添加自定义的UUID。因为UUID总是放在gatt属性表里的,所以我们首先了解一下sdk的协议栈stack\ble\attr\att.h文件中attribute_t这个属性表结构体各参数的含义:
typedef struct attribute
{
u16 attNum; //有效的Attribute数目,指定当前的service由哪几个Attribute构成
u8 perm; //指定当前Attribute被Client访问的权限,有只读权限ATT_PERMISSIONS_READ、只写权限ATT_PERMISSIONS_WRITE、读写权限ATT_PERMISSIONS_RDWR
u8 uuidLen; //2字节和16字节的uuid长度
u32 attrLen; //4 bytes aligned 属性长度
u8* uuid; //uuid
u8* pAttrValue; //属性值
att_readwrite_callback_t w; //写数据回调函数
att_readwrite_callback_t r; //读数据回调函数
}attribute_t;
然后我们可以在app_att.c这个文件里自定义添加UUID宏定义,主要部分代码如下:
...
static const u16 clientCharacterCfgUUID = GATT_UUID_CLIENT_CHAR_CFG;//0x2902 特征的描述UUID,用来定义通知和暗示,通过设置可以能够让设备发送通知,并且被主机端接收到。
static const u16 my_primaryServiceUUID = GATT_UUID_PRIMARY_SERVICE; //0x2800 服务类型UUID
static const u16 userdesc_UUID = GATT_UUID_CHAR_USER_DESC;//0x2901 用户描述符UUID,用于给出该特征值的文字描述。
static const u16 my_characterUUID = GATT_UUID_CHARACTER;//0x2803 特性声明UUID
#define MY_DEV_NAME "Ai-Thinker"
...
#define USER_SPP_MYUUID {0xAA,0x01, 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x11} //ble串口服务自定义UUID
#define USER_SPP_MYUUID_TX 0xBB,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x11 //ble串口特征写自定义UUID
#define USER_SPP_MYUUID_RX 0xCC,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x11
//ble串口特征读自定义UUID
u8 TelinkSppServiceUUID[16] = USER_SPP_MYUUID;
u8 TelinkSppDataServer2ClientUUID[16] = {USER_SPP_MYUUID_TX};
u8 TelinkSppDataClient2ServerUUID[16] = {USER_SPP_MYUUID_RX};
static u8 SppDataServer2ClientDataCCC[2] = {0};
static u8 SppData_1[1] = {0};
Telink spp attribute values
static const u8 TelinkSppData_1[19] = {
CHAR_PROP_READ | CHAR_PROP_WRITE_WITHOUT_RSP | CHAR_PROP_NOTIFY,
U16_LO(SPP_SERVER_TO_CLIENT_DP_H),
U16_HI(SPP_SERVER_TO_CLIENT_DP_H),
USER_SPP_MYUUID_TX
};
/*接收数据函数*/
int module_onReceiveData(rf_packet_att_write_t *p)
{
u8 len = p->l2capLen - 3;//有效数据长度
printf("len:%d,data:%s\r\n", len,(char*)&p->value);//打印接收的数据
return 0;
}
然后我们在my_Attributes属性表里添加,主要部分代码如下:
attribute_t my_Attributes[] = {
...
// MY SPP SERVER
{5,ATT_PERMISSIONS_READ,2,16,(u8*)(&my_primaryServiceUUID), (u8*)(&TelinkSppServiceUUID), 0},
{0,ATT_PERMISSIONS_READ,2,sizeof(TelinkSppData_1),(u8*)(&my_characterUUID), (u8*)(TelinkSppData_1), 0}, //prop
{0,ATT_PERMISSIONS_RDWR,16,sizeof(SppData_1),(u8*)(&TelinkSppDataServer2ClientUUID), (u8*)(SppData_1), (att_readwrite_callback_t)&module_onReceiveData}, //value
{0,ATT_PERMISSIONS_RDWR,2,2,(u8*)&clientCharacterCfgUUID,(u8*)(&SppDataServer2ClientDataCCC)},
{0,ATT_PERMISSIONS_READ,2,sizeof(Telink_Descriptor_1),(u8*)&userdesc_UUID,(u8*)(&Telink_Descriptor_1)},
...
};
void my_att_init (void)
{
bls_att_setAttributeTable ((u8 *)my_Attributes);
u8 device_name[] = MY_DEV_NAME;
bls_att_setDeviceName(device_name, sizeof(MY_DEV_NAME));
}
这里我们只用到USER_SPP_MYUUID_TX这一个特征UUID,在同一个UUID进行收发数据,所以打开手机BLE调试助手APP,连接后可以看到设置效果(大小端)显示如下图:
联系我们
以上就是本期分享的内容,目的在于让大家快速适应新品方案的开发,以上提供的驱动源码联系我们可以免费提供
官方官网:https://www.ai-thinker.com
开发资料:https://docs.ai-thinker.com/
官方论坛:http://bbs.ai-thinker.com
商务合作:sales@aithinker.com
技术支持:support@aithinker.com
公司地址: 深圳市宝安区西乡固戍华丰智慧创新港C栋410
联系电话:0755-29162996