【BLE】CC2541之动态更新设备名

本篇博文最后修改时间: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

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
1)《CC2541之动态广播》:http://blog.csdn.net/feilusia/article/details/48783259

2、在进行本文步骤前,请先 实现以下博文:
1)《CC2541之按键》:http://blog.csdn.net/feilusia/article/details/47336473


五、基础知识

暂无


六、实验步骤

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扫描到的设备名



2、第1次按键时,app扫描到的设备名


3、第2次按键时,app扫描到的设备名



成功通过按键进行动态修改设备名。

因此,实验成功。












评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值