【BLE】CC2541之通过广播发送自定义数据

本篇博文最后修改时间:2017年01月06日,11:06。


一、简介

本文以SimpleBLEPeripheral为例,将自定义的数据写入广播数据中,通过一个周期事件定时刷新广播数据。


二、实验平台

协议栈版本: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
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无

2、在进行本文步骤前,请先 实现以下博文:
暂无


五、基础知识

暂无


六、实验步骤

1、修改初始化广播数据(SimpleBLEPeripheral.c中)

static uint8 advertData[] =
{
  //自定义的广播数据段
  0x03,
  GAP_ADTYPE_MANUFACTURER_SPECIFIC,
  0,//自定义数据1
  0,//自定义数据2
  
  // 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、定义两个变量(SimpleBLEPeripheral.c中)

static uint8 sTemperature_H = 0;                                //温度高位
static uint8 sTemperature_L = 0;                                //温度低位
本篇的自定义数据是两个温度数据,一个高位数据,一个低位数据。


3、定义一个周期事件

1)定义一个周期事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent中)

  //周期性广播处理事件 
  if ( events & SBP_ADV_PERIODIC_PROCESS_EVT )
  {        
    advertData[2] = ++sTemperature_H;        //把温度高位值放到广播数据中  
    advertData[3] = ++sTemperature_L;        //把温度低位值放到广播数据中  

    GAP_UpdateAdvertisingData(simpleBLEPeripheral_TaskID,   
                              TRUE,  
                              sizeof(advertData),  
                              advertData );      //更新广播数据         
  
    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADV_PERIODIC_PROCESS_EVT, sBp_adv_periodic_process_evt_period ); 
    
    return (events ^ SBP_ADV_PERIODIC_PROCESS_EVT);    
  }  
这里将温度值变量累加,以便快速看到广播数据改变的现象。


2)定义一个周期事件的宏(SimpleBLEPeripheral.h中)

#define SBP_ADV_PERIODIC_PROCESS_EVT    0x2000  //周期性广播处理事件


3)定义一个周期时间的宏(SimpleBLEPeripheral.c中)
static uint32 sBp_adv_periodic_process_evt_period = 1000;      //周期时间
默认是1000,也就是1S。

如果需要2S更新一次温度数据,则改为2000。


4、启动周期事件(SimpleBLEPeripheral.c的SimpleBLEPeripheral_ProcessEvent中)

  if ( events & SBP_START_DEVICE_EVT )
  {
    // Start the Device
    VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );

    // Start Bond Manager
    VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );

    // Set timer for first periodic event
    //osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD );
    
    //启动周期性广播处理事件
    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADV_PERIODIC_PROCESS_EVT, sBp_adv_periodic_process_evt_period );
    
    return ( events ^ SBP_START_DEVICE_EVT );
  }


七、注意事项

手机可能缓存了之前的代码(在更新过CC2541的代码之后,都需要清除手机端的缓存!!!),因此要清除缓存,清除缓存的方法如下:

方法一:关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
方法二:手机重启。


八、实验结果

1、当广播的数据的温度值为0x09时,时间为942490us。



2、当广播的数据的温度值为0x0A时,时间为1891854us。

所以,更新一次广播数据的时间为1891854us-942490us=949364us,约为1S,协议栈的定时时间会有误差

因此成功地定时通过广播发送出了自定义的数据,实验成功。


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值