当前位置:   article > 正文

<蓝牙BLE>cc2540修改动态广播_修改蓝牙广播一定要先关闭广播吗

修改蓝牙广播一定要先关闭广播吗

cc2540作为从机在发广播时,可以对不同的广播数据进行切换,以便于能发出一些我们自定义的广播信息。大致过程如下:

一、当事件发生时,先关闭当前的广播

二、对要广播的信息进行修改

三、广播修改后的信息

具体实现如下:

1、在SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中创建事件(自定义广播数据、开启广播等)



502~521是自定义的广播信息;523~526是切换到修改后的广播;528和529是开启修改后的广播。

2、在SimpleBLEPeripheral.h中添加事件的宏定义


3、在周期任务中处理广播。


先让广播停下,然后再进入我们刚才写的那个广播更新的函数去修改广播并且开启。这样就实现了在第几秒的时候切换广播。。以下是抓包结果


在第5秒的时候,确实切换到我自定义的广播了。至于第几秒这是可以修改的。

也可通过外部按键来切换广播,我转一个大香瓜写的按键切换吧。

一、简介

本篇以SimpleBLEPeripheral为例,通过按键触发广播数据的变化,实现按一次按键改变一次广播数据。


二、实验平台

协议栈版本:BLE-CC254x-1.3.2

编译软件:IAR 8.20.2

硬件平台:smart RF开发板


三、版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.net/feilusia

联系方式:897503845@qq.com

技术交流QQ群:127442605


四、动态广播思路

1、按键触发进入按键处理事件simpleBLEPeripheral_HandleKeys。

2、关闭广播。

3、进入SBP_KEY_UPDATE_ADV_EVT事件(自定义),调用GAP_UpdateAdvertisingData修改广播数据。

4、开启广播。


注:



五、实验预期现象

1、板子上电:广播默认的数据

[cpp]  view plain copy
  1. static uint8 advertData[] =  
  2. {  
  3.   // Flags; this sets the device to use limited discoverable  
  4.   // mode (advertises for 30 seconds at a time) instead of general  
  5.   // discoverable mode (advertises indefinitely)  
  6.   0x02,   // length of this data  
  7.   GAP_ADTYPE_FLAGS,  
  8.   DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,  
  9.   
  10.   // service UUID, to notify central devices what services are included  
  11.   // in this peripheral  
  12.   0x03,   // length of this data  
  13.   GAP_ADTYPE_16BIT_MORE,      // some of the UUID's, but not all  
  14.   LO_UINT16( SIMPLEPROFILE_SERV_UUID ),  
  15.   HI_UINT16( SIMPLEPROFILE_SERV_UUID ),  
  16.   
  17. };  


2、按键按1、2、4、5、7、8次……(非3的倍数次)

[cpp]  view plain copy
  1. uint8 advertData_Update[] =  
  2. {  
  3.   0x07,     //自定义短名的长度  
  4.   GAP_ADTYPE_LOCAL_NAME_SHORT,  
  5.   0x47,     //G  
  6.   0x55,     //U  
  7.   0x41,     //A  
  8.   0x3A,     //:  
  9.   0x20,     //键值  
  10.   0x00,     //给按键次数预留  
  11.     
  12.   0x03,     //UUID字段长度  
  13.   GAP_ADTYPE_16BIT_MORE,      // some of the UUID's, but not all  
  14.   LO_UINT16( SIMPLEPROFILE_SERV_UUID ),  
  15.   HI_UINT16( SIMPLEPROFILE_SERV_UUID ),  
  16. };  

第8字节累加。


3、按键按3、6、9次(3的倍数次)

与板子上电时的协议栈默认广播数据一样。


六、代码修改

1、按键功能实现

(参考博文《CC2541之按键》)


2、创建一个“动态广播”事件

1)创建事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中)

[cpp]  view plain copy
  1. if ( events & SBP_KEY_UPDATE_ADV_EVT )        //按键更新广播事件  
  2. {  
  3.   
  4.   return (events ^ SBP_KEY_UPDATE_ADV_EVT);  
  5. }  


