蓝牙4.0中的GAP Advertising简介

蓝牙技术中定义了GAP的4种角色:Broadcaster, Observer, Central, Peripheral(Section 6.2 Vol 1 Part A)和Linker Layer(LL)的5种状态:Standby, Advertising, Scanning, Initiating, Connection(Section 1.1 Vol 6 part B),一种设备可以同时拥有多种角色和多种状态


A、Advertising

有两种类型的数据包可以发送:广播数据包(Advertising packet) 和 扫描响应包(Scan Response packet),它们的最大数据量都为31字节。

广播者在广播时间间隔内会一直广播数据,这个时间间隔是可以在广播的时候改变的,但也必须在最小时间间隔和最大时间间隔之间,正常情况下,不定向广播的时间间隔在20ms到10.24s之间(Section 7.8.5 Part E Vol2)。扫描响应包的发送是在收到扫描请求以后才发送。

        下图描述了广播包和扫描响应包的发送过程

在一些应用场景中,我们可能不希望设备之间建立连接,那我们可以广播无连接广播数据,这样就可以跳过扫描请求,不回复扫描响应,这样可以节省电量,Beacon设备就是其中的一种。

      注意,所有的广播包,扫描请求包和扫描响应包都用同一个允许接入地址0x8E89BED6,这个通用的地址可以允许任何的蓝牙设备进行扫描和接收数据。

         

低功耗蓝牙设备用40个无线通道,中心频率是在2402+k*2MHZ(k在0到39之间),但是广播通道只有3个,就是37(2402MHZ), 38(2426MHZ), 39(2480MHZ),选择这3个通道是为了避免与wifi通道冲突,下图所示就是蓝牙广播通道和wifi通道,其中扇形的是wifi

在nordic的协议栈中,默认情况下每一次广播事件都会在3个通道广播数据,扫描者会从3个中的1个通道抓取,如下图示


1、Broadcast

注意,一个设备可以同时扫描和广播,扫描者能发送给广播者唯一的信息是扫描请求包,它只包含了扫描者的自身地址。

2、广播类型和白名单广播

有4种广播类型(Section 2.3.1 Vol 6 Part B)

ADV_IND: 可连接的非定向广播,这是通常的广播模式,任何设备能发送扫描响应和连接请求

ADV_DIRECT_IND:可连接的定向广播,这种模式定向的发送广播包给指定主设备去请求连接,其他的扫描者会忽略此包,同时此时的广播者也会忽略其他扫描者的连接请求和扫描请求。

ADV_SCAN_IND: 可扫描的非定向广播,这种广播包不接收连接请求,只接收扫描请求

ADV_NONCONN_IND: 不可连接的非定向广播,广播者不接收任何连接请求和扫描请求,在这种模式下可节省电量。Beacon就是最大的应用实例

白名单广播

广播者可以利用白名单来限制扫描者的互动。白名单列表包含一些设备的固定地址或者IRK numbers(主设备用的是随机地址),如果不是白名单列表里的设备,它就会拒绝。所以白名单列表能被用来过滤扫描请求包,连接请求包。


B、Start advertising with nodrdic Softdevice

1、关于广播包和扫描响应包的设置可以参考(Chapter 11 Part C Vol 3)

   开始广播之前需要配置:

   广播时间间隔

   广播超时时间:在广播超时时间到了之后,会收到BLE_GAP_EVT_TIMEOUT事件

  设备地址:如果设置的是定向广播

  白名单列表:如果有的话

          过滤选择: 过滤扫描请求还是连接请求或者两者都过滤

   广播通道选择:可以选择1个,2个或者3个都广播

  2、广播开始时可能收到的GAP事件

BLE_GAP_EVT_TIMEOUT: 在超时时间到了出现,可以选择继续广播或者进入休眠模式。超时时间源可以是广播超时,连接超时,扫描超时,安全请求超时

BLE_GAP_EVT_SCAN_REQ_REPORT: 这个事件是在收到扫描请求以后才出现,只包含扫描者的地址和RSSI值,注意,只有你通过sd_ble_opt_set()使能之后才有用

BLE_GAP_EVT_CONNECTED: 主端发送连接请求建立连接


3、示例代码

uint32_t             err_code;
ble_gap_adv_params_t adv_params;
ble_gap_whitelist_t  whitelist;
ble_gap_addr_t   * p_whitelist_addr[1];
ble_gap_addr_t        whitelist_addr={BLE_GAP_ADDR_TYPE_RANDOM_STATIC,{0x71,0xA2,0xEC,0xDA,0x5F,0xE0}} ;
uint8_t addr[6] = {0x71,0xA2,0xEC,0xDA,0x5F,0xE0};  
uint8_t adv_data[15] = {0x07,0x09,0x4E,0x6F,0x72,0x64,0x69,0x63,0x02,0x01,0x04,0x03,0x03,0x0F,0x18};
uint8_t adv_data_length = 15;

//Setting up the advertising data with scan response data = Null
err_code = sd_ble_gap_adv_data_set(adv_data, adv_data_length, NULL, NULL);    

//Configure the advertising parameter and whitelist
memset(&adv_params, 0, sizeof(adv_params));
adv_params.type        = BLE_GAP_ADV_TYPE_ADV_IND;
adv_params.p_peer_addr = NULL;
adv_params.interval    = 64;
adv_params.timeout     = 180;
p_whitelist_addr[0] = &whitelist_addr;
whitelist.addr_count = 1;
whitelist.pp_addrs   =  p_whitelist_addr;
whitelist.pp_irks = NULL;
whitelist.irk_count =0;
adv_params.fp          = BLE_GAP_ADV_FP_FILTER_CONNREQ;
adv_params.p_whitelist = &whitelist;
err_code = sd_ble_gap_adv_start(&adv_params);
下图是扫描者接收到的广播数据包


源数据是{0x07,0x09,0x4E,0x6F,0x72,0x64,0x69,0x63,0x02,0x01,0x04,0x03,0x03,0x0F,0x18}

解释如下

猜你喜欢

转载自blog.csdn.net/zhashuiguangzi/article/details/79770770