实例介绍
【实例截图】
【核心代码】
标题: 基于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;
}
修改之后大部分安卓手机没有在白名单之内的是搜索不到蓝牙,也连接不上。但是不在白名单的苹果手机可以搜索到蓝牙,但是不能连接。在白名单的手机可以搜索也可以连接。
标签: 白名单功能分享
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论