2)添加事件的宏定义(SimpleBLEPeripheral.h中)

[cpp]  view plain copy
  1. #define SBP_KEY_UPDATE_ADV_EVT                            0x0008  

3、动态广播的处理代码

1)定义一个变量用于按键计数

[cpp]  view plain copy
  1. static uint8 key_count = 1;  


2)按键处理函数

[cpp]  view plain copy
  1. /********************************************************************* 
  2.  * @fn      simpleBLEPeripheral_HandleKeys 
  3.  * 
  4.  * @brief   Handles all key events for this device. 
  5.  * 
  6.  * @param   shift - true if in shift/alt. 
  7.  * @param   keys - bit field for key events. Valid entries: 
  8.  *                 HAL_KEY_SW_2 
  9.  *                 HAL_KEY_SW_1 
  10.  * 
  11.  * @return  none 
  12.  */  
  13. static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )  
  14. {  
  15.   VOID shift;  // Intentionally unreferenced parameter  
  16.   
  17.   if ( keys & HAL_KEY_SW_6 )  
  18.   {  
  19.     uint8 initial_advertising_enable = FALSE;  
  20.     GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//关广播  
  21.       
  22.     osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_KEY_UPDATE_ADV_EVT, 0 );//修改广播数据       
  23.   
  24.   }  
  25. }  


3)SBP_KEY_UPDATE_ADV_EVT事件中的处理

[cpp]  view plain copy
  1. if ( events & SBP_KEY_UPDATE_ADV_EVT )        //按键更新广播事件  
  2. {  
  3.   uint8 advertData_Update[] =  
  4.   {  
  5.     0x07,     //自定义短名的长度  
  6.     GAP_ADTYPE_LOCAL_NAME_SHORT,  
  7.     0x47,     //G  
  8.     0x55,     //U  
  9.     0x41,     //A  
  10.     0x3A,     //:  
  11.     0x00,     //给键值预留  
  12.     0x00,     //给按键次数预留  
  13.       
  14.     0x03,     //UUID字段长度  
  15.     GAP_ADTYPE_16BIT_MORE,      // some of the UUID's, but not all  
  16.     LO_UINT16( SIMPLEPROFILE_SERV_UUID ),  
  17.     HI_UINT16( SIMPLEPROFILE_SERV_UUID ),  
  18.   };  
  19.     
  20.   advertData_Update[6] = HAL_KEY_SW_6;        //把按键值放到广播数据中  
  21.   advertData_Update[7] = key_count;        //把按键值放到广播数据中  
  22.     
  23.   if((key_count++)%3)//如果按键次数不是3的倍数,则广播我自己的数据  
  24.   {  
  25.     GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,   
  26.                               TRUE,  
  27.                               sizeof(advertData_Update),  
  28.                               advertData_Update );      //更新广播数据    
  29.   }  
  30.   else//如果按键次数是5的倍数,则广播协议栈本来的数据  
  31.   {  
  32.     GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,   
  33.                               TRUE,  
  34.                               sizeof(advertData),  
  35.                               advertData );      //更新广播数据         
  36.   }  
  37.   
  38.   uint8 initial_advertising_enable = TRUE;  
  39.   GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );//开广播  
  40.     
  41.   return (events ^ SBP_KEY_UPDATE_ADV_EVT);  
  42. }  

注:GAP_UpdateAdvertisingData的第二个形参为TRUE时修改的是广播数据、为FALSE时修改的是扫描应答数据。

这里只以广播数据为例,扫描应答数据的修改也是类似的。


七、实验结果

1、上电广播

这是协议栈默认的广播数据。


2、按键按1下


可以看到广播数据变了,并且第8个数据是当前的按键次数1。


3、按键按2下


第8个字节的按键次数由1变成了2。


4、按键按3次


按键次数为3的倍数,所以修改回协议栈默认的广播数据。


5、按键按4次


非3的倍数次按键,都会是我自己定义的数据。此时第8字节是4次按键。



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/933240
推荐阅读
相关标签
  

闽ICP备14008679号