一、什么是特征值

特征值就是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添加特征值相关推荐

  1. 蓝牙BLEcc2540如何添加特征值

    声明,本文转载自"甜甜的大香瓜"的博客,原文地址如下: http://blog.csdn.net/feilusia/article/details/48314165 一.简介 本篇 ...

  2. 矩阵的特征值、特征向量、特征值分解、奇异值分解之间的关系

    可逆矩阵 A⋅A−1=A−1⋅A=EA\cdot A^{-1}=A^{-1}\cdot A = EA⋅A−1=A−1⋅A=E 矩阵的几何意义是对一组向量进行变换,包括方向和模长的变化.而逆矩阵表示对其 ...

  3. 【机器学习中的数学基础】矩阵特征值、特征向量和特征值分解的几何意义

    [机器学习中的数学基础]矩阵特征值.特征向量和特征值分解的几何意义 在<机器学习>西瓜书中的第十章提到了"多维缩放"(简称MDS)方法,该方法是一种经典的的降维方法.此 ...

  4. 线性代数学习笔记7-1:特征值、特征向量、特征值的虚实性、迹、相似不变量

    特征向量:经历特定线性变换后,只受到伸缩影响的特殊向量 首先注意前提:特征值和特征向量,仅针对方阵讨论,因为非方阵不可能满足定义式 A v ⃗ = λ v ⃗ \mathbf A \vec v=\la ...

  5. android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2

    Android蓝牙4.0 Ble读写数据详解 -2 上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑. 先介绍一款调试工具,专门调试Ble蓝牙的app.名字叫:nRF-Con ...

  6. ble 读写特征值特征值_ap.readBLECharacteristicValue 读取低功耗蓝牙设备特征值中的数据 - 支付宝 Alipay JSSDK 开发文档...

    ap.readBLECharacteristicValue(OPTION, CALLBACK) 读取低功耗蓝牙设备特征值中的数据.调用后在 ap.onBLECharacteristicValueCha ...

  7. 线代[5]|特征值与特征向量、特征值的几何重数与代数重数

    原创首发,转载请注明出处(CSDN:古希腊的汉密士),谢谢! 文章目录 前言 特征向量与特征值 |概念阐明 |数域K上n维线性空间V内线性变换A的特征值和特征向量的计算步骤 ||例题 |代数的层面-- ...

  8. 严格对角占优矩阵特征值_二次型和特征值

    前言:以下内容不是严格的数学表述, 以自己理解的思路形式叙述. 二次型: 这个名词是来自于线性代数, 多用于二次规划和优化组合等问题. 在线性代数里形如以下函数表达式称为二次型:(A是对称矩阵) 这里 ...

  9. matlab编程 利用生成一个10阶魔方矩阵,求矩阵的特征值、特征向量,对于特征值,请按照降序进行排列,对应的特征向量进行同样的排序。...

    您可以使用 Matlab 中的 eig 函数来计算矩阵的特征值和特征向量.例如,假设您要求解的矩阵为 A,则可以使用以下代码求解: [V,D] = eig(A);

最新文章

  1. 组件 -——SUl Mobile
  2. python输入一组数据、进行简单的统计_《利用Python进行数据分析》学习笔记——第二章(3)...
  3. flashfxp连mysql_FlashFXP 命令行参数
  4. CENTOS编译安装APACHE 2.4.6笔记
  5. 促进新一代人工智能产业发展三年行动计划_工信部新一代人工智能产业创新重点揭榜任务——中国联通智能化网络基础设施及开放平台启动会成功召开...
  6. python判断是否为完全数_Python识别完美数
  7. (C/C++) Link List - C++ 版本
  8. 顺序链表,动态数组实现
  9. radius服务器认证系统,TekRadius(RADIUS服务器)
  10. 服务器SSH 22端口关闭
  11. turtle绘制奥运五环
  12. HTML表格边框空隙
  13. 转载至:http://blog.csdn.net/antony9118/article/details/51425581
  14. 去除Multiple markers at this line - advised by提示
  15. 安防IT化如何把握其中的共性与个性
  16. 如何把自媒体平台文章同步到WordPress等网站
  17. 移动端微信里打开H5页面,页面字体放大
  18. 考研英语 - word-list-19
  19. 如何用java给PDF添加一个图片水印?
  20. DirectUI界面编程(零)简介

热门文章

  1. PS动作把人物照片变成炭笔素描画效果
  2. 谷歌pay服务端文档_google支付后台验证操作流程
  3. allegro如何删除没有网络的走线,查还没有连的网络线
  4. 射频测试系统|射频信号测试软件NSAT-1000
  5. 机器人学笔记之——空间描述和变换:算子
  6. Go: panic / recover 简介与实践
  7. 准大四生,现在是七月中旬,要为秋招准备什么?
  8. 转化为五分制的c语言程序,用C语言把百分制转化为五分制
  9. 计算机网络安全技术保护措施,计算机网络安全技术保护措施
  10. lumen php命令,lumen添加artisan 命令方法