CC2541通过按键触发广播数据的变化(动态广播)教程
一、简介 本篇以SimpleBLEPeripheral为例,CC2541通过按键触发广播数据的变化,实现按一次按键改变一次广播数据。
二、实验平台 协议栈版本:BLE-CC254x-1.3.2 编译软件:IAR 8.20.2 硬件平台:smart RF开发板
三、动态广播思路 1、按键触发进入按键处理事件simpleBLEPeripheral_HandleKeys。 2、关闭广播。 3、进入SBP_KEY_UPDATE_ADV_EVT事件(自定义),调用GAP_UpdateAdvertisingData修改广播数据。 4、开启广播。
注:
四、实验预期现象 1、板子上电:广播默认的数据
[cpp] view plain copy
- static uint8 advertData[] =
- {
- // Flags; this sets the device to use limited discoverable
- // mode (advertises for 30 seconds at a time) instead of general
- // discoverable mode (advertises indefinitely)
- 0x02, // length of this data
- GAP_ADTYPE_FLAGS,
- DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
-
- // service UUID, to notify central devices what services are included
- // in this peripheral
- 0x03, // length of this data
- GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
- LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
- HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
-
- };
2、按键按1、2、4、5、7、8次……(非3的倍数次)
[cpp] view plain copy
- uint8 advertData_Update[] =
- {
- 0x07, //自定义短名的长度
- GAP_ADTYPE_LOCAL_NAME_SHORT,
- 0x47, //G
- 0x55, //U
- 0x41, //A
- 0x3A, //:
- 0x20, //键值
- 0x00, //给按键次数预留
-
- 0x03, //UUID字段长度
- GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
- LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
- HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
- };
第8字节累加。
3、按键按3、6、9次(3的倍数次)
与板子上电时的协议栈默认广播数据一样。
五、代码修改 1、按键功能实现 (参考博文《CC2541之按键》)
2、创建一个“动态广播”事件 1)创建事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中)
[cpp] view plain copy
- if ( events & SBP_KEY_UPDATE_ADV_EVT ) //按键更新广播事件
- {
-
- return (events ^ SBP_KEY_UPDATE_ADV_EVT);
- }
2)添加事件的宏定义(SimpleBLEPeripheral.h中)
[cpp] view plain copy
- #define SBP_KEY_UPDATE_ADV_EVT 0x0008
3、动态广播的处理代码
1)定义一个变量用于按键计数
[cpp] view plain copy
- static uint8 key_count = 1;
2)按键处理函数
[cpp] view plain copy
- /*********************************************************************
- * @fn simpleBLEPeripheral_HandleKeys
- *
- * @brief Handles all key events for this device.
- *
- * @param shift - true if in shift/alt.
- * @param keys - bit field for key events. Valid entries:
- * HAL_KEY_SW_2
- * HAL_KEY_SW_1
- *
- * @Return none
- */
- 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_KEY_UPDATE_ADV_EVT, 0 );//修改广播数据
-
- }
- }
3)SBP_KEY_UPDATE_ADV_EVT事件中的处理
[cpp] view plain copy
- if ( events & SBP_KEY_UPDATE_ADV_EVT ) //按键更新广播事件
- {
- uint8 advertData_Update[] =
- {
- 0x07, //自定义短名的长度
- GAP_ADTYPE_LOCAL_NAME_SHORT,
- 0x47, //G
- 0x55, //U
- 0x41, //A
- 0x3A, //:
- 0x00, //给键值预留
- 0x00, //给按键次数预留
-
- 0x03, //UUID字段长度
- GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
- 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)//如果按键次数不是3的倍数,则广播我自己的数据
- {
- GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,
- TRUE,
- sizeof(advertData_Update),
- advertData_Update ); //更新广播数据
- }
- else//如果按键次数是5的倍数,则广播协议栈本来的数据
- {
- 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次按键。
|