一.概述

1.例程说明

//广播间隔(单位是625us, 80=50ms)
#define DEFAULT_ADVERTISING_INTERVAL         80

uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL;

//设置广播间隔
GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt);
GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);

在Peripheral例程中,设置广播间隔为50ms,使用app搜索可以获取蓝牙名称和MAC地址,

2.APP显示

 

二.广播开关

1.广播开启和关闭

uint8_t initial_advertising_enable = TRUE;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);   //开启广播

uint8_t initial_advertising_enable = FALSE;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);   //关闭广播

三.默认广播内容配置

1.广播数据设置

GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);       //广播包
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData);   //扫描应答包 

2.广播初始数据

//广播包数据(最长31字节)
static uint8_t advertData[] = {
    //广播模式,若配置为限时可发现广播,默认180秒后广播自动关闭
    0x02,                  //数据长度
    GAP_ADTYPE_FLAGS,      //数据类型0x01
    DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,

    //服务UUID
    0x03,                  //数据长度
    GAP_ADTYPE_16BIT_MORE, //数据类型0x02
    LO_UINT16(SIMPLEPROFILE_SERV_UUID),
    HI_UINT16(SIMPLEPROFILE_SERV_UUID)
};

//扫描应答包数据(最长31字节)
static uint8_t scanRspData[] = {
    //蓝牙名称
    0x12, //数据长度
    GAP_ADTYPE_LOCAL_NAME_COMPLETE,  //数据类型0x09
    'S', 'i','m', 'p','l', 'e', ' ','P', 'e', 'r', 'i','p','h', 'e', 'r','a', 'l',
    // 连接间隔范围
    0x05, //数据长度
    GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,  //数据类型0x12
    LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 7.5ms
    HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),
    LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 100ms
    HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),

    //发送功率等级
    0x02, //数据长度
    GAP_ADTYPE_POWER_LEVEL,  //数据类型0x0A
    0 // 0dBm
};

3.广播格式讲解

广播包和扫描应答包的数据格式是长度+类型+数据,类型也计算一个长度,在修改蓝牙名字的时候需要注意,将名字改长或者改短需要将长度也一起修改,且需要和此函数名字一致:GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName);

四.修改广播名称和MAC地址

1.广播名称修改

0x0D, //数据长度(名称长度发生改变此处长度需修改)
GAP_ADTYPE_LOCAL_NAME_COMPLETE,  //数据类型0x09
'M','y','A','p','p','l','e','P','h','o','n','e',

2.MAC地址修改

将宏定义BLE_MAC设置为TRUE,自定义MAC生效:

#if(defined(BLE_MAC)) && (BLE_MAC == TRUE)
const uint8_t MacAddr[6] = {0x84, 0xC2, 0xE4, 0x03, 0x02, 0x02};
#endif

3.APP显示

 

五.广播信道配置

1.配置单通道发送广播

可设置某一个通道,某两个通道或三个通道。

#define GAP_ADVCHAN_37  0x01  //37通道,频率2402M
#define GAP_ADVCHAN_38  0x02  //38通道,频率2426M
#define GAP_ADVCHAN_39  0x04  //39通道,频率2480M
#define GAP_ADVCHAN_ALL (GAP_ADVCHAN_37 | GAP_ADVCHAN_38 | GAP_ADVCHAN_39) //三个通道都发送广播

uint8_t  advertising_channel = GAP_ADVCHAN_37;
GAPRole_SetParameter(GAPROLE_ADV_CHANNEL_MAP, sizeof(uint8_t), &advertising_channel);

六.限时可发现广播

1.程序配置

//限时可发现模式下配置广播时间,范围是1-65535秒,通用广播模式下无效
#define DEFAULT_DISCOVERABLE_MODE            GAP_ADTYPE_FLAGS_LIMITED   //配置为限时可发现模式
    
    0x02, 
    GAP_ADTYPE_FLAGS,
    DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,  //在广播包的GAP_ADTYPE_FLAGS中配置DEFAULT_DISCOVERABLE_MODE

uint16_t limit_adv_time=5;
GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT,limit_adv_time);    //设置超时时间为5s 

extern bStatus_t GAP_SetParamValue( uint16_t paramID, uint16_t paramValue );  //paramValue是16位数,最大0xFFFF为65535秒
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
//通用可发现模式下配置广播时间,范围是10-655350毫秒,限时可发现广播模式下无效
#define DEFAULT_DISCOVERABLE_MODE            GAP_ADTYPE_FLAGS_GENERAL

GAP_SetParamValue(TGAP_ADV_ADVERTISING_DURATION,adv_duration);/*单位10ms,范围0x0000-0xFFFF,0为不开启此功能,0xFFFF为无线循环即不会停止,
                                                                最大设置时间0xFFFE为65534*10ms约655.34秒 */
uint16_t adv_duration=500;   
GAP_SetParamValue(TGAP_ADV_ADVERTISING_DURATION,adv_duration);
合并写法:
if(DEFAULT_DISCOVERABLE_MODE==GAP_ADTYPE_FLAGS_GENERAL){
uint16_t adv_duration=500;   
GAP_SetParamValue(TGAP_ADV_ADVERTISING_DURATION,adv_duration);
}
if(DEFAULT_DISCOVERABLE_MODE==GAP_ADTYPE_FLAGS_LIMITED){
uint16_t limit_adv_time=5;
GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT,limit_adv_time);
}

2.串口打印输出结果

 

七.从机回复应答包

主机发送扫描请求,从机回复扫描应答包,从机可以设置该参数实现只回复靠近设备的扫描请求,

int adv_rsp_rssi=-60;
GAP_SetParamValue(TGAP_ADV_RSP_RSSI_MIN,adv_rsp_rssi);   //信号强度低于-60dbm不会回复扫描应答包

八.主机过滤重复报文(主机或观察者模式使用)

//若在短时间内需要搜索到同一台设备的报文,则需要关闭底层过滤,反之则开启,默认是开启状态
uint16_t filter_adv_reports=FALSE;
GAP_SetParamValue(TGAP_FILTER_ADV_REPORTS,filter_adv_reports);   //关闭过滤重复报文

 

posted on 2022-09-29 14:39  WCH蓝牙应用分享  阅读(2837)  评论(0)    收藏  举报