一.概述
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); //关闭过滤重复报文