解决 Nordic central 中心设备连接外围设备错误 Disconnected, reason 0x8
解决 Nordic central 中心设备连接外围设备错误 Disconnected, reason 0x8
我需要用蓝牙Downgle来实现电脑串口发送数据到我的外围设备上,进行数据测试等。
但是遇到 uuid 过滤失败的情况,暂时还没有解决。我用SDK中的Demo工程,都能连接ble_uart设备,但是我的工程是在ble_uart上进行修改的,没有更改 nus service 的 uuid,但就是过滤识别不到我的设备。
因此我在 NRF_BLE_SCAN_EVT_NOT_FOUND
事件中处理我的连接。
先关掉 uuid 过滤器,然后再scan_evt_handler
回调里面设置上述事件,扫描到指定MAC的设备后,直接进行连接。
static void scan_evt_handler(scan_evt_t const * p_scan_evt)
{
ret_code_t err_code;
ble_gap_evt_adv_report_t const *p_adv = p_scan_evt->params.filter_match.p_adv_report;
ble_gap_scan_params_t const *p_scan_param = p_scan_evt->p_scan_params;
ble_gap_evt_connected_t const * p_connected = p_scan_evt->params.connected.p_connected;
ble_gap_evt_adv_report_t const * p_not_found = p_scan_evt->params.p_not_found;
switch(p_scan_evt->scan_evt_id)
{
case NRF_BLE_SCAN_EVT_FILTER_MATCH:
{
NRF_LOG_INFO("match ");
NRF_LOG_INFO("scan to target %02x%02x%02x%02x%02x%02x",
p_adv->peer_addr.addr[0],
p_adv->peer_addr.addr[1],
p_adv->peer_addr.addr[2],
p_adv->peer_addr.addr[3],
p_adv->peer_addr.addr[4],
p_adv->peer_addr.addr[5]
);
} break;
case NRF_BLE_SCAN_EVT_NOT_FOUND:
{
uint8_t addr[6] = {0xA8, 0xbc, 0xc8, 0x55, 0xa7, 0xc0};
if (memcmp(addr, p_not_found->peer_addr.addr, 6) == 0)
{
NRF_LOG_INFO("not found target %02x%02x%02x%02x%02x%02x",
p_not_found->peer_addr.addr[0],
p_not_found->peer_addr.addr[1],
p_not_found->peer_addr.addr[2],
p_not_found->peer_addr.addr[3],
p_not_found->peer_addr.addr[4],
p_not_found->peer_addr.addr[5]
);
ret_code_t ret_code = sd_ble_gap_connect(&(p_not_found->peer_addr), p_scan_param, &m_connection_param, 1);
if (ret_code != NRF_SUCCESS)
{
NRF_LOG_INFO("connect failed.");
}
scan_stop();
}
} break;
然后,中心设备是能扫描并且连接到指定外围设备了,但是一会儿就断开连接了。并且报错:Disconnected, reason 0x8
。最后再Nordic论坛,发现需要调整连接参数。
调整如下:
#define MIN_CONNECTION_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**< Determines minimum connection interval in milliseconds. */
#define MAX_CONNECTION_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Determines maximum connection interval in milliseconds. */
#define SLAVE_LATENCY 0 /**< Determines slave latency in terms of connection events. */
#define SUPERVISION_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Determines supervision time-out in units of 10 milliseconds. */
static ble_gap_conn_params_t const m_connection_param =
{
(uint16_t)MIN_CONNECTION_INTERVAL,
(uint16_t)MAX_CONNECTION_INTERVAL,
(uint16_t)SLAVE_LATENCY,
(uint16_t)SUPERVISION_TIMEOUT
};
重新连接后,没有问题了。