安信可TB系列模组AT指令及SDK二次开发方式实现自定义蓝牙通讯UUID笔记

本文介绍了UUID的基础知识,详细阐述了如何通过AT指令和SDK来自定义修改BLE设备的UUID。在AT指令部分,展示了查询与设置服务及特征UUID的指令;在SDK开发部分,解析了attribute_t结构体并提供了添加自定义UUID的代码示例。通过这些方法,开发者可以更好地定制自己的BLE服务和特性。
摘要由CSDN通过智能技术生成

一、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,见如下指令集表:

功能指令响应参数说明
查询服务UUIDAT+BLESERUUID?+BLESERUUID:55E405D2AF9FA98FE54A7DFE43535355 OK
设置服务UUIDAT+BLESERUUID=uuidOKuuid:(16进制格式,共16字节)的数字)
查询特征写UUIDAT+BLETXUUID?+BLETXUUID:B39B7234BEECD4A8F443418843535349 OK
设置特征写UUIDAT+BLETXUUID=uuidOKuuid:(16进制格式,共16字节)的数字)
查询特征读UUIDAT+BLERXUUID?+BLERXUUID:16962447C62361BAD94B4D1E43535349 OK
设置特征读UUIDAT+BLERXUUID=uuidOKuuid:(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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值