更改

跳转至: 导航搜索

NRF52832DK-Mesh组网实验

添加13,206字节2019年10月17日 (四) 16:51
无编辑摘要
4、至此我们的mesh组网的lightswitch实验测试完成。
 
=== 源码详解 ===
 
== Beaconing example ==
 
=== 实验简介 ===
 
=== 硬件说明 ===
 
=== 软件说明 ===
 
=== 实验现象 ===
 
=== 源码详解 ===
 
== Coexistence example ==
 
=== 实验简介 ===
 
=== 硬件说明 ===
 
=== 软件说明 ===
 
==== 将Mesh集成到nRF5 SDK示例中 ====
用于网格的nRF5 SDK与Nordic的nRF5 SDK兼容。 这使您可以将nRF5 SDK中的资源包括在现有的Mesh项目中,也可以将nRF5 SDK中的Mesh功能包括在nRF5 SDK示例中。
 
请参阅构建网格堆栈和示例,以获取有关如何下载和安装nRF5 SDK的信息。 查看共存示例,以了解如何将nRF5 SDK功能与用于网格的nRF5 SDK同时使用。
 
===== 动态记忆 =====
在将nRF5 SDK功能与nRF5 Mesh SDK功能一起使用时(如并存示例所示),您可能会遇到以下情况:应用程序注意事项可能需要更改动态内存的分配方式和可分配的动态内存量。 网格堆栈使用网格内存管理器界面进行动态内存分配。 默认的后端mesh_mem_stdlib.c使用标准库malloc(),该库需要定义足够大的堆大小。 可以通过用另一个内存管理器替换后端来更改此行为。
 
如果使用Segger Embedded Studio构建应用程序,请在“项目选项”>“代码”>“运行时内存区域”设置中将“堆大小”设置为8192字节。
 
===== 并发的SoftDevice和Mesh活动 =====
同时运行SoftDevice和Mesh时,最大的性能问题通常来自无线电时间争用。虽然SoftDevice通常在预定的短脉冲中运行,但Mesh会尝试尽可能多地使用无线电。只要SoftDevice没有无线电活动,Mesh就会连续扫描和通告。 SoftDevice活动将减少Mesh广播的时间,并且为了保持一致的Mesh性能,必须在不影响用户体验的情况下尽可能保守地设置SoftDevice无线电参数。
 
在使用SoftDevice进行广告时,请尝试使用您的使用情况可以容许的最大广告间隔。如果可能,请在不需要时关闭SoftDevice广告商,仅在您希望收到连接请求时才激活它。如果您只需要发送不可连接的,不可扫描的广告(例如,针对第三方信标协议),请使用Mesh Advertiser API,因为它与Mesh一起使用时可以进行最少的上下文切换。
 
当SoftDevice在连接中运行时:
 
尝试协商应用程序可以允许的最大连接间隔。如果需要通过连接的高吞吐量,则在每个连接事件中发送更多的数据要比减少连接间隔更好,因为大部分开销来自上下文切换。
 
如果网状设备在其SoftDevice连接中充当外围设备(从设备),则还可以增加“从设备等待时间”,这应使SoftDevice跳过连接事件,而不会增加通过链接的任何传出数据传输的等待时间。
 
与广告一样,建议仅在需要时才保持连接活动。空闲的软设备连接对网状网性能的影响几乎与具有大量流量的连接一样多,特别是在从属延迟较低的情况下。
 
基于SoftDevice的扫描对所有SoftDevice活动的Mesh性能影响最大。当SoftDevice正在扫描时,Mesh无法接收数据包,因此每个SoftDevice扫描窗口都会替换Mesh扫描。仅在尝试建立连接或需要活动扫描时才应使用SoftDevice扫描。如果需要常规的被动BLE扫描(用于侦听信标或其他第三方活动),请通过使用nrf_mesh_rx_cb_set函数设置RX回调来挂接到Mesh扫描器。如果您的应用程序需要主动扫描或需要启动连接,则应尽可能保守地设置扫描参数。较长的扫描间隔和较短的扫描窗口将使Mesh拥有更多的时间进行自身的无线电活动。类似地,建立上下文时在短时间内执行连续扫描可能比执行长时间运行的占空比扫描有利,因为上下文切换会导致很多不必要的开销。最后,强烈建议为SoftDevice连接启动调用设置超时,以避免长时间的空闲扫描。
 
由于Mesh无法主动阻止SoftDevice无线电活动,因此减少同时运行SoftDevice活动的设备上的Mesh活动不会直接影响SoftDevice的性能。但是,附近的其他Mesh设备会干扰广告渠道中的SoftDevice活动,这可能会使连接启动花费更长的时间。
 
通常,Mesh必须在SoftDevice活动之间执行其所有无线电操作,因此,如果设备在执行SoftDevice无线电操作时正在发送大量Mesh数据包,则它将在此上花费大部分Mesh时间,而不是接收传入的数据。为了解决这个问题,请根据可用的无线电时间调整输出数据包的数量,以减少Mesh数据包的发送。如果可能,请通过在CORE_TX_ROLE_RELAY角色上调用mesh_opt_core_adv_set来暂停耗时的SoftDevice操作期间的Mesh数据包中继。
 
