增加6626主机扫到回应包scan respond的机率措施

wen sir · 16次点击 · 20小时前

        对于单连接的主机,添加以下配置策略和启用白名单(已知地址),能显示增加广播回应用包的扫描成功率。最于需要维持多个连接的应用,并不适用。

        应用新策略后,广播回应包的扫描成功率能提高约50%。


  //for better scan  performance

    *(__IO uint32_t *)0x41300080 = (*(__IO uint32_t *)0x41300080 & (~(0xFF<<16))) | (62<<16);

void user_scan_start(void)
{
    ob_scan_param_t scan_param;
    uint16_t time = 0;
    if (scan_cfg.status == true)
    {
        log_info("scanning...");
        if (ob_gap_scan_stop() != OB_ERROR_NO_ERR)
        {
            OM_LOG_DEBUG("stop scan error");
            return;
        }
    }
    log_info("scanning 1");
    scan_cfg.found_counter = 0;
    // scan_dev_reported_flag = 0;
    if (scan_cfg.timeout == 0)
    {
        time = SCAN_TIME * 1000;
    }
    else
    {
        time = scan_cfg.timeout;
    }
    param_scan_1m.scan_type = true;
    param_scan_1m.interval  = 100 / 0.625 ;  //0x80;//0.625ms
    param_scan_1m.window    = 80 / 0.625 ; //0x60;//0.625ms
    scan_param.addr_type    = OB_ADV_ADDR_TYPE_PUBLIC;
    scan_param.filter_policy = OB_SCAN_FILTER_BASIC_UNFILTER;
    scan_param.timeout      = 3000 / 10; //m
    scan_param.scan_coded   = NULL;
    scan_param.scan_1m      = &param_scan_1m;
    //clear scan records
    scan_dev_count = 0;
    // scan_dev_reported_flag = 0;
    memset(scan_dev_record, 0, sizeof(scan_dev_record));

    //for better scan  performance
    *(__IO uint32_t *)0x41300080 = (*(__IO uint32_t *)0x41300080 & (~(0xFF<<16))) | (62<<16);

    //
    #if 1  //使用白名单扫描广播、
    if (timeout_test < 5)
    {
        scan_param.filter_policy = OB_SCAN_FILTER_BASIC_FILTER;
        uint8_t address[7] = {0};
        ob_gap_addr_t addr_whitelist[14];
        memcpy(address, &user_global.MW_para.wait4Connect_mac, sizeof(user_global.MW_para.wait4Connect_mac));
        memset(addr_whitelist, 0, sizeof(addr_whitelist));
        //
        memcpy(&addr_whitelist[0], address, 7);
        //
        addr_whitelist[0].addr_type = 0;
        memcpy(&addr_whitelist[1], address, 7);
        //
        addr_whitelist[1].addr_type = 1;
        ob_gap_accept_list_set(addr_whitelist, 2);
    }
    #endif
    //
    uint32_t res = ob_gap_scan_start(&scan_param);
    if (res != OB_ERROR_NO_ERR)
    {
        OM_LOG_DEBUG("start scan error =%d", res);
    }
    else
    {
        OM_LOG_DEBUG("start scan  go..");
        scan_cfg.status = true;
        observer.ads_len = 0;
        if (scan_cfg.type == SCAN_ONLY)
        {
            scan_dev_count = 0;
            memset(scan_dev_record, 0, sizeof(scan_dev_record));
        }
    }
}


找到设备后,在连接时,需要重新调整一下配置策略,以提高连接速度

    //for better connect perfermance
    *(__IO uint32_t *)0x41300080 = (*(__IO uint32_t *)0x41300080 & (~(0xFF<<16))) | (82<<16);


uint32_t user_connect_start(uint8_t *address, uint8_t timeout)
{
    if (timeout == 0)
    {
        timeout = 5;
    }
    ob_gap_addr_t peer_addr;
    memcpy(&peer_addr, address, 7);
    ob_conn_phy_param_t conn_phy =
    {
        .scan_intv = 0xA0, //unit 0.625 SCAN Interval >>= scan window
        .scan_wind = 0x9E, //unit 0.625
        .conn_intv_min = (uint16_t)(15 * 100 / 125), //unit 1.25
        .conn_intv_max = (uint16_t)(15 * 100 / 125), //unit 1.25
        .latency_max = 0,
        .timeout = 200,
    };
    ob_conn_param_t conn_param =
    {
        OB_ADV_ADDR_TYPE_PUBLIC, //类型需要和地址匹配
        OB_SCAN_FILTER_BASIC_UNFILTER,
        peer_addr,
        &conn_phy,
        &conn_phy,
        NULL,
    };
    //for better connect performance
    *(__IO uint32_t *)0x41300080 = (*(__IO uint32_t *)0x41300080 & (~(0xFF<<16))) | (82<<16);
    #if 1  //使用白名单连接
    ob_gap_addr_t addr_whitelist[14];
    memset(addr_whitelist, 0, sizeof(addr_whitelist));
    memcpy(&addr_whitelist[0], address, 7);
    addr_whitelist[0].addr_type = 0;
    memcpy(&addr_whitelist[1], address, 7);
    addr_whitelist[1].addr_type = 1;
    ob_gap_accept_list_set(addr_whitelist, 2);
    conn_param.filter_policy = OB_CONN_FILTER_USE;//使用白名单地址,忽略设置的地址
    #endif
    //
    uint32_t res = ob_gap_connect(&conn_param);
    OM_LOG_DEBUG_ARRAY_EX("\npeer addr:", &peer_addr, 7);
    log_info("\nres=0x%x", res);
    if (res == OB_ERROR_NO_ERR)
    {
        // set_shell_busy("Connectting...Please wait\n");
        evt_timer_set(&timer_conn, timeout * 1000, EVT_TIMER_ONE_SHOT, conn_timeout_cb, NULL);
    }
    else
    {
        log_info("cnt start error:0x%x", res);
    }
    return res;
}
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站