【BLE】CC2541之动态广播加密数据

本篇博文最后修改时间:2017年03月30日,16:33。


一、简介

本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF开发板(主芯片CC2541)、USB Dongle


版权声明

博主:甜甜的大香瓜

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

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

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

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

四、 实验前提
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函数中)
//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中)
#define SBP_GUA_UPDATE_ADV_EVT                            0x0008 

2、添加动态广播的部分代码
1)定义一个变量用于计数(SimpleBLEPeripheral.c中)
//GUA
static uint8 sGUA_Count = 1;  
//GUA

2)初始化阶段关闭广播 (修改SimpleBLEPeripheral.c中的SimpleBLEPeripheral_Init函数)
      //GUA
      uint8 initial_advertising_enable = FALSE;//TRUE;
      //GUA

3)初始化结束后启动香瓜的定时更新广播事件 (SimpleBLEPeripheral.c中的 SimpleBLEPeripheral_ProcessEvent函数
//GUA    
    //立即启动一次更新广播的事件
    osal_start_timerEx(simpleBLEPeripheral_TaskID, SBP_GUA_UPDATE_ADV_EVT, 0); 
//GUA    

七、注意事项
1、 手机可能缓存了之前的代码 (在更新过CC2541的代码之后,都需要清除手机端的缓存!!!) ,因此要清除缓存,清除缓存的方法如下:
方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。
2、当低功耗模式时,广播广播可能会导致在PM3下睡死,因此低功耗模式时需要注释掉如下两行代码
    //关广播  
    //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个加密数据都变化了。

因此,实验成功。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜的大香瓜

谢谢你的支持^_^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值