简介:本案例测试了long range,注意nrf52系列芯片中,部分硬件是不支持CADE的,也就是不支持long range,如nrf52832就不支持long range。同时协议栈也是部分支持,部分不支持,支持的如S140,不支持的如S113.所以在开发前需要把软件和硬件都确定好。

测试条件:

软件:基于nordic的SDK17.1的透传例子(主从机),协议栈选择s140

硬件:nrf52840DK板

下面是支持long range的芯片截图,当然除去下面这些,还有nrf5340也是支持的

在long range的125kbps模式下,最低的灵敏度在-103dBm(1M时为-95dBm)。

一、从机程序修改

这里涉及到广播态和连接态两种状态。就是保证广播是long range,链接也是long range。

把普通的BLE广播修改为long range广播,主要对从机广播包的机构和参数设置进行

1.1、加入广播数据包定义

使用ble_gap_adv_data_t结构定义一个全局的广播数据变量,注意在long range中是不能有回复包的,所以在定义时要给广播回复包的数据指针设置为NULL,长度设置为零,即如代码(直接加到main.c中):

static ble_gap_adv_data_t m_adv_data =

{

.adv_data =

{

.p_data = m_enc_advdata,

.len    = BLE_GAP_ADV_SET_DATA_SIZE_MAX

},

.scan_rsp_data =/*对于应答包,在long range(即PHY)下是不能设置的,必须保持为空*/

{

.p_data = NULL,

.len    = 0

}

};

1.2、广播初始化参数修改

修改advertising_init()函数修改配置如下,可以直接复制替换advertising_init函数

static void advertising_init(void)
{
uint32_t err_code;
ble_advertising_init_t init;
ble_gap_adv_params_t adv_params; memset(&init, 0, sizeof(init)); init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
init.advdata.include_appearance = false;
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
#ifndef long_range
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
#else
init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);
init.advdata.uuids_complete.p_uuids = m_adv_uuids;
#endif
init.config.ble_adv_fast_enabled = true;
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
init.evt_handler = on_adv_evt;
/*开始定义long range的参数*/
#ifdef long_range
init.config.ble_adv_extended_enabled =1;
init.config.ble_adv_primary_phy = BLE_GAP_PHY_CODED;
init.config.ble_adv_secondary_phy = BLE_GAP_PHY_CODED; memset(&adv_params,0,sizeof(adv_params)); adv_params.properties.type = BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED; adv_params.p_peer_addr = NULL; //对端设备地址(无)
adv_params.filter_policy = BLE_GAP_ADV_FP_ANY; //扫描策略,现为响应任意设备请求与连接
adv_params.interval = APP_ADV_INTERVAL;
adv_params.duration = APP_ADV_DURATION; adv_params.primary_phy = BLE_GAP_PHY_CODED;
adv_params.secondary_phy = BLE_GAP_PHY_CODED;
adv_params.scan_req_notification = 1;//允许扫描通知 m_advertising.adv_params = adv_params; m_advertising.adv_mode_current = BLE_ADV_MODE_IDLE;
m_advertising.adv_modes_config = init.config;
m_advertising.conn_cfg_tag = BLE_CONN_CFG_TAG_DEFAULT;
m_advertising.evt_handler = init.evt_handler;
m_advertising.current_slave_link_conn_handle = BLE_CONN_HANDLE_INVALID;
m_advertising.p_adv_data = &m_advertising.adv_data; memset(&m_advertising.peer_address, 0, sizeof(m_advertising.peer_address)); m_advertising.adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
m_advertising.adv_data.adv_data.p_data = m_advertising.enc_advdata[0];
m_advertising.adv_data.adv_data.len = adv_set_data_size_max_get(&m_advertising); err_code = ble_advdata_encode(&init.advdata, m_advertising.enc_advdata[0], &m_advertising.adv_data.adv_data.len);
APP_ERROR_CHECK(err_code); /*
参数1:指向一个空的对端设备的句柄,便于在发现对端设备后可以把其句柄给到这个指针,可以理解为初始化
参数2:广播的数据,要放入广播的数据,如果使用NULL,则表示没有任何数据,这里没有设置,会给的m_advertising的广播数据部分在后面的广播开始函数中再次进行设置,
主要是为了兼容,是的修改最少
参数3:广播的设置参数,如果应用需要在广播期间去更改 广播数据 ,那么这个时候必须设置为NULL
*/
err_code = sd_ble_gap_adv_set_configure(&m_advertising.adv_handle, NULL, &m_advertising.adv_params);
APP_ERROR_CHECK(err_code);
/*这一定要设置,否则会导致官方默认驱动检查 m_advertising.initialized的时候没有报错*/
m_advertising.initialized = true;
#endif ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}

