Long Range是BLE 5.0 新增加的特性,能够增加蓝牙的通信距离。nRF52系列中,52840支持Long Range,52832不支持。一般工程增加Long Range支持需要做如下修改。
设置 扫描/广播 功率为8 dBm
设置 扫描/广播 PHY为BLE_GAP_PHY_CODED
因为Long Range的广播与普通BLE广播不兼容,所以广播、扫描双方必须都设置为Long Range。
BLE Central:
在 scan_init() 函数中,增加对 phy 的设置
#ifdef BLE_LONG_RANGE
static ble_gap_scan_params_t m_scan_param =
{
.active = 0x01,
.extended = 0x01, // Must be set 1, when in long range.
.interval = 160,
.window = 160,
.timeout = 0x0000, // No timeout.
.scan_phys = BLE_GAP_PHY_CODED, // Set phy.
.filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL,
};
init_scan.p_scan_param = &m_scan_param;
#endif
在 scan_start() 函数中,增大信号发送功率。
#define RADIO_TX_POWER 8 /**< Radio TX power in dBm. Default to 8dBm, see product spec for valid range */
ret_code_t err_code;
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_SCAN_INIT, BLE_CONN_HANDLE_INVALID, RADIO_TX_POWER);
APP_ERROR_CHECK(err_code);
连接成功后,增大信号发射功率。
增大信号发射功率函数 sd_ble_gap_tx_power_set ,可设置三种状态的发射功率:广播状态、扫描状态、连接状态。所以连接后,主从机都需调用函数,增大信号发射功率。
蓝牙连接事件,在 ble_evt_handler() 回调函数,BLE_GAP_EVT_CONNECTED事件。
ret_code_t err_code;
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, BLE_CONN_HANDLE_INVALID, RADIO_TX_POWER);
APP_ERROR_CHECK(err_code);
设置NRF_BLE_SCAN_BUFFER 大小
// NRF_BLE_SCAN_BUFFER - Data length for an advertising set.
#ifndef NRF_BLE_SCAN_BUFFER
#define NRF_BLE_SCAN_BUFFER BLE_GAP_SCAN_BUFFER_EXTENDED_MIN
#endif
BLE Peripherial
对从机的修改点进行梳理。
在advertising_init() 中初始化设置phy
#ifdef BLE_LONG_RANGE
ble_gap_adv_params_t adv_params =
{
.properties =
{
.type = BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED, // Long Range
},
.p_peer_addr = NULL,
.filter_policy = BLE_GAP_ADV_FP_ANY,
.interval = APP_ADV_INTERVAL,
.duration = 0,
.primary_phy = BLE_GAP_PHY_CODED, // Must be changed to connect in long range. (BLE_GAP_PHY_CODED)
.secondary_phy = BLE_GAP_PHY_CODED,
.scan_req_notification = 1,
};
#endif
在 advertising_start() 函数中,增大发射功率。
#define RADIO_TX_POWER 8 /**< Radio TX power in dBm. Default to 8dBm, see product spec for valid range */
ret_code_t err_code;
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, RADIO_TX_POWER);
APP_ERROR_CHECK(err_code);
连接成功后,设置连接发射功率。
ret_code_t err_code;
err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, BLE_CONN_HANDLE_INVALID, RADIO_TX_POWER);
APP_ERROR_CHECK(err_code);
其他设置
测试时,使用官方SDK ble_app_blinky 例程。参考开发者论坛资料,清除 .scan_srp_data 初始值。
static ble_gap_adv_data_t m_adv_data =
{
.adv_data =
{
.p_data = m_enc_advdata,
.len = BLE_GAP_ADV_SET_DATA_SIZE_MAX
},
.scan_rsp_data =
{
.p_data = NULL, //m_enc_scan_response_data, // long range
.len = 0 // BLE_GAP_ADV_SET_DATA_SIZE_MAX // long range
}
};