【单片机】nRF52832 实现停止蓝牙广播接口
前言
有一个项目使用了 nRF52832 芯片作为主控,其中有用到蓝牙功能。在对蓝牙接口进一步封装的时候,发现 SDK 居然没有停止广播的接口,咨询了代理 FAE,对方也没有找到关闭广播的接口。后来通过分析代码,修改了 SDK 解决了这个问题。这次发出来是因为遇到很多人在问这个问题,记得自己解决过,就发出来。
遗憾的是,当初为了赶项目,很多问题解决之后没有及时做记录,现在已经记不清当时的解决思路了,毕竟第一次接触 Nordic 芯片,后面又基本没用上,不过 Nordic SDK 的代码风格还是很赞的。
想不明白,为什么 Nordic 不提供关闭蓝牙广播的接口,SDK已经迭代了那么多个版本了,可能是因为对功耗影响不大所以没有必要提供了?还是说有其他的方式可以关闭蓝牙广播接口?
补丁
适用于 SDK15
From 67a4b2c241626e51192f6e1d528a07ba0ac4ab8d Mon Sep 17 00:00:00 2001
From: lmx <lovemengx@qq.com>
Date: Thu, 6 Jun 2019 18:37:50 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9SDK:=20ble=5Fadvertising,=20?=
=?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8F=AF=E4=BB=A5=E9=9A=8F=E6=84=8F=E5=81=9C?=
=?UTF-8?q?=E6=AD=A2=E5=B9=BF=E6=92=AD=E7=9A=84=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ble/ble_advertising/ble_advertising.c | 29 ++++++++++++++-----
.../ble/ble_advertising/ble_advertising.h | 11 +++++++
2 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/components/ble/ble_advertising/ble_advertising.c b/components/ble/ble_advertising/ble_advertising.c
index e09c2dd..5907b2f 100644
--- a/components/ble/ble_advertising/ble_advertising.c
+++ b/components/ble/ble_advertising/ble_advertising.c
@@ -459,6 +459,7 @@ uint32_t ble_advertising_init(ble_advertising_t * const p_advertising
p_advertising->error_handler = p_init->error_handler;
p_advertising->current_slave_link_conn_handle = BLE_CONN_HANDLE_INVALID;
p_advertising->p_adv_data = &p_advertising->adv_data;
+ p_advertising->flags = BLE_ADVERTISING_FLAGS_ENABLE; // add lmx 20190606
memset(&p_advertising->peer_address, 0, sizeof(p_advertising->peer_address));
@@ -531,6 +532,18 @@ static bool phy_is_valid(uint32_t const * const p_phy)
}
}
+// add lmx 20190606 设置标志位
+uint32_t ble_advertising_set_flag(ble_advertising_t * const p_advertising, ble_advertising_flags_t flags)
+{
+ if (p_advertising->initialized == false)
+ {
+ return NRF_ERROR_INVALID_STATE;
+ }
+
+ p_advertising->flags = flags;
+
+ return NRF_SUCCESS;
+}
uint32_t ble_advertising_start(ble_advertising_t * const p_advertising,
ble_adv_mode_t advertising_mode)
@@ -644,18 +657,20 @@ uint32_t ble_advertising_start(ble_advertising_t * const p_advertising,
if (p_advertising->adv_mode_current != BLE_ADV_MODE_IDLE)
{
-
ret = sd_ble_gap_adv_set_configure(&p_advertising->adv_handle, p_advertising->p_adv_data, &p_advertising->adv_params);
if (ret != NRF_SUCCESS)
{
return ret;
}
- ret = sd_ble_gap_adv_start(p_advertising->adv_handle, p_advertising->conn_cfg_tag);
-
- if (ret != NRF_SUCCESS)
- {
- return ret;
- }
+ // add lmx 20190606
+ if(BLE_ADVERTISING_FLAGS_ENABLE == p_advertising->flags)
+ {
+ ret = sd_ble_gap_adv_start(p_advertising->adv_handle, p_advertising->conn_cfg_tag);
+ if (ret != NRF_SUCCESS)
+ {
+ return ret;
+ }
+ }
}
if (p_advertising->evt_handler != NULL)
diff --git a/components/ble/ble_advertising/ble_advertising.h b/components/ble/ble_advertising/ble_advertising.h
index 8840821..96ef6f2 100644
--- a/components/ble/ble_advertising/ble_advertising.h
+++ b/components/ble/ble_advertising/ble_advertising.h
@@ -141,6 +141,13 @@ typedef void (*ble_adv_evt_handler_t) (ble_adv_evt_t const adv_evt);
/**@brief BLE advertising error handler type. */
typedef void (*ble_adv_error_handler_t) (uint32_t nrf_error);
+// add lmx 20190606
+typedef enum
+{
+ BLE_ADVERTISING_FLAGS_ENABLE, // 表示可以启用广播
+ BLE_ADVERTISING_FLAGS_DISABLE, // 表示禁止启用广播
+}ble_advertising_flags_t;
+
typedef struct
{
bool initialized;
@@ -166,6 +173,7 @@ typedef struct
bool whitelist_temporarily_disabled; /**< Flag to keep track of temporary disabling of the whitelist. */
bool whitelist_reply_expected; /**< Flag to verify that the whitelist is only set when requested. */
bool whitelist_in_use; /**< This module needs to be aware of whether or not a whitelist has been set (e.g. using the Peer Manager) in order to start advertising with the proper advertising params (filter policy). */
+ ble_advertising_flags_t flags; // add lmx 20190606
} ble_advertising_t;
typedef struct
@@ -257,6 +265,9 @@ void ble_advertising_conn_cfg_tag_set(ble_advertising_t * const p_advertising, u
uint32_t ble_advertising_start(ble_advertising_t * const p_advertising,
ble_adv_mode_t advertising_mode);
+// add lmx 20190606 设置标志位
+uint32_t ble_advertising_set_flag(ble_advertising_t * const p_advertising, ble_advertising_flags_t flags);
+
/**@brief Function for setting the peer address.
*
--
2.21.0.windows.1
应用
启动蓝牙并等待连接
// 启动蓝牙并等待连接
int8_t bluetooth_start(void)
{
uint32_t err_code = 0;
if(BLE_ADV_EVT_IDLE != ble_adv_event)
{
NRF_LOG_ERROR("ble_adv_event != BLE_ADV_EVT_IDLE...");
NRF_LOG_FLUSH();
return -2;
}
ble_advertising_set_flag(&m_advertising, BLE_ADVERTISING_FLAGS_ENABLE);
err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
APP_ERROR_CHECK(err_code);
return 0;
}
停止蓝牙广播并断开连接
// 停止蓝牙广播并断开连接
int8_t bluetooth_stop(void)
{
uint32_t err_code;
if(BLE_ADV_EVT_FAST != ble_adv_event)
{
return -2;
}
ble_advertising_set_flag(&m_advertising, BLE_ADVERTISING_FLAGS_DISABLE);
if(m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
APP_ERROR_CHECK(err_code);
// 这里建议增加超时机制, 不宜死循环一直等待
while (m_conn_handle != BLE_CONN_HANDLE_INVALID)
{
NRF_LOG_INFO("wait disconnect...");
NRF_LOG_FLUSH();
nrf_delay_ms(10);
}
}
sd_ble_gap_adv_stop(m_advertising.adv_handle);
err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_IDLE);
APP_ERROR_CHECK(err_code);
return 0;
}
注意
这里省略了初始化部分,提供启动和停止两个函数的实现意在表明使用方法,具体可参考 SDK 示例代码。
【单片机】nRF52832 实现停止蓝牙广播接口的更多相关文章
- 『转』android官网翻译好的蓝牙API接口说明
Develop API Guides 连接 蓝牙 本文内容 基础知识 蓝牙权限 设置蓝牙 查找设备 查询配对的设备 发现设备 连接设备 连接为服务器 连接为客户端 管理连接 使用配置文件 供应商特定的 ...
- 微信小程序之蓝牙广播信息
期初第一次做蓝牙开锁的时候遇到的最尖锐的问题就是ios设备如何对获取的广播信息进行读取,大概用了4中方式,都无法解决,最后不得不求助官方人员.给了一个方法,大家可以参考.在此附图: 由于mac地址是6 ...
- 微信小程序连接低功率蓝牙控制单片机上硬件设备
1.软件部分介绍 微信小程序是一种新的应用,用户不需要下载应用只用通过扫二维码或者打开链接就能使用,使用完后不需要卸载,直接关闭就行了.微信在2017年初推出微信小程序开发环境.任何企业,媒体,个人都 ...
- [安卓] 20、基于蓝牙BLE的广播包高频快速搜索
前言: 之前介绍过很多蓝牙beacon.搜索.连接.通讯的文章.不过最近我发现:之前写的蓝牙广播包搜索的工程,搜索频率太慢,而且不能一直保持搜索状态.因此,这里探讨下高频蓝牙广播包扫描 -- 蓝牙BL ...
- nrf52832蓝牙开发踩过的坑
接触nrf52832芯片已经有一段时间了,记录我踩过的坑.这些坑大多都补回来了,愿后来的开发者没有坑~ 先来点开胃小菜 一.环境问题 安装离线包遇到的错误--svdconv exited with a ...
- 蓝牙Beacon广播数据包格式以及解析
目录 1. 获取原始蓝牙广播包 2. 安装WireShark软件 3. 分析Beacon广播包数据 3.1 第一个数据包格式 3.2 第二个数据包格式 3.3 Android程序开发中的蓝牙广播包 4 ...
- [Andriod官方API指南]连接之蓝牙
Bluetooth —— 蓝牙 The Android platform includes support for the Bluetooth network stack, which allows ...
- [IOT] 自制蓝牙工牌办公室定位系统 (二)—— 基于ESP32的蓝牙信号扫描系统
前面章节: 自制蓝牙工牌办公室定位系统 (一)-- 阿里物联网平台概览及打通端到云(硬核·干货) 目录: 1.蓝牙广播简介 2.蓝牙扫描简介 3.基于蓝牙广播和蓝牙扫描常见应用 4.ESP32 ...
- Android 开发 蓝牙开发
前言 蓝牙开发其实分2个部分,一个是正常蓝牙功能的开发(比如Android蓝牙的互相连接.读取蓝牙列表.文件传输.蓝牙耳机等等).另外一个是BLE蓝牙开发(属于低功耗蓝牙设备,设备大多是血糖仪.蓝牙手 ...
- Android BLE蓝牙详细解读
代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...
随机推荐
- mybatis-特殊查询
特殊SQL的执行 模糊查询 /** * 根据用户名进行模糊查询 * @param username * @return java.util.List<com.atguigu.mybatis.po ...
- HTTP(s) API 经验总结
目录 参考文章 First URL HTTP(s)-Header 请求方式 参考文章 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overvie ...
- jvm双亲委派机制详解
双亲委派机制 记录一下JVM的双亲委派机制学习记录. 类加载器种类 当我们运行某一个java类的main方法时,首先需要由java虚拟机的类加载器将我们要执行的main方法所在的class文件 ...
- Python学习之实例2
一.根据输入的各科成绩统计学生成绩是否达标 1 (背景:输入学生数量,以及各个学生语文.数学.英语.历史四科的成绩,如果总成绩小于 240,则成绩不达标,否则成绩合格) 2 3 #coding=utf ...
- 嵌入式-C语言基础:通过结构体指针访问结构体数组
#include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...
- Reversal
# 35. Reversal- 出题人:OJ- 标签:["String"]- 难度:简单- 总分数:100## 题目描述<p>输入一个英文句子,句子包含若干个单词,每个 ...
- Day17:稀疏数组的超细详解
稀疏数组的超细详解 一个含有大量重复元素的二维数组,我们可以提取其有效元素,压缩空间,整合为一个稀疏数组. 例如一个五子棋棋盘,我们将棋盘看作为一个二维数组,没有棋子的位置为0:黑棋为1:白棋为2: ...
- uniapp 实现小程序中自定义tabBar 的方法
uniapp 实现小程序中自定义tabBar 的方法 第一种方式: page.json中配置 "tabBar": { "color": "#7A7E8 ...
- 【Shell案例】【wc、awk、cat、管道】1、统计文件的行数
描述写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数示例:假设 nowcoder.txt 内容如下: #include <iostream> using names ...
- 【day01】redis
〇.思维导图 1.解决缓存数据库双写不一致 延迟双删(中间sleep一段时间)--写性能下降 内存队列:同一个key(线程)的所有操作丢到队列,串行化执行--实现麻烦&大量内存队列,队列宕机 ...