本篇博文最后修改时间:2017年01月06日,11:06。
一、简介
本文以SimpleBLEPeripheral工程为例,介绍如何通过按键触发更新CC2541开发板中扫描应答的设备名。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: Smart RF(主芯片CC2541)
手机平台:小米1S
APP: BLE Device Monitor
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
五、基础知识
暂无
六、实验步骤
1、定义一个“扫描应答更新”事件
1)定义事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中)
if ( events & SBP_UPDATE_SCAN_RSP_DATA_EVT ) //按键更新扫描应答事件
{
return (events ^ SBP_UPDATE_SCAN_RSP_DATA_EVT);
}
2)添加事件的宏定义(SimpleBLEPeripheral.h中)
#define SBP_UPDATE_SCAN_RSP_DATA_EVT 0x0010
2、扫描应答更新的处理代码
1)定义一个变量用于按键计数(SimpleBLEPeripheral.c中)
static uint8 key_count = 1;
2)按键处理函数(SimpleBLEPeripheral.c中)
static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )
{
VOID shift; // Intentionally unreferenced parameter
if ( keys & HAL_KEY_SW_6 )
{
uint8 initial_advertising_enable = FALSE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//关广播
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_UPDATE_SCAN_RSP_DATA_EVT, 0 );//启动扫描应答更新事件
}
}
3)扫描应答更新事件中的处理(SimpleBLEPeripheral.c中)
if ( events & SBP_UPDATE_SCAN_RSP_DATA_EVT ) //按键更新扫描应答事件
{
uint8 scanRspData_Update[] =
{
0x07, //自定义设备名的长度
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
0x47, //G
0x55, //U
0x41, //A
0x3A, //:
0x00, //空格
0x00, //空格
// connection interval range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), // 100ms
HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),
LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), // 1s
HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),
// Tx power level
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL,
0 // 0dBm
};
if((key_count++)%2)//如果按键次数不是2的倍数,则广播我自己的数据
{
GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,
FALSE,
sizeof(scanRspData_Update),
scanRspData_Update ); //更新扫描应答数据
}
else//如果按键次数是2的倍数,则广播协议栈本来的数据
{
GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,
FALSE,
sizeof(scanRspData),
scanRspData); //更新扫描应答数据
}
uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//开广播
return (events ^ SBP_UPDATE_SCAN_RSP_DATA_EVT);
}
注:GAP_UpdateAdvertisingData的第二个形参为TRUE时修改的是广播数据、为FALSE时修改的是扫描应答数据。
七、注意事项
手机可能缓存了之前的代码(在更新过CC2541的代码之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:
方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。
八、实验结果
1、上电时,app扫描到的设备名
3、第2次按键时,app扫描到的设备名
成功通过按键进行动态修改设备名。
因此,实验成功。