一、简介 本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值。
二、实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8.20.2 硬件平台:Smart RF开发板(主芯片CC2541)、USB Dongle 四、实验前提 1、在进行本文步骤前,请先阅读以下博文:
1)《CC2541之动态广播》:http://blog.csdn.net/feilusia/article/details/48783259
2、在进行本文步骤前,请先实现以下博文:
1)《CC2541之数据加密与解密(利用MAC形成自定义秘钥)》:http://blog.csdn.net/feilusia/article/details/68070791
五、基础知识
暂无
六、实验步骤
1、添加一个“动态广播”事件
1)定义事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent函数中)
[cpp] view plain copy
- //GUA
- //定时更新广播事件
- if ( events & SBP_GUA_UPDATE_ADV_EVT )
- {
- uint8 nGUA_Adv_Status;
- uint8 nbGUA_AES_Data[16] = {0}; //需要加密的数据
- uint8 nbGUA_AES_EncryptedData[16] = {0}; //加密后数据存放区
- uint8 nbGUA_Adv_Update[] =
- {
- //广播类型段
- 0x02,
- GAP_ADTYPE_FLAGS,
- DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
-
- //服务UUID段
- 0x03,
- GAP_ADTYPE_16BIT_MORE,
- LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
- HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
-
- //GUA
- //加密数据段
- 0x11, //1字节类型+16字节自定义加密数据
- GAP_ADTYPE_MANUFACTURER_SPECIFIC, //自定义类型
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- 0x00, //自定义数据预留
- //GUA
- };
-
- //关广播
- nGUA_Adv_Status = FALSE;
- GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &nGUA_Adv_Status);
-
- //加密计数值
- nbGUA_AES_Data[0] = ++sGUA_Count;
- GUA_AES_Encrypted(nbGUA_AES_Data, nbGUA_AES_EncryptedData);
-
- //修改广播数据
- osal_memcpy(nbGUA_Adv_Update + 9, nbGUA_AES_EncryptedData, 16);
-
-
- //更新广播数据
- GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,
- TRUE,
- sizeof(nbGUA_Adv_Update),
- nbGUA_Adv_Update);
-
- //开广播
- nGUA_Adv_Status = TRUE;
- GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &nGUA_Adv_Status);
-
- //5S启动一次更新广播的事件
- osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_GUA_UPDATE_ADV_EVT, 5000);
-
- return (events ^ SBP_GUA_UPDATE_ADV_EVT);
- }
- //GUA
2)添加事件的宏定义(SimpleBLEPeripheral.h中)
[cpp] view plain copy
- #define SBP_GUA_UPDATE_ADV_EVT 0x0008
2、添加动态广播的部分代码
1)定义一个变量用于计数(SimpleBLEPeripheral.c中)
[cpp] view plain copy
- //GUA
- static uint8 sGUA_Count = 1;
- //GUA
2)初始化阶段关闭广播(修改SimpleBLEPeripheral.c中的SimpleBLEPeripheral_Init函数)
[cpp] view plain copy
- //GUA
- uint8 initial_advertising_enable = FALSE;//TRUE;
- //GUA
3)初始化结束后启动香瓜的定时更新广播事件(SimpleBLEPeripheral.c中的SimpleBLEPeripheral_ProcessEvent函数)
[cpp] view plain copy
- //GUA
- //立即启动一次更新广播的事件
- osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_GUA_UPDATE_ADV_EVT, 0);
- //GUA
七、注意事项
1、手机可能缓存了之前的代码(在更新过CC2541的代码之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:
方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。
2、当低功耗模式时,广播广播可能会导致在PM3下睡死,因此低功耗模式时需要注释掉如下两行代码:
[cpp] view plain copy
- //关广播
- //nGUA_Adv_Status = FALSE;
- //GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &nGUA_Adv_Status);
实测不关闭广播方式也能更新广播,并且底层的更新处理时间由5S缩短至1S。
八、实验结果
使用抓包软件Packet Sniffer,来观察CC2541的广播过程。
1、上电广播
主要看广播数据中的自定义数据字段。其中0x11是数据长度,0xFF是类型,后面的16个数据是加密数据。
此时的16个字节真实数据是“0x02、0、0、0、……0”。
注意当前的时间为2.235S。
2、第1次更新广播
见上图,可得以下结论:
1)在12.235S时才更新成功,一共用了10S才更新成功广播数据。
实际上我们的周期事件是5S启动一次,而红框与上一条广播数据相差了5S。
说明广播更新部分的处理执行时间也需要5S。
2)虽然我们的实际数据每次只改动一个字节,但可观测到16个加密数据都变化了。
因此,实验成功。
博主:甜甜的大香瓜 via: http://blog.csdn.net/feilusia/article/details/68488464 原文地址:http://blog.csdn.NET/feilusia
|