===== 在用于网格示例的nRF5 SDK中包括nRF5 SDK =====
根据您的工具链:
 
使用Segger Embedded Studio时,请添加代码文件并包括相应SES项目文件的路径。
 
使用CMake构建用于网格堆栈的nRF5 SDK时,添加代码文件并包括指向相应CMakeLists.txt文件的路径。 SDK_ROOT根符号用于引用nRF5 SDK安装文件夹(例如,请参阅Light Switch服务器示例中的CMakeLists.txt)。
 
网格示例项目已经在其include /目录中包含sdk_config.h文件。 这些文件是默认SDK配置文件的副本,并且网格示例所需的所有更改都包含在示例目录中的include / app_config.h文件中。
 
注意,
 
必须先在SDK配置文件中显式启用某些SDK功能,然后才能使用它们。 有关详细信息,请参见SDK文档页面SDK配置头文件。
 
===== 在nRF5 SDK示例中包括用于网格功能的nRF5 SDK =====
在nRF5 SDK示例的项目文件中包括来自nRF5 SDK for Mesh的以下源文件:
* All C files in <code>mesh/core/src</code>
* All C files in <code>mesh/bearer/src</code>
* All C files in <code>mesh/prov/src</code> except nrf_mesh_prov_bearer_gatt.c
* All C files in <code>mesh/access/src</code>
* All C files in <code>mesh/dfu/src</code>
* All C files in <code>mesh/stack/src</code>
 
* <code>models/foundation/config/src/config_server.c</code>
* <code>models/foundation/config/src/composition_data.c</code>
* <code>models/foundation/config/src/packed_index_list.c</code>
* <code>models/foundation/health/src/health_server.c</code>
* Any other mesh models that are used in your application
* <code>external/micro-ecc/uECC.c</code>
* <code>examples/common/src/assertion_handler_weak.c</code>
* <code>examples/common/src/mesh_provisionee.c</code>
 
注意
 
如果不需要各种网格特征(例如DFU),则可以从项目文件中省略相应的文件。但是,在其位置添加examples / nrf_mesh_weak.c以提供缺少的API函数的存根。
 
将以下文件夹添加到nRF5 SDK示例的项目包含路径:
* <code>mesh/core/api</code>
* <code>mesh/core/include</code>
* <code>mesh/bearer/api</code>
* <code>mesh/bearer/include</code>
* <code>mesh/prov/api</code>
* <code>mesh/prov/include</code>
* <code>mesh/access/api</code>
* <code>mesh/access/include</code>
* <code>mesh/dfu/api</code>
* <code>mesh/dfu/include</code>
* <code>mesh/stack/api</code>
* <code>models/foundation/config/include</code>
* <code>models/foundation/health/include</code>
* Path to include folder of any other mesh models that are used in your application
* <code>external/micro-ecc</code>
* <code>examples/common/include</code>
* Path to any other resources in the mesh examples that are used in your application
将以下预处理器符号添加到nRF5 SDK示例的项目文件中:
* <code>NRF52_SERIES</code>
* <code>NRF_MESH_LOG_ENABLE=NRF_LOG_USES_RTT</code> (because logging in the mesh stack relies on RTT)
* <code>CONFIG_APP_IN_CORE</code>
 
===== 可选变更 =====
此外,您可能需要应用以下一项或多项更改:
 
如果与nRF5 SDK集成在一起,则可能需要更新在网格堆栈中使用simple_hal模块的示例以使用Nordic nRF5 SDK bsp模块。可以同时使用两者,但是在这种情况下,必须从其中之一删除GPIOTE_IRQHandler,并且只有一个模块可以注册回调函数。
 
如果原始的Nordic nRF5 SDK示例使用了SoftDevice,请确保在启用SoftDevice之后初始化并启用了网格堆栈。在这种情况下,必须将SoftDevice事件转发到网格堆栈。将以下代码添加到您的应用程序:
 
<nowiki>#</nowiki>include“ nrf_sdh_soc.h”
 
#定义MESH_SOC_OBSERVER_PRIO 0
 
静态void mesh_soc_evt_handler(uint32_t evt_id,void * p_context)
 
{
 
    nrf_mesh_on_sd_evt(evt_id);
 
}
 
NRF_SDH_SOC_OBSERVER(m_mesh_soc_observer,MESH_SOC_OBSERVER_PRIO,mesh_soc_evt_handler,NULL);
 
如果您有多个SOC观察者,请确保一次仅从其中一个观察者将SOC观察者事件转发到网格堆栈。
 
默认情况下,在网格堆栈以及某些Nordic nRF5 SDK应用程序中启用网络配置的闪存存储。用于此目的的闪光区域可能会重叠并导致错误。为了使闪存存储模块Flash管理器与网状堆栈中的闪存管理器以及Nordic nRF5 SDK中的闪存存储模块安全地共存,请在nrf_mesh_config_app.h中添加以下代码块:
 
