BlueTooth: CC2540 BLE PeripheralBroadcaster Example(蓝牙4.0从机和广播者多角色实例)

实验环境:

蓝牙版本:TI CC2540

协议栈:1.2.1

参考手册:协议栈参考文档 TI_BLE_Software_Developer's_Guide.pdf

实验目的:实现CC240从机在连接以后,还可以继续以广播者的身份广播告知其他设备从机的存在。

                Peripheral device sending out advertisements while connected

所修改的工程:协议栈中SimpleBLEPeripheral文件夹下的SimpleBLEPeripheral.eww工程

实验现象:上电时,从机广播,然后连接从机后,按键HAL_KEY_SW_1,切换到广播者状态(连接中的广播状态),再次搜索还是可以搜索到该设备,但是不可以连接

 

预编译选项如下所示:

INT_HEAP_LEN=3072
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
PLUS_BROADCASTER
HAL_LCD=TRUE
HAL_LED=TRUE
HAL_UART=TRUE
xPOWER_SAVING

 

需要强调的是,部分内容需要根据自己的平台做相应修改

 

一、广播的相关设置

首先不要忘记在预编译中加入PLUS_BROADCASTER

在peripheralBroadcaster.c文件中查看void GAPRole_Init( uint8 task_id )这个函数中确保一下设置为:

gapRole_profileRole = (GAP_PROFILE_PERIPHERAL);

 

二、从机的相关设置

1、为了方便起见,首先设置从机的广播模式为一直广播,在simpleBLEPeripheral.c中

// Limited discoverable mode advertises for 30.72s, and then stops
// General discoverable mode advertises indefinitely 
///受限广播 和  通用广播
///测试阶段修改为一直广播
#if defined ( CC2540_MINIDK )
#define DEFAULT_DISCOVERABLE_MODE             GAP_ADTYPE_FLAGS_LIMITED
#else
#define DEFAULT_DISCOVERABLE_MODE             GAP_ADTYPE_FLAGS_GENERAL
#endif  // defined ( CC2540_MINIDK )

根据自己的实际情况修改为一直广播就可以,我这里预编译里面没有定义CC2540_MINIDK

 

2、设置广播者切换在simpleBLEPeripheral.c中

找到函数static void simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )

可以按照下列给HAL_KEY_SW_1做修改:

if ( keys & HAL_KEY_SW_1 )
  {
    ///SK_Keys |= SK_KEY_LEFT;
    HalUARTWrite(0,"KEY1\n",5);
    ///
    osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_ADVDATA_EVT, 50 ); 
  }
 需要注意的是SBP_ADVDATA_EVT事件要在 simpleBLEPeripheral.h中定义:
// Simple BLE Peripheral Task Events
#define SBP_START_DEVICE_EVT                              0x0001
#define SBP_PERIODIC_EVT                                  0x0002
#define SBP_ADV_IN_CONNECTION_EVT                         0x0004 
///
#define SBP_ADVDATA_EVT                                   0x0008

然后在simpleBLEPeripheral.c中,找到函数:

uint16 SimpleBLEPeripheral_ProcessEvent( uint8 task_id, uint16 events )

在此函数中添加SBP_ADVDATA_EVT事件的执行代码:

 if ( events & SBP_ADVDATA_EVT )
  {
    static uint8 advMfgDataValue = 1;
    static uint8 advData[]= {0x03,0xFF,0x01};
    uint8   connAdv = TRUE;
  
    advMfgDataValue++;
  
    advData[2] = advMfgDataValue;
   
    //update adv data  
    GAPRole_SetParameter( GAPROLE_ADVERT_DATA,advData[0], advData );  

    // GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &connAdv );  

    GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &connAdv );  
    
    return (events ^ SBP_ADVDATA_EVT);
  }  

编译时需要注意:要将peripheral.c和peripheral.h排除编译;并且将peripheralBroadcaster.c和peripheralBroadcaster.h加入编译。具体操作如下:

如下图所示的四个文件

右击文件,点击Options选项,如下图所示:

点击左上角的Exclude from build就表示排除编译了,否则就是加入编译

三、实验结果

使用USB Dongle利用TI自带的BTool工具进行测试

 

1、以下是从机已经处于连接状态

 

2、当我们按下HAL_KEY_SW_1所对应的KEY1键时,进入搜索状态


 

 

3、最后发现的设备还是同一台设备,所以地址是一样的,但是这是广播者的身份,是不能连接的。

 

4、这是一台只有从机功能的设备,处于连接状态时,再次搜索后,是不会再次被发现的

如需转载请标明出处:http://blog.csdn.net/itas109

http://blog.csdn.net/itas109/article/details/12875023


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值