在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Android手机应用开发 → 基于nrf52840平台 白名单广播和连接.docx

基于nrf52840平台 白名单广播和连接.docx

Android手机应用开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.02M
  • 下载次数:7
  • 浏览次数:1026
  • 发布时间:2020-09-25
  • 实例类别:Android手机应用开发
  • 发 布 人:qqq5127
  • 文件格式:.docx
  • 所需积分:2
 相关标签: 白名单功能分享

实例介绍

【实例简介】
【实例截图】

【核心代码】

标题 基于nrf52840平台 白名单广播和连接 实现

项目组: 海外嵌入式

结果影响: 实现白名单广播和连接

共性问题

产品线   穿

产品    FD095

简要描述: 手机配对后,然后断开连接,其他的手机不可以搜索到和连接这个设备,必须要把设备的配对记录清除掉,其他手机才可以搜索到和连接到设备。

问题分析: 白名单广播和连接过滤的设置在库文件里面,需要修改库文件才可以实现。

 

 

1 设置ble_advertising_init(&m_advertising, &init);参数的时候,需要把init.config.ble_adv_whitelist_enabled 标志设置为 true表示打开白名单广播。

 

2  需要设置配对管理,peer_manager_init需要初始化配对管理,注册配对管理回调函数,设置FDS文件系统存储配对信息,等等。

 

3  收到这个PM_EVT_CONN_SEC_SUCCEEDED消息后,表示有新的手机设备配对成功,就可以设置白名单信息实际测试中,不可以直接调用函数设置配对信息,可能会导致crash因为刚刚连接上后需要把配对信息放在fds中,需要一段时间后才能设置配对信息。

如果加一个定时器去处理这个消息就可以了。

static void sec_req_set_whitelist_handle(void * p_context)

{

  uint32_t err_code;

 

  service_timer_fg.f.set_whitelist = 0;

  if (m_conn_handle == BLE_CONN_HANDLE_INVALID) // if disconnect, retrun

    return;  

  

  if(m_peer_id != PM_PEER_ID_INVALID)

  {

    // Bonded to a new peer, add it to the whitelist.

    m_whitelist_peers[0] = m_peer_id;

    NRF_LOG_INFO("Add/Replace the whitelisted peer. ID: %d", m_peer_id);

 

    // The whitelist has been modified, update it in the Peer Manager.

    err_code = pm_device_identities_list_set(m_whitelist_peers, 1);

    if (err_code != NRF_ERROR_NOT_SUPPORTED)

    {

      APP_ERROR_CHECK(err_code);

    }

 

    err_code = pm_whitelist_set(m_whitelist_peers, 1);

    update_advertisement_data_on_disconnection_fg = true;

    APP_ERROR_CHECK(err_code);

    while(NRF_LOG_PROCESS());

  }

}

 

4 断开连接后,on_adv_evt回调函数里面需要加上这个白名单消息处理

  case BLE_ADV_EVT_WHITELIST_REQUEST:

    {

      // When the Advertising module is about to advertise, an event

      // will be received by the application. In this event, the application

      // retrieves a whitelist from the Peer Manager, based on the peers

      // previously whitelisted using pm_whitelist_set().

 

      ble_gap_addr_t whitelist_addrs[SB_BLE_GAP_WHITELIST_ADDR_MAX_COUNT];

      ble_gap_irk_t whitelist_irks[SB_BLE_GAP_WHITELIST_ADDR_MAX_COUNT];

      uint32_t addr_cnt = SB_BLE_GAP_WHITELIST_ADDR_MAX_COUNT;

      uint32_t irk_cnt = SB_BLE_GAP_WHITELIST_ADDR_MAX_COUNT;

 

      err_code = pm_whitelist_get(whitelist_addrs, &addr_cnt,

                                  whitelist_irks, &irk_cnt);

      //APP_ERROR_CHECK(err_code);

      //NRF_LOG_INFO("pm_whitelist_get returns %d addr in whitelist and %d irk whitelist",addr_cnt, irk_cnt);

 

      // Apply the whitelist.

      err_code = ble_advertising_whitelist_reply(&m_advertising,

                                                 whitelist_addrs,

                                                 addr_cnt,

                                                 whitelist_irks,

                                                 irk_cnt);

      APP_ERROR_CHECK(err_code);

      }

    break;  // BLE_ADV_EVT_WHITELIST_REQUEST

 

  case BLE_ADV_EVT_PEER_ADDR_REQUEST:

        {

          pm_peer_data_bonding_t peer_bonding_data;

 

          // Only Give peer address if we have a handle to the bonded peer.

          if (m_peer_id != PM_PEER_ID_INVALID)

          {

            err_code = pm_peer_data_bonding_load(m_peer_id, &peer_bonding_data);

            if (err_code != NRF_ERROR_NOT_FOUND)

            {

              APP_ERROR_CHECK(err_code);

 

              ble_gap_addr_t *p_peer_addr = &(peer_bonding_data.peer_ble_id.id_addr_info);

              err_code = ble_advertising_peer_addr_reply(&m_advertising, p_peer_addr);

              APP_ERROR_CHECK(err_code);

            }

          }

        }

    break;  // BLE_ADV_EVT_PEER_ADDR_REQUEST

 

 