<nowiki>#</nowiki>include“ fds.h”
 
<nowiki>#</nowiki>include“ fds_internal_defs.h”
 
<nowiki>#</nowiki>define FLASH_MANAGER_RECOVERY_PAGE_OFFSET_PAGES FDS_PHY_PAGES
 
如果要添加自己的网格功能,而不是使用现有的网格示例,则还需要添加文件nrf_mesh_config_app.h。将其从网格堆栈存储库中的examples / templates文件夹复制到您的项目文件夹中,并删除文件顶部的#error消息。对文件内容进行其他适当的更改,例如将ACCESS_ELEMENT_COUNT和ACCESS_MODEL_COUNT调整为所需数量的元素和模型。
 
===== Flash放置项目文件 =====
Segger Embedded Studio项目旁边都有一个flash_placement.xml文件,该文件充当链接器的输入。在flash_placement.xml文件中,nRF5 SDK配置了一组ProgramSection列表,用于放置某些变量。除了nRF5 SDK组件所需的所有ProgramSections外,网格还需要另外两个部分,即nrf_mesh_flash和nrf_mesh_ram。
 
必须将其他与网格相关的部分添加到flash_placement.xml文件中:
 
将以下行添加到标记为<MemorySegment name =“ FLASH” ...>的内存段中:
 
<ProgramSection alignment =“ 4” keep =“是” load =“是” name =“。nrf_mesh_flash”输入节=“ *(SORT(.nrf_mesh_flash。*))”“ address_symbol =” __ start_nrf_mesh_flash“ end_symbol =” __ stop_nrf_mesh_flash“ />
 
将以下行添加到标记为<MemorySegment name =“ RAM” ...>的内存段中:
 
<ProgramSection alignment =“ 4” keep =“是” load =“否” name =“。nrf_mesh_ram” inputsections =“ *(SORT(.nrf_mesh_ram。*))”“ address_symbol =” __ start_nrf_mesh_ram“ end_symbol =” __ stop_nrf_mesh_ram“ />
 
注意
 
对于共存示例已经进行了此更改。在编辑任何现有nRF5 SDK示例的Flash放置文件时,可以在这些示例中使用flash_placement.xml文件作为参考。
 
=== 实验现象 ===
 
=== 源码详解 ===
 
== Coexistence Uart example ==
 
=== 实验简介 ===
 
=== 硬件说明 ===
 
=== 软件说明 ===
 
==== SDK UART共存示例 ====
本示例演示了如何同时使用适用于Mesh的nRF5 SDK和nRF5 SDK示例。它围绕两个示例构建,分为两个部分:
 
此示例的网格部分从nRF5 SDK for Mesh实现了灯开关客户端示例。
 
该示例的BLE部分实现了nRF5 SDK的ble_app_uart示例,但以下更改除外:
* BSP事件SLEEP,DISCONNECT和WHITELIST_OFF被忽略。这使得板子按钮仅控制应用程序的网格部分
* 增加广告间隔以为网格堆栈留出更多时间
* 可以通过发送要模拟的灯光开关客户端按钮编号,通过BLE UART来控制灯光开关服务器
运行此示例的结果是,您将能够使用网状网络,该示例中的网状网络可以代替电灯开关客户端示例。
 
在开始测试此共存示例之前,请参阅以下页面:
 
将Mesh集成到nRF5 SDK示例中
 
灯光开关示例和灯光开关客户端详细信息以及Mesh API
 
===== 测试示例 =====
将ble_app_uart_coexist文件夹复制到nRF5 SDK安装路径下的examples / ble_peripheral文件夹中。
 
在ble_app_uart_coexist / pca10040 / s132 / ses / ble_app_uart_pca10040_s132.emProject中打开Segger Embedded Studio项目。
 
将MESH_ROOT添加到您的Segger Embedded Studio全局宏列表:
 
在SES菜单栏中,单击工具>选项...。
 
在左列中,单击建筑物。
 
在右列中,双击“全局宏”。
 
在新行中添加网格根目录:MESH_ROOT = <网格安装路径>。
 
如灯光开关示例中所述对灯光开关示例设备进行编程,但以下情况除外:
 
用examples / ble_peripheral / ble_app_uart_coexist / pca10040 / s132 / ses / Output / Release / Exe / ble_app_uart_pca10040_s132.hex替换电灯开关客户端。
 
现在,您可以并行或顺序运行两个并存的示例:
 
按照电灯开关示例中的说明运行电灯开关示例。
 
按照nRF5 SDK文档中的描述运行ble_app_uart示例。
 
编写与UART RX特性中的数字之一(1、2、3或4)等效的十六进制ASCII码,以模拟按钮按下。
 
=== 实验现象 ===
=== 源码详解 ===
[[分类:NRF52832DK]]
[[分类:实验手册]]
510
个编辑

本PDF由谷雨文档中心自动生成,点击下方链接阅读最新内容。

取自“http://doc.iotxx.com/特殊:移动版差异/2257

导航菜单