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
联系方式:[email protected]
技术交流QQ群:127442605
四、动态广播思路
1、按键触发进入按键处理事件simpleBLEPeripheral_HandleKeys。
2、关闭广播。
3、进入SBP_KEY_UPDATE_ADV_EVT事件(自定义),调用GAP_UpdateAdvertisingData修改广播数据。
4、开启广播。
注:

五、实验预期现象
1、板子上电:广播默认的数据
- static uint8 advertData[] =
- {
-
-
-
- 0x02,
- GAP_ADTYPE_FLAGS,
- DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
-
-
-
- 0x03,
- GAP_ADTYPE_16BIT_MORE,
- LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
- HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
-
- };
2、按键按1、2、4、5、7、8次……(非3的倍数次)
- uint8 advertData_Update[] =
- {
- 0x07,
- GAP_ADTYPE_LOCAL_NAME_SHORT,
- 0x47,
- 0x55,
- 0x41,
- 0x3A,
- 0x20,
- 0x00,
-
- 0x03,
- GAP_ADTYPE_16BIT_MORE,
- LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
- HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
- };
第8字节累加。
3、按键按3、6、9次(3的倍数次)
与板子上电时的协议栈默认广播数据一样。
六、代码修改
1、按键功能实现
(参考博文《CC2541之按键》)
2、创建一个“动态广播”事件
1)创建事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中)
- if ( events & SBP_KEY_UPDATE_ADV_EVT )
- {
-
- return (events ^ SBP_KEY_UPDATE_ADV_EVT);
- }
2)添加事件的宏定义(SimpleBLEPeripheral.h中)
- #define SBP_KEY_UPDATE_ADV_EVT 0x0008
3、动态广播的处理代码
1)定义一个变量用于按键计数
- static uint8 key_count = 1;
2)按键处理函数
-
-
-
-
-
-
-
-
-
-
-
-
- static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )
- {
- VOID shift;
-
- 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_KEY_UPDATE_ADV_EVT, 0 );
-
- }
- }
3)SBP_KEY_UPDATE_ADV_EVT事件中的处理
- if ( events & SBP_KEY_UPDATE_ADV_EVT )
- {
- uint8 advertData_Update[] =
- {
- 0x07,
- GAP_ADTYPE_LOCAL_NAME_SHORT,
- 0x47,
- 0x55,
- 0x41,
- 0x3A,
- 0x00,
- 0x00,
-
- 0x03,
- GAP_ADTYPE_16BIT_MORE,
- LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
- HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
- };
-
- advertData_Update[6] = HAL_KEY_SW_6;
- advertData_Update[7] = key_count;
-
- if((key_count++)%3)
- {
- GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,
- TRUE,
- sizeof(advertData_Update),
- advertData_Update );
- }
- else
- {
- GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,
- TRUE,
- sizeof(advertData),
- advertData );
- }
-
- uint8 initial_advertising_enable = TRUE;
- GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
-
- return (events ^ SBP_KEY_UPDATE_ADV_EVT);
- }
注:GAP_UpdateAdvertisingData的第二个形参为TRUE时修改的是广播数据、为FALSE时修改的是扫描应答数据。
这里只以广播数据为例,扫描应答数据的修改也是类似的。
七、实验结果
1、上电广播

这是协议栈默认的广播数据。
2、按键按1下

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

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

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

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