IOS 可以連接 藍牙BLE設備,但是無法發現服務(原創)


注:轉載請標明文章來源,感謝支持作者勞動!

一、問題描述

       用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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM