ble 读写特征值特征值_BLE添加特征值
一、什么是特征值
特征值就是BLE协议栈向外提供的一个数据接口,蓝牙之间的数据传输终落实在特征值上。在BLE协议栈的GATT层中封装了若干服务(service),而在每一个服务中又有若干特征值(characters),特征值可以是任意类型的数据。蓝牙之间的数据传输靠协议栈提供的write和read函数,而这两个函数就是在操作特征值
二、UUID
UUID就是通用唯一识别码。在蓝牙协议栈中可能会有多个服务,每个服务会有多个特征值,而这些服务或者特征值都有一个唯一的ID,这样就可以区分了。这个UUID是其他设备设置蓝牙服务和特征值的唯一方法。
三、增加特征值
在BLE协议栈中,GATT层定义了特征值和服务。下面就以SimpleBLEPeripheral为例,增加一个特征值。在simpleGATTprofile.c中,已经有定义好的特征值,参考已有的特征值就可以顺利添加自己的特征值
1)修改头文件simpleGATTprofile.h
头文件中定义了特征值的UUID,以及长度和默认值
//特征值UUID
#define SIMPLEPROFILE_CHAR5_UUID 0xFFF5
//特征值长度
#define SIMPLEPROFILE_CHAR5_LEN 5
2)添加特征值相关变量
包括特征值的读写权限、变量名、展现给用户的名字
//特征值初始化
// 特征值属性,读或者写
static uint8 simpleProfileChar6Props = GATT_PROP_READ | GATT_PROP_WRITE;
// 值,可以向其写入数据,也可以读出数据。这里是一个字符数组
static uint8 simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = {0};
// 用户描述,展现给用户的名字
static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6\0";
//提取uuid,uuid定义在头文件中
CONST uint8 simpleProfilechar5UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID)
};
3)将特征值加入属性表
特征值由服务统一管理,所有的特征值都会在一个服务的属性表中呈现出来,每增加一个特征值,它的相关变量就要在添加到属性表中
//特征值初始化
static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] =
{
// Simple Profile Service
{
{ ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */
GATT_PERMIT_READ, /* permissions */
0, /* handle */
(uint8 *)&simpleProfileService /* pValue */
},
// Characteristic 1 Declaration
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar1Props
},
// Characteristic Value 1
{
{ ATT_BT_UUID_SIZE, simpleProfilechar1UUID },
GATT_PERMIT_AUTHEN_READ | GATT_PERMIT_AUTHEN_WRITE,
0,
&simpleProfileChar1
},
// Characteristic 1 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar1UserDesp
},
。。。。。
// Characteristic 5 Declaration
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar5Props
},
// Characteristic Value 5
{
{ ATT_BT_UUID_SIZE, simpleProfilechar5UUID },
GATT_PERMIT_AUTHEN_READ| GATT_PERMIT_AUTHEN_WRITE,
0,
simpleProfileChar5
},
// Characteristic 5 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar5UserDesp
},
4)修改属性表的长度
每增加一个特征值,属性表的长度也会增加,因此要修改属性表的长度。在文件的一开始就声明了属性表的长度
#define SERVAPP_NUM_ATTR_SUPPORTED 24
5)修改SimpleProfile_SetParamete和SimpleProfile_GetParamete函数
这是操作特征值的两个函数,set函数可以用来初始化特征值,get函数可以用来提取特征值。一般我们定义的特征值都是uint8类型的数组,因此无论set还是get,都可以使用copy函数来完成,同时要注意实际的长度
bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )
{
bStatus_t ret = SUCCESS;
switch ( param )
{
。。。。。。。
case SIMPLEPROFILE_CHAR5:
if ( len <= SIMPLEPROFILE_CHAR5_LEN )
{
//将value值复制到特征值5,同时注意长度
VOID osal_memcpy( simpleProfileChar5, value, len );
}
else
{
ret = bleInvalidRange;
}
break;
default:
ret = INVALIDPARAMETER;
break;
}
return ( ret );
}
bStatus_t SimpleProfile_GetParameter( uint8 param, void *value )
{
bStatus_t ret = SUCCESS;
switch ( param )
{
。。。。。。
case SIMPLEPROFILE_CHAR5:
//将特征值5复制到value
VOID osal_memcpy( value, simpleProfileChar5, osal_strlen(simpleProfileChar5));
break;
default:
ret = INVALIDPARAMETER;
break;
}
return ( ret );
}
6)修改simpleProfile_ReadAttrCB和simpleProfile_WriteAttrCB函数
上面已经有了set和get函数,可以实现对特征值的读写,那么这里为何又来了一对read和write呢???set和get是用来本地读写特征值的,而read和write则是网络上的读写。什么意思呢,当蓝牙网络的另一端想要读取特征值的时候,协议栈就会自动回调这个read函数,然后将读取的结果传输的网络的另一端。当然,写操作也是一样的。
static uint8 simpleProfile_ReadAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
uint8 *pValue, uint8 *pLen, uint16 offset, uint8 maxLen )
{
bStatus_t status = SUCCESS;
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 SIMPLEPROFILE_CHAR5_UUID:
*pLen = osal_strlen(pAttr->pValue);
VOID osal_memcpy( pValue, pAttr->pValue, osal_strlen(pAttr->pValue) );
break;
default:
// Should never get here! (characteristics 3 and 4 do not have read permissions)
*pLen = 0;
status = ATT_ERR_ATTR_NOT_FOUND;
break;
}
}
return ( status );
}
static bStatus_t simpleProfile_WriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
uint8 *pValue, uint8 len, uint16 offset )
{
bStatus_t status = SUCCESS;
uint8 notifyApp = 0xFF;
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 SIMPLEPROFILE_CHAR5_UUID:
//Validate the value 检测输入数据是否合法
// Make sure it's not a blob oper
if ( offset == 0 ) //是第一字节
{
if ( len >= SIMPLEPROFILE_CHAR6_LEN )
{
status = ATT_ERR_INVALID_VALUE_SIZE;
} //若输入长度不对,status为
}
else
{
status = ATT_ERR_ATTR_NOT_LONG;//不是第一字节
}
if ( status == SUCCESS )
{
//清空缓冲区
osal_memset(pAttr->pValue, '\0', SIMPLEPROFILE_CHAR6_LEN) ;
//复制
VOID osal_memcpy( pAttr->pValue, pValue, len);
notifyApp = SIMPLEPROFILE_CHAR6;
}
break;
default:
// Should never get here! (characteristics 2 and 4 do not have write permissions)
status = ATT_ERR_ATTR_NOT_FOUND;
break;
}
}
7)修改simpleBLEPeripheral.c
A、在SimpleBLEPeripheral_Init函数中可以使用set方法对特征值做初始化操作
SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR5, 5, charValue5 );
B、修改simpleProfileChangeCB
当特征值被网络的另一端修改之后,协议栈会回调这个函数,通知当前特征值发生变化
static void simpleProfileChangeCB( uint8 paramID )
{
uint8 newValue;
uint8 *val;
switch( paramID )
{
。。。。。。
case SIMPLEPROFILE_CHAR5:
val = osal_msg_allocate(15);
//提取特征值,注意这里使用的是get方式
SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR5, val );
break;
default:
// should not reach here!
break;
}
SerialPrint(val);
}
四、测试
如何验证特征值已经被成功的添加呢,基于上面的例子,我们需要一个BLE主机设备来读取特征值。建议使用手机来完成测试,因为你很难确保你的主机代码是正确的。从网络上下载BLE调试软件,可以轻松的操作特征值。
ble 读写特征值特征值_BLE添加特征值相关推荐
- 蓝牙BLEcc2540如何添加特征值
声明,本文转载自"甜甜的大香瓜"的博客,原文地址如下: http://blog.csdn.net/feilusia/article/details/48314165 一.简介 本篇 ...
- 矩阵的特征值、特征向量、特征值分解、奇异值分解之间的关系
可逆矩阵 A⋅A−1=A−1⋅A=EA\cdot A^{-1}=A^{-1}\cdot A = EA⋅A−1=A−1⋅A=E 矩阵的几何意义是对一组向量进行变换,包括方向和模长的变化.而逆矩阵表示对其 ...
- 【机器学习中的数学基础】矩阵特征值、特征向量和特征值分解的几何意义
[机器学习中的数学基础]矩阵特征值.特征向量和特征值分解的几何意义 在<机器学习>西瓜书中的第十章提到了"多维缩放"(简称MDS)方法,该方法是一种经典的的降维方法.此 ...
- 线性代数学习笔记7-1:特征值、特征向量、特征值的虚实性、迹、相似不变量
特征向量:经历特定线性变换后,只受到伸缩影响的特殊向量 首先注意前提:特征值和特征向量,仅针对方阵讨论,因为非方阵不可能满足定义式 A v ⃗ = λ v ⃗ \mathbf A \vec v=\la ...
- android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2
Android蓝牙4.0 Ble读写数据详解 -2 上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑. 先介绍一款调试工具,专门调试Ble蓝牙的app.名字叫:nRF-Con ...
- ble 读写特征值特征值_ap.readBLECharacteristicValue 读取低功耗蓝牙设备特征值中的数据 - 支付宝 Alipay JSSDK 开发文档...
ap.readBLECharacteristicValue(OPTION, CALLBACK) 读取低功耗蓝牙设备特征值中的数据.调用后在 ap.onBLECharacteristicValueCha ...
- 线代[5]|特征值与特征向量、特征值的几何重数与代数重数
原创首发,转载请注明出处(CSDN:古希腊的汉密士),谢谢! 文章目录 前言 特征向量与特征值 |概念阐明 |数域K上n维线性空间V内线性变换A的特征值和特征向量的计算步骤 ||例题 |代数的层面-- ...
- 严格对角占优矩阵特征值_二次型和特征值
前言:以下内容不是严格的数学表述, 以自己理解的思路形式叙述. 二次型: 这个名词是来自于线性代数, 多用于二次规划和优化组合等问题. 在线性代数里形如以下函数表达式称为二次型:(A是对称矩阵) 这里 ...
- matlab编程 利用生成一个10阶魔方矩阵,求矩阵的特征值、特征向量,对于特征值,请按照降序进行排列,对应的特征向量进行同样的排序。...
您可以使用 Matlab 中的 eig 函数来计算矩阵的特征值和特征向量.例如,假设您要求解的矩阵为 A,则可以使用以下代码求解: [V,D] = eig(A);
最新文章
- 组件 -——SUl Mobile
- python输入一组数据、进行简单的统计_《利用Python进行数据分析》学习笔记——第二章(3)...
- flashfxp连mysql_FlashFXP 命令行参数
- CENTOS编译安装APACHE 2.4.6笔记
- 促进新一代人工智能产业发展三年行动计划_工信部新一代人工智能产业创新重点揭榜任务——中国联通智能化网络基础设施及开放平台启动会成功召开...
- python判断是否为完全数_Python识别完美数
- (C/C++) Link List - C++ 版本
- 顺序链表,动态数组实现
- radius服务器认证系统,TekRadius(RADIUS服务器)
- 服务器SSH 22端口关闭
- turtle绘制奥运五环
- HTML表格边框空隙
- 转载至:http://blog.csdn.net/antony9118/article/details/51425581
- 去除Multiple markers at this line - advised by提示
- 安防IT化如何把握其中的共性与个性
- 如何把自媒体平台文章同步到WordPress等网站
- 移动端微信里打开H5页面,页面字体放大
- 考研英语 - word-list-19
- 如何用java给PDF添加一个图片水印?
- DirectUI界面编程(零)简介