IOS 可以连接 蓝牙BLE设备,但是无法发现服务(原创)

时间:2024-01-21 08:44:21

注:转载请标明文章来源,感谢支持作者劳动!

一、问题描述

       用iphone手机上的nRF connect软件调试蓝牙通信。

       1、nRF52蓝牙demo电路板,烧录一个SDK的程序,iphone手机可以成功连接及发现服务。如下图,

           

      2、之后烧录另一个固件,发现扫描出现的蓝牙名称等信息均已经改变,但是点击“connect”之后,还是上次的蓝牙信息。见下图

            

二、原因

      发现将手机重启,或者连接一个其他的蓝牙设备,再去连接开发板,上述问题不存在。

      这是因为,为改善蓝牙通信连接体验,IOS设备的蓝牙会保存上一次连接的设备的信息。我们前后两次烧录固件,但是蓝牙地址还是一样的,所以对于IOS来说,这是同一个设备, 点击连接之后,直接出现了上次保存的缓存信息。

      那我们对于同一块板子的解决方法就很明显,只要两次烧录的固件蓝牙地址不一样,问题就解决了。

三、解决方法

       针对12.30版本的固件(其他版本可能语句有不同,注意灵活应对)我们在蓝牙广播初始化,增加如下代码,用来改变蓝牙地址。

      

static void advertising_init(void)
{
    uint32_t               err_code;
    ble_advdata_t          advdata;
    ble_advdata_t          scanrsp;
    ble_adv_modes_config_t options;

    // Build advertising data struct to pass into @ref ble_advertising_init.
    memset(&advdata, 0, sizeof(advdata));
    advdata.name_type          = BLE_ADVDATA_FULL_NAME;
    advdata.include_appearance = false;
    advdata.flags              = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;

      //Note: change the device address
      //******************************* 
    ble_gap_addr_t addr;
    err_code =sd_ble_gap_addr_get(&addr);
    addr.addr[0] += 1;
    err_code =sd_ble_gap_addr_set(&addr);
      
    memset(&scanrsp, 0, sizeof(scanrsp));
    scanrsp.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
    scanrsp.uuids_complete.p_uuids  = m_adv_uuids;

    memset(&options, 0, sizeof(options));
    options.ble_adv_fast_enabled  = true;
    options.ble_adv_fast_interval = APP_ADV_INTERVAL;
    options.ble_adv_fast_timeout  = APP_ADV_TIMEOUT_IN_SECONDS;

    err_code = ble_advertising_init(&advdata, &scanrsp, &options, on_adv_evt, NULL);
    APP_ERROR_CHECK(err_code);
}