本篇博文最后修改时间: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
五、基础知识
暂无
六、实验步骤
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 //周期性广播处理事件
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,协议栈的定时时间会有误差。
因此成功地定时通过广播发送出了自定义的数据,实验成功。