5  默认sdk不会白名单广播,只是白名单连接,需要在库里面修改参数,修改红色的部分

 

static ret_code_t set_adv_mode_fast(ble_advertising_t * const p_advertising,

                                    ble_gap_adv_params_t    * p_adv_params)

{

    ret_code_t ret;

 

    p_adv_params->interval = p_advertising->adv_modes_config.ble_adv_fast_interval;

    p_adv_params->duration = p_advertising->adv_modes_config.ble_adv_fast_timeout;

 

#if !defined (S112)

    if (p_advertising->adv_modes_config.ble_adv_extended_enabled)

    {

        p_advertising->adv_params.properties.type = BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED;

    }

    else

    {

#endif // !defined (S112)

        p_advertising->adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;

#if !defined (S112)

    }

#endif // !defined (S112)

 

    if (use_whitelist(p_advertising))

    {

        p_adv_params->filter_policy = BLE_GAP_ADV_FP_FILTER_BOTH;

 

        // Set correct flags.

        ret = flags_set(p_advertising, BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED);

        VERIFY_SUCCESS(ret);

 

        p_advertising->adv_evt = BLE_ADV_EVT_FAST_WHITELIST;

    }

    else

    {

        p_advertising->adv_evt = BLE_ADV_EVT_FAST;

    }

    p_advertising->p_adv_data = &(p_advertising->adv_data);

    return NRF_SUCCESS;

}

 

static ret_code_t set_adv_mode_slow(ble_advertising_t * const p_advertising,

                                    ble_gap_adv_params_t    * p_adv_params)

{

    ret_code_t ret;

 

    p_adv_params->interval = p_advertising->adv_modes_config.ble_adv_slow_interval;

    p_adv_params->duration = p_advertising->adv_modes_config.ble_adv_slow_timeout;

 

#if !defined (S112)

    if (p_advertising->adv_modes_config.ble_adv_extended_enabled)

    {

        p_advertising->adv_params.properties.type = BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED;

    }

    else

    {

#endif // !defined (S112)

        p_advertising->adv_params.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;

#if !defined (S112)

    }

#endif // !defined (S112)

 

    if (use_whitelist(p_advertising))

    {

        p_adv_params->filter_policy = BLE_GAP_ADV_FP_FILTER_BOTH;

 

        // Set correct flags.

        ret = flags_set(p_advertising, BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED);

        VERIFY_SUCCESS(ret);

 

        p_advertising->adv_evt = BLE_ADV_EVT_SLOW_WHITELIST;

    }

    else

    {

        p_advertising->adv_evt = BLE_ADV_EVT_SLOW;

    }

    p_advertising->p_adv_data = &(p_advertising->adv_data);

    return NRF_SUCCESS;

}

修改之后大部分安卓手机没有在白名单之内的是搜索不到蓝牙,也连接不上。但是不在白名单苹果手机可以搜索蓝牙,但是不能连接。白名单的手机可以搜索也可以连接。

 

 

 

实例下载地址

基于nrf52840平台 白名单广播和连接.docx

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警