一、简介
本篇以SimpleBLEPeripheral工程为例,介绍如何通过按键触发更新CC2541开发板中扫描应答的设备名。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件: IAR 8.20.2
硬件平台: Smart RF开发板
手机平台:小米1S
APP: BLE Device Monitor
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.net/feilusia
联系方式:[email protected]
CC254x技术交流QQ群:127442605
四、相关文章
本博客《CC2541之动态广播》,该博文更新的是广播中的数据。
本博文更新的是扫描应答中的设备名称。
五、代码修改
1、按键功能实现
(参考博文《CC2541之按键》)
2、创建一个“扫描应答更新”事件
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
3、扫描应答更新的处理代码
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时修改的是扫描应答数据。
六、实验结果
1、上电时,app扫描到的设备名
3、第2次按键时,app扫描到的设备名
因此,通过按键进行动态修改设备名的实验成功。