BLE_GAP_PHY_CODED就表示使用125K或者500K的信道,由此牺牲速度的情况下达到远距离传输的需求。

以上修改完成,我们即完成了对从机程序的修改,编译下载即可。

1.3、修改结果确定:

使用带有拓展广播扫描功能的手机,安装nrf connect app后,使用名字过滤后可以看到我们的lonog range广播,特别注意,有些手机不支持拓展广播,可能无法找到:

点击RAW后可以看到详细信息,然后可以看到,广播包为拓展广播,PHY为LE coded,说明主机修改成功。

点击连接,然后点击右边3个竖着的点,在点击读取 PHY(read PHY),在右向滑动窗口到log显示界面,确定连接是否也是coded,

在log界面可以看到连接的TX和RX同样为code,说明我们修改没有问题,可以进行long range的通讯:

二、主机程序修改

主机程序是基于ble_app_uart_c的s140例程进行修改。

1改变原本的过滤策略

这一步主要是让我们可以精确的找到我们的设备,不修改也可以,

1.1、修改sdk_config

打开工程的sdk_config.h然后找到截图出,按照截图的方式修改,添加使用mac地址过滤:

1.2、程序修改

修改完毕后,我们需要加入我们从机设备的MAC地址

static ble_gap_addr_t const my_mac=
{
.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_STATIC,
.addr ={0x51,0xAE,0x8D,0xC2,0xF4,0xC6}
};

然后再scan_init()函数中修改UUID过滤策略为MAC地址过滤策略:MAC地址过滤策略代码如下:

    err_code = nrf_ble_scan_init(&m_scan, &init_scan, scan_evt_handler);
APP_ERROR_CHECK(err_code); err_code = nrf_ble_scan_filter_set(&m_scan, SCAN_ADDR_FILTER, &my_mac.addr);
APP_ERROR_CHECK(err_code); err_code = nrf_ble_scan_filters_enable(&m_scan, NRF_BLE_SCAN_ADDR_FILTER, false);
APP_ERROR_CHECK(err_code);

2改变原本的扫描方式

这一步关系着是否可以扫描到long range广播,我们需要定义一个ble_gap_scan_params_t类型的变量,具体的设置如下:

//其中几个宏定义如下:

#define SCAN_INTERVAL           0x00A0       /**< Determines scan interval in units of 0.625 millisecond. */

#define SCAN_WINDOW             0x0050   /**< Determines scan window in units of 0.625 millisecond. */

#define SCAN_TIMEOUT            0x0000       /**< Timout when scanning. 0x0000 disables timeout. */

static ble_gap_scan_params_t m_scan_params=
{
  .extended = 1,
.active = 0x01,
.interval = SCAN_INTERVAL,
.window = SCAN_WINDOW,
.timeout = 0x0000, // No timeout.
.scan_phys = BLE_GAP_PHY_CODED,
.filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL,
};

对于扫描来说一下两个参数必须如此才可以扫描到long range广播,注意设置好。

.scan_phys     = BLE_GAP_PHY_CODED,

.extended       = 1,//开启拓展的意思

在增加一个扫描buffer给蓝牙协议栈存数据,不然会报内存不足的错误,如下定义即可,

static ble_data_t m_scan_buffer =

{

m_scan_buffer_data,

BLE_GAP_SCAN_BUFFER_EXTENDED_MIN

};

然后需要把以上两个参数都在scan_init()中进行初始化,两个参数分别赋值如下

m_scan.scan_params= m_scan_params;

m_scan.scan_buffer=m_scan_buffer;:

然后再次把以上两个参数赋值给扫描实例,在scan_start()中修改

m_scan.scan_params= m_scan_params;

m_scan.scan_buffer=m_scan_buffer;

修改完成后如图所示:

以上完成了修改,编译下载即可

三、总结

完成以上修改了,主从机板子即可扫描对方,并且广播方式是long range,可以通过RTT可以看到主机扫描的从机设备MAC,即为我们前设置的从机MAC地址。

nordic——long range测试的更多相关文章

  1. input中range相关操作

    利用mousover触发函数对range的操作练习 <!DOCTYPE html> <html> <head> <meta charset="utf ...

  2. Swift 中 String 取下标及性能问题

    Swift 中 String 取下标及性能问题 取下标 String String 用 String.Index 取下标(subscript)得到 Character,String.Index 要从 ...

  3. [Swift]正则表达式工具类

    正则表达式工具类 import Foundation //基于NSRegularExpression api 的正则处理工具类 public struct Regex { private let re ...

  4. tensorflow: a Implementation of rotation ops (旋转的函数实现方法)

    tensorflow 旋转矩阵的函数实现方法 关键字: rot90, tensorflow 1. 背景 在做数据增强的操作过程中, 很多情况需要对图像旋转和平移等操作, 针对一些特殊的卷积(garbo ...

  5. day05_05 for循环、break语句

    1.0 输入用户名,密码练习 _user = "alex" _passwd = "abc123" username = input("Username ...

  6. MYSQL进阶学习笔记十二:MySQL 表分区!(视频序号:进阶_29,30)

    知识点十三:MySQL 表的分区(29) 一.什么要采用分区: 分区的定义: 当数据量过大的时候(通常是指百万级或千万级数据的时候),这时候需要将一张表划分几张表存储.一些查询可以得到极大的优化,这主 ...

  7. VBA绘制Excel图表

    VBA调试运行进入: 几个例子: 删除工作表内所有图表 录制一个宏 简化宏再使用 大量图表可采用for循环 CSDN上用积分下载的一个例子 VBA数组 VBA调试运行进入: 右键Excel的Sheet ...

  8. 修改Cosbench源码 支持s3的 http range request 测试场景

    在视频点播的业务应用场景中,用户使用了ffmpeg工具做视频实时转码用. 而ffmpeg使用range 请求.而Cosbench不支持这种测试场景,所以需要修改源码支持这种测试场景. HTTP 协议介 ...

  9. nrf52840蓝牙BLE5.0空中速率测试(nordic对nordic)

    一.基础知识: [1]Data Length:物理层发送一包数据的最大值: [2]MTU: ATT层发送一次数据长度的最大值: [3]GAP Event Length:一个connection eve ...

  10. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

随机推荐

  1. Arthas 初探--安装初步适用

    简介: 由于在项目中遇到一种情况,某段代码在进行单元测试和在 tomcat 容器中运行的性能相差数百倍,因此需要分析在不同环境下某个方法执行的具体时间,从而确定问题.Arthas 可以做到无侵入的监控 ...

  2. Hologres揭秘:优化COPY,批量导入性能提升5倍+

    简介: 揭秘Hologres优化COPY的技术原理,实现批量导入性能提升5倍+ Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓,这个云原生系统融合了实时服务和分析大数据的场景,全面兼 ...

  3. ASP.NET Core 浅析环境变量与配置的优先级

    本文将简单介绍在 dotnet 6 下的 ASP.NET Core 里的环境变量当成配置的优先级行为.这部分内容在官方文档都有提到,只是我开始粗心没有看仔细,而踩到了坑,特意写篇博客记录一下 在 AS ...

  4. 如何参与 .NET 的开发和设计

    现在 dotnet 属于 dotnet 基金会,所有开发者都可以向 dotnet 贡献代码和参与 .NET 的设计,参与路线决策.本文来告诉大家一些基本玩法,带着小伙伴们入坑 注意哦,参与 dotne ...

  5. HarmonyOS 鸿蒙隔离层设计

    在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升.新功能需求或安全性考虑等因素驱动.为了降低迁移成本,良好的设计模式至关重要. 在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进 ...

  6. 如何将data中字符传的换行正常显示

    后端传来的字符串有换行符: 直接输出的效果: 解决方法demo: <p class="" v-html="text"></p> js: ...

  7. pde复习笔记 第一章 波动方程 第六节 能量不等式、波动方程解的唯一性和稳定性

    能量不等式 这一部分需要知道的是能量的表达式 \[E(t)=\int_{0}^{l}u_{t}^{2}+a^{2}u_{x}^{2} dx \] 一般而言题目常见的问法是证明能量是减少的,也就是我们需 ...

  8. springboot项目启动会报4个加载不到的debug提示,可改可不改

    1. 因为启动的时候会报提示: Unable to locate LocaleResolver with name 'localeResolver': using default [org.sprin ...

  9. C数据结构线性表:最全链表实战剖析—单 双 循环链表&增删改查

    文章目录 前言 说明1 说明2 A:关于为什么传链表要用二级指针 B:单链表 1:定义结构体 2:初始化链表 3:销毁链表内容 (释放整个链表空间,把L指针赋值为NULL ) 4:增加某一个位置上的元 ...

  10. OpenStack 的 SR-IOV 虚拟机热迁移

    目录 文章目录 目录 前言列表 前言 SR-IOV Pass-through 虚拟机热迁移的问题 基于 macvtap 层的 SR-IOV 虚拟机热迁移 Workaround SR-IOV Pass- ...