Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)

蓝牙网状网络(Bluetooth mesh)概念

概述

蓝牙Mesh Profile | Bluetooth® Technology Website规范(Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth® Technology WebsiteMesh Protocol)是由蓝牙技术联盟(Bluetooth SIG)开发和发布的,它允许一对一、一对多和多对多通信。它使用BLE协议在网络节点之间交换消息。节点之间可以相互通信,只要它们在彼此的直接无线电范围内,或者有足够的设备能够侦听和转发这些消息。

终端用户应用程序(例如灯具控制)是在蓝牙网状网络模型规范(Mesh Model | Bluetooth® Technology Website)中定义的客户端-服务器蓝牙网状模型的帮助下定义的。

蓝牙Mesh基于蓝牙 4.0 规范的蓝牙低功耗(BLE)部分,并与该协议共享​​最低层。在广播中,蓝牙网状网络物理表示与现有蓝牙低功耗设备兼容,因为网状网络消息包含在蓝牙低功耗广告数据包的有效负载内。然而,蓝牙网状网络指定了一个全新的主机层,尽管共享一些概念,但蓝牙网状网络与蓝牙低功耗主机层不兼容。

(nRF5 SDK)

(NCS)

应用领域

蓝牙网络主要针对简单的控制和监控应用,如灯光控制或传感器数据收集。数据包格式针对小型控制数据包进行了优化,可以发出单个命令或报告,而不适用于数据流或其他高带宽应用

使用蓝牙mesh会导致比传统蓝牙低功耗应用更高的功耗。这主要是由于需要保持收音机持续运行。因此,与蓝牙低功耗广告不同,主动网状网络设备不能长时间使用硬币电池。

蓝牙mesh在一个网络中最多支持32767个设备,最大网络直径为126跳。

网络拓扑和中继

蓝牙Mesh是一种基于广播的网络协议,网络中的每个设备都可以向无线电范围内的所有设备发送和接收所有消息。

在网状网络中没有连接的概念。网络中的任何设备都可以中继来自任何其他设备的消息,这使得蓝牙mesh设备通过让一个或多个其他设备向目的地中继消息来向无线电范围外的设备发送消息成为可能。此属性还允许设备随时移动并进出网络。

网格传输(Mesh transport)

蓝牙mesh利用蓝牙低功耗广告人(BLE advertiser)和扫描仪(BLE advertiser)角色,通过蓝牙低功耗广告包进行通信。广告包被附近的蓝牙mesh设备接收,并像其他蓝牙低功耗广告包一样处理。蓝牙mesh数据包用唯一的AD类型表示,并添加到广告数据包负载中。

蓝牙低功耗设备以固定的发布间隔(advertisement intervals)发送广告包,mesh包也不例外。然而,与传统广告不同的是,蓝牙mesh设备将在每次传输时改变其广告负载,在堆栈中排队广播新的蓝牙mesh数据包。

如果蓝牙网状网络或蓝牙网状堆栈中没有流量,或者如果应用程序不生成任何消息,则设备保持沉默,直到有东西要传输。

中继/转发(Relays)

蓝牙网通过传递信息来扩展网络的范围。任何蓝牙mesh设备都可以被配置为中继设备,并且不需要专门的中继设备来构建网络。

每个充当中继的设备将减少接收到的消息中的生存时间(Time To Live, TTL)值,如果TTL等于2或更高,则转发它们。这种无向中继被称为消息泛洪(Message flooding),它确保了消息传递的高概率,而不需要网络拓扑上的任何信息。

蓝牙mesh profile规范没有提供任何路由机制,所有消息都由所有中继转发,直到TTL值为零。为了避免消息被相同的中继一次又一次地转发,所有蓝牙mesh设备都维护一个消息缓存。此缓存用于过滤掉设备已经处理过的数据包。

基于泛洪的消息中继方法会在空中产生大量冗余通信量,从而影响网络的吞吐量和可靠性。因此,强烈建议限制网络中中继的数量来限制这种影响。

网络中启用中继的设备的数量是消息路由冗余和可靠性之间的权衡。它应该根据以下因素进行调整:

  • 网络密度、
  • 流量、
  • 网络布局、
  • 可靠性和响应性要求。

电能消耗

为了实现基于广播的通信,设备必须持续将其无线电保持在收听模式。与典型的蓝牙低功耗设备相比,这会导致明显更高的功耗。

为了使低功耗设备能够加入mesh网络,蓝牙mesh包含了一个友谊(Friendship)特性。该协议允许低功耗设备与常规蓝牙mesh设备建立关系,后者将定期缓存和转发消息到低功耗设备。这节省了低功耗设备必须保持监听传入消息。

关贸总协定(GATT)的代理

为了支持不支持接收网状网络数据包的传统蓝牙低功耗设备,蓝牙mesh定义了一个单独的协议,用于在蓝牙低功耗GATT协议上隧道化网格消息。为此,蓝牙网格配置文件规范定义了GATT承载层(GATT bearer)和相应的GATT代理协议(GATT Proxy Protocol)。该协议允许传统蓝牙低功耗设备通过建立GATT连接到启用代理功能的蓝牙mesh设备来参与蓝牙mesh网络。

传统设备会被分配一个地址和必要的密钥,以成为网络的正式成员。设备通过常规发放过程或带外机制接收安全凭据。

寻址(Addressing)

蓝牙mesh寻址方案不同于蓝牙低功耗寻址方案。它具有三种类型的地址:

  • 单播地址(Unicast addresses:):每个设备唯一的地址。
  • 组地址(Unicast addresses):用于组成一组设备并一次对它们进行寻址。
  • 虚拟地址(Unicast addresses):具有大地址空间的基于uuid的未跟踪地址。

当设备添加到网络时,会为其分配一系列代表该设备的单播地址。设备的单播地址无法更改,并且始终是连续的。单播地址空间支持在单个蓝牙网状网络中拥有 32767 个单播地址。任何应用程序都可以使用单播地址直接向设备发送消息。

组地址的分配和指定是网络配置过程的一部分。一个组地址可以代表任意数量的设备,并且一个设备可以是任意数量的组的一部分。在一个网状网络中最多可以有16127个通用组地址。

虚拟地址可以看作是组地址的一种特殊形式,可以用来表示任意数量的设备。每个虚拟地址是一个由文本标签生成的128位UUID。虚拟地址不必由网络配置设备跟踪,并且通过这种方式,用户可以在部署之前生成虚拟地址,或者可以在网络中的设备之间自组织地生成地址。

模型(Models)和元素(Elements)

为了标准化不同供应商设备之间的通信,蓝牙网状网络配置文件规范定义了一个接入层(Access layer),用于在设备中的各种模型(Models)之间路由蓝牙网状网络消息。模型表示特定的行为或服务,并定义一组作用于这些状态的状态和消息。蓝牙网状网络配置文件规范(Bluetooth mesh profile specification)和蓝牙网状网络模型规范(Bluetooth mesh model specification)各自定义了一组模型,以涵盖设备配置、传感器读数和灯光控制等典型使用场景。除此之外,供应商还可以自由定义自己的模型以及附带的消息和状态。

设备中的模型(Models)属于元素(Elements)。每个设备都有一个或多个元素,每个元素都充当蓝牙网状网络中的虚拟实体,具有自己唯一的单播地址。每条传入消息均由元素中的模型实例处理。为了能够唯一地解析消息的处理方式,每个元素只有一个模型实例可以实现特定消息操作码的处理程序。如果一个设备具有同一模型的多个实例,则必须将每个实例指定给单独的元素。同样,如果两个模型实现同一消息的处理程序,则这些模型必须位于不同的元素中。

为了以最少的消息和状态重复来表示复杂的行为,模型可以由其他模型组成,可能跨越多个元素。这些模型称为扩展模型。纯粹自包含(独立)的模型称为根模型。

模型通过发布和订阅系统(Publish-and-subscribe system)相互通信。每个模型都可以订阅一组组地址和虚拟地址,并且该模型将仅处理发布到其订阅地址之一或包含元素的单播地址的消息。任何模型都可以维护其发布消息的发布地址。此发布地址可以是任何类型。

设备生命周期

每个要加入蓝牙mesh网络的新设备必须经过以下几个阶段才能成为蓝牙mesh网络节点:

  • 启用(Provisioning )— 在此阶段后,未启用的(Unprovisioned)设备将成为网络节点。该阶段包括以下步骤:
    • 发现(Discovery)
    • 认证(Authentication)
    • 地址分配和网络信息交换(Address assignment and network information exchange) — 此步骤结束后,设备成为一个节点(Node)。
  • 配置(Provisioning) — 在此阶段之后,节点能够执行其需要与相邻节点交换蓝牙mesh消息的任务。此阶段包括以下步骤:
    • 使用强制配置服务器模型(Mandatory Config Server model)配置节点
    • 添加所需的应用程序密钥(Application keys)和额外的网络密钥(Network keys)
    • 特定于应用程序的模型的可选配置,例如键绑定、发布或订阅(或两者都有)

这两个阶段通常由充当提供者和配置者(Provisioner and configurator)的一个设备执行。

通过执行节点重置过程(将节点从网络中移除),蓝牙mesh节点可以恢复为未启用的设备。

还可以使用密钥刷新过程强制将节点排除在网络之外。一旦完成了网络中其余节点的密钥刷新过程,就可以将节点的单播地址分配给新的未启用设备。

启用(Provisioning)

在设备可以参与正常的蓝牙mesh操作之前,必须对其进行启用。

启用是由Provisioner完成的,它是一个受信任的设备,可以访问网络中设备的完整列表及所有设备的配置数据。在启用了名为Provisionee的新设备之后,提供程序使用新设备的设备密钥建立一个安全通道来配置它。

配置(Configuration)

蓝牙mesh将网络配置留给中央网络配置器(Central network configurator)。设备不需要自己进行任何类型的服务发现。

为了控制其他设备,新设备必须由Provisioner配置,通过用户交互或从数据库加载预先确定的配置。每个设备都必须在其第一个元素中实现一个强制配置服务器模型(Mandatory Config Server model),该模型用于配置其其余模型。

一旦配置完成,Provisioner就使用其配置客户端模型(Configuration Client)的实例向新设备提供一组应用程序密钥和地址。除非重新配置,否则设备将在其网络生命周期内使用这些密钥和地址。

安全

蓝牙Mesh采用多种安全措施来防止第三方干扰和监控:

  • 身份验证(Authentication)
  • 消息加密(Message encryption)
  • 私钥(Privacy key)
  • 中继保护(Replay protection)

身份验证

设备身份验证是启用过程的一部分,它允许用户确认添加到网络中的设备确实是他们认为的设备。

蓝牙网格配置文件规范定义了一系列带外(out-of-band)身份验证方法,例如:

  • 灯光闪烁
  • 密码短语的输出和输入
  • 针对预共享密钥的静态身份验证

为了确保启用过程的安全,使用椭圆曲线Diffie-Helman(ECDH)公钥加密。启用设备后,它就是网络的一部分,其所有消息都被认为是经过身份验证的。

消息加密

蓝牙mesh具有两个级别的AES-CCM加密,128位密钥用于通过网络的所有消息:

  • 网络加密(Network encryption):保护蓝牙网状网络中所有消息不被不属于网络的设备读取的最低层。
    • 加密是用网络加密密钥完成的,任何网络都可以由多达4096个不同的子网组成,每个子网都有自己的网络密钥。
    • 所有共享网络密钥的设备都被认为是网络的一部分,并且可以通过网络发送和中继消息。
    • 通过使用多个网络密钥,网络管理员可以有效地将其网络划分为多个子网,因为蓝牙网状中继只转发用已知网络密钥加密的消息。
  • 传输加密(Network encryption):第二个加密层,它通过使用应用程序或设备密钥加密应用程序有效负载来限制网络中哪些设备可以做什么
    • 例如,考虑在酒店中部署的网状网络,希望将某些功能限制为由工作人员控制(如钥匙卡的配置或对存储区域的访问),而将某些功能限制为客人可用(如控制房间照明或空调)。为此,我们可以为来宾和工作人员提供一个应用程序密钥,允许消息通过同一网络转发,同时防止来宾和工作人员读取彼此的消息。

应用密钥(App key)用于区分网络中不同应用的访问权限,而设备密钥(Device key)用于管理网络中的设备。

每个设备都有一个唯一的设备密钥,只有Provisioner和设备本身知道。设备密钥用于为设备配置新的加密密钥(网络或应用程序密钥)或地址,以及设置其他设备相关参数。它还可以通过向网络中的所有其他设备传输新密钥(在传输密钥时使用它们各自的设备密钥)来驱逐网络中的恶意设备。这个过程称为密钥刷新过程(Key Refresh Procedure)。

每个加密层都包含一个消息完整性检查值,用于验证消息的内容是否使用指定的加密密钥进行了加密。

私钥

所有蓝牙mesh消息有效载荷都是完全加密的。消息元数据(如源地址和消息序列号)与从网络密钥派生的隐私密钥混淆,即使对于公共标头字段也提供有限的隐私。

中继保护

为了防止恶意设备重播/中继以前的消息,每个设备都保留一个运行序列号,用于出站消息。每条蓝牙mesh报文都使用一对唯一的序列号和源地址发送。接收消息时,接收设备会存储序列号,并确保它比从同一源地址接收到的最后一个序列号更新。

蓝牙网状网络堆栈架构(Stack architecture)

nRF5 SDK

Mesh堆栈由许多子系统组成,这些子系统通过一组API模块进行接口,并参与蓝牙mesh网络数据流。API模块隐藏了其子系统的复杂性。API中提供的功能足以使蓝牙mesh设备正常工作,因此不需要绕过API。

蓝牙网状栈的结构与蓝牙网状网规范(Bluetooth mesh specification)的结构相对应,并遵循相同的命名约定:

  • 模型(Models):蓝牙Mesh模型表示和实现设备行为。
  • 接入(Access):蓝牙Mesh接入层组织模型和通信。
  • DSM(Device State Manager):设备状态管理器存储在模型中使用的地址和加密密钥。
  • 核心(Core):核心蓝牙网格层负责加密和消息中继。
  • 启用(Provisioning):使用蓝牙Mesh启用协议将设备添加到网络中。
  • 承载(Bearer):承载层负责低级无线电操作。
  • DFU(Device Firmware Upgrade):设备固件升级模块与引导加载程序合作,通过蓝牙Mesh实现固件升级。
  • 蓝牙(Mesh Stack)(未见图):用于初始化和启动堆栈的顶级功能。
  • 串行接口(Serial)(未见图):蓝牙Mesh API的应用级串行化允许Mesh由单独的主机设备控制。

NCS

nRF Connect SDK中的Bluetooth®mesh stack是Zephyr Bluetooth®mesh stack的扩展。Zephyr蓝牙Mesh栈实现了蓝牙Mesh配置文件规范(参见蓝牙Mesh配置文件),而nRF Connect SDK在Access层API之上提供了来自蓝牙Mesh模型规范的额外模型实现。

网格栈的结构与蓝牙网格规范的结构相对应,并遵循相同的命名约定:

  • nRF Connect SDK中的蓝牙Mesh组件
    • 模型(Models)- 蓝牙Mesh模型呈现并实现设备行为。
  • Zephyr中的蓝牙Mesh组件
    • 接入(Access) - 蓝牙Mesh接入层组织模型和通信。
    • 核心(Core) - 核心蓝牙Mesh层负责加密和消息中继。
    • 启用(Provisioning) - 蓝牙Mesh启用协议用于向网络中添加设备。

蓝牙Mesh网络数据流

下图演示了数据包是如何在蓝牙网格堆栈结构中的网状网络节点及其层之间流动的。

例如,按下源节点上的灯开关后,会发生以下过程:

  • 源节点
    1. 应用程序调用电灯开关模型(light switch model)的publish函数。
    2. 该模型在带有操作码(opcode)的发布包(publishing packet)中包含开/关(on/off)消息,并将其发送到接入层(Access)。
    3. 访问层获取必要的发布参数,如目标地址(destination address)、加密密钥(encryption keys)和生存时间值(TTL值),并将数据包传递到传输层(Transport),即核心层(Core)中最高的层。
    4. 然后传输层使用选定的应用程序密钥对消息进行加密,并在必要时将消息分割成段。每个段数据包都被传递到网络层(Network),网络层附加一个带有序列号(sequence number)的网络报头,并用网络密钥对数据包进行加密,然后将其传递给承载层(Bearer)。
    5. 承载层将网络消息包含在广告包中,并为要广播的包安排一个时隙。(nRF5 SDK)/ 蓝牙LE控制器将网络消息包含在广告数据包中,并为该数据包安排广播的时隙。(NCS)
  • 所有中继节点
    1. 广播(broadcast)被范围内的所有Mesh网络节点接收,并从它们的承载层(Bearer)传递到它们的网络层(Network)。
    2. 网络数据包被解密,如果接收节点不是其目的地,则数据包的TTL值减少1,然后用相同的网络密钥重新加密并传递回承载层进行中继。(nRF5 SDK)/然后使用相同的网络密钥重新加密并传回蓝牙LE控制器进行中继。(NCS)

  • 目标节点

    1. 一旦数据包被转发到目标灯泡节点,其网络层将解密数据包并将其传递给传输层。

    2. 一旦以这种方式接收到所有传输层的段数据包,就可以使用应用程序密钥对组装的消息进行解密,并将其传递给接入层。

    3. 接入层检查操作码(opcode)、应用程序密钥(app key)和目标地址(destination address),并将消息传递给所有符合条件的模型。

    4. 如果其中一个模型是灯泡模型,则该模型解析消息的内容,并通知应用程序打开或关闭灯泡。

灯泡模型可能响应确认传输,按照相同的过程返回到灯开关节点,灯开关节点可以通知应用程序已接收到开/关消息。

模型(Models)

这些模型定义了通过网状网络传输的所有数据的行为和通信格式。蓝牙网格模型相当于低功耗蓝牙的GATT服务,是特定行为或服务的独立、不可变的实现。所有蓝牙mesh通信都是通过模型进行的,任何通过mesh暴露其行为的应用程序都必须通过一个或多个模型来引导通信。

蓝牙mesh规范为典型的使用场景定义了一组不可变的模型,但是供应商也可以自由地实现他们自己的模型。

接入(Access)

接入层控制设备的模型组成。它包含以下引用:

  • 设备上存在的模型
  • 这些模型接受的消息
  • 这些模型的配置

当设备接收到蓝牙mesh消息时,接入层发现消息是针对哪个模型的,并将它们转发给模型实现。(访问层在Zephyr中实现。NCS)

DSM(Device State Manager)

设备状态管理器存储蓝牙网格栈使用的加密密钥和地址。当模型通过配置服务器获得应用程序密钥并发布地址时,设备状态管理器存储原始值并为这些值提供句柄。模型可以在引用这些值时使用句柄。

设备状态管理器将其数据存储在持久存储中,可以在启动时恢复。(nRF5 SDK)

核心(Core)

蓝牙Mesh核心模块由网络层和传输层组成,为消息提供特定于网格的传输。

传输层通过使用应用程序密钥加密蓝牙网格数据包并将其分成可以在空中传输的更小的部分来提供网络内安全性。传输层重新组装传入的数据包段,并将完整的蓝牙网格消息呈现给接入层。

网络层使用网络密钥对每个传输层数据包段进行加密,并填充源地址和目的地址字段。当接收到蓝牙mesh数据包时,网络层对该消息进行解密,检查源地址和目的地址,并决定该数据包是否打算发送给该设备以及网络层是否应该转发它。

Mesh Core通过两层加密、重放保护和数据包头混淆,提供针对蓝牙Mesh网络的恶意行为和攻击的保护。(蓝牙Mesh核心在Zephyr中实现。NCS)

启用(Provisioning)

启用是将设备添加到蓝牙网状网络的行为。启用模块通过实现提供者角色(网络所有者)和被提供者角色(要添加的设备)来处理这个过程的两个方面。

  • 网格栈提供了两种方式来启用设备:直接通过PB-ADV/PB-GATT启用承载进行启用过程,这只能在彼此无线电范围内的提供方和被提供方之间进行配置。(蓝牙Mesh启用协议在Zephyr中实现。NCS)
  • 通过远程配置进行配置,它实现了两个蓝牙mesh模型,通过mesh网络共同创建一个隧道,允许提供商在PB-ADV代理设备的帮助下从远处添加设备。(远程供应是北欧的专有特性,不能与其他供应商的设备一起使用。nRF5 SDK)

承载(Bearer)

承载器是低级无线电控制器,它为上层的无线电包发送和接收提供异步接口。它强制蓝牙低能耗的数据包格式和定时,并通过SoftDevice时隙API直接在无线电硬件上操作。

Bearer是一个内部模块,应用程序通常不需要访问它。(nRF5 SDK)

DFU(Device Firmware Upgrade)

设备固件升级模块通过与引导加载程序合作,在蓝牙网格上提供固件更新功能。它能够在不停止应用程序的情况下将并发的、经过身份验证的固件传输到网络中的所有设备。(nRF5 SDK)

  • 专有网格DFU是北欧专有功能,不能与其他供应商的设备一起使用。
  • DFU过程与nRF5 SDK中使用的蓝牙低功耗安全DFU过程不兼容。

蓝牙(Mesh Stack)

Mesh Stack模块是一个围绕顶级蓝牙Mesh模块的薄包装器,它使开始使用蓝牙Mesh变得容易。它负责网格初始化和启用。它还包含用于存储和擦除供应和状态相关数据的函数。(nRF5 SDK)

串行接口(Serial)

串行模块提供蓝牙mesh API的完整串行化,允许其他设备通过UART接口控制nRF5 mesh设备。用于网络网关和类似的复杂应用,串行接口提供了一种通过北欧设备访问网状网络的方法,而无需使其成为设备的主控制器。(nRF5 SDK)

在nRF Connect SDK中配置蓝牙Mesh

蓝牙®mesh支持由CONFIG_BT_MESH控制,这取决于以下配置选项:

  • CONFIG_BT - 启用蓝牙子系统。
  • CONFIG_BT_OBSERVER - 启用蓝牙观察者角色。
  • CONFIG_BT_PERIPHERAL - 启用蓝牙外设角色。

可选特性配置

蓝牙Mesh栈中的可选功能必须显式启用:

  • CONFIG_BT_MESH_RELAY - 启用消息中继。
  • CONFIG_BT_MESH_FRIEND - 启用Friend角色。
  • CONFIG_BT_MESH_LOW_POWER - 开启低功耗角色。
  • CONFIG_BT_MESH_PROVISIONER - 启用Provisioner角色。
  • CONFIG_BT_MESH_GATT_PROXY - 启用GATT Proxy Server代理服务器角色。
  • CONFIG_BT_MESH_PB_GATT - 启用GATT provisioning bearer配置承载。
  • CONFIG_BT_MESH_CDB - 启用配置数据库子系统。

蓝牙Mesh供应和配置数据的持久存储是通过CONFIG_BT_SETTINGS启用的。有关详细信息,请参阅蓝牙堆栈体系结构Bluetooth Stack Architecture (nordicsemi.com)中的持久存储部分。

Mesh models

nRF Connect SDK蓝牙网格模型实现是可选功能,每个模型都有单独的Kconfig选项,必须明确启用。有关详细信息,请参阅Bluetooth Mesh型号Bluetooth Mesh models (nordicsemi.com)。

Mesh 设置/性能

以下配置选项用于配置蓝牙网状网络的行为和性能。有关影响Bluetooth Mesh内存占用空间的配置选项的更多信息,请参阅Bluetooth Mesh的内存占用空间优化指南Configuring Bluetooth Mesh in nRF Connect SDK (nordicsemi.com)。

  • CONFIG_BT_MESH_PROXY_USE_DEVICE_NAME - 启用GATT代理功能时,在扫描响应中包括GAP设备名称。
  • CONFIG_BT_MESH_DK_PROV - 为nRF5x开发套件启用Bluetooth MESH配置处理程序。
  • CONFIG_BT_MESH_ADV_BUF_COUNT - 定义本地消息的播发缓冲区数量。以提高RAM使用率为代价,提高性能。
  • CONFIG_BT_MESH_ADV_EXT_GATT_SEPARATE - 允许为GATT服务器广告使用单独的扩展广告集。
  • CONFIG_BT_MESH_ADV_EXT_FRIEND_SEPARATE - 允许为好友广告使用单独的扩展广告集。
  • CONFIG_BT_MESH_RELAY_ADV_SETS - 定义同时中继消息的最大数量。
  • CONFIG_BT_MESH_ADV_EXT_RELAY_USING_MAIN_ADV_SET - 设置中继消息的主广告集。

其他配置选项

本节列出了可用于配置蓝牙Mesh的行为和性能的其他配置选项。所提供的值仅作为建议,应根据每个应用程序单独调整。

  • CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE - 设置系统工作队列堆栈大小。如果默认的系统工作队列堆栈大小较低,则使用该选项来增加系统工作队列堆栈大小。
  • CONFIG_MAIN_STACK_SIZE - 设置初始化和主线程堆栈大小。如果需要,可以使用该选项来增加默认初始化和主线程的堆栈大小。
  • CONFIG_HWINFO - 开启硬件信息驱动。必须启用硬件信息驱动程序来执行设备的配置。请参阅北欧dk的蓝牙Mesh配置处理程序的UUID部分Technical Documentation (nordicsemi.com)。
  • CONFIG_PM_SINGLE_IMAGE - 启用对单映像构建使用分区管理器Partition Manager (nordicsemi.com)。
  • CONFIG_PM_PARTITION_SIZE_SETTINGS_STORAGE - 设置用于设置存储的分区大小。如果需要,可以使用该选项来增加大小。
  • CONFIG_SOC_FLASH_NRF_PARTIAL_ERASE - 在支持的硬件平台上启用部分擦除。部分擦除允许将闪存页擦除操作分成几个小块,以防止更长时间的CPU停机。这提高了网格节点在整理设置子系统使用的存储区域期间的响应性。
  • CONFIG_DK_LIBRARY - 为nRF5x开发套件启用DK按钮和led库。如果使用nRF5x开发套件,请使用此选项来启用库。

日志记录

  • CONFIG_NCS_SAMPLES_DEFAULTS - 启用Zephyr系统日志记录器,实现最小的日志记录。默认情况下,nRF Connect SDK中的所有示例都启用此功能。有关更多信息,请参阅Zephyr系统日志记录器Logging in nRF Connect SDK (nordicsemi.com)。
  • CONFIG_LOG_MODE_DEFERRED - 启用延迟日志记录。建议设置此配置选项,以避免减慢网格消息的处理速度。在建立友谊(friendship)后,提高了LPN的功耗。
  • CONFIG_LOG_BUFFER_SIZE - 设置日志记录器内部缓冲区专用的字节数。增加日志数量以避免在出现复杂协议或功能问题时丢失日志。
  • CONFIG_LOG_PROCESS_THREAD_SLEEP_MS - 设置内部日志处理线程的休眠周期。减小该值可以更快地刷新日志。

GATT代理性能

这些选项仅与支持低功耗蓝牙(LE) v4.2或更高版本的设备兼容。

以下配置选项允许将完整的中继网格广告帧装入单个链路层有效载荷:

  • CONFIG_BT_CTLR_DATA_LENGTH_MAX - 设置为37。
  • CONFIG_BT_BUF_ACL_TX_SIZE - 设置为37。
  • CONFIG_BT_BUF_ACL_RX_SIZE - 设置为37。

以下选项允许在单个连接间隔内发送多个数据帧:

  • CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT - 设置为10。

蓝牙设置/性能

以下配置选项用于配置蓝牙低功耗的行为和性能:

  • CONFIG_BT_COMPANY_ID - 设置该设备的蓝牙公司标识符。
  • CONFIG_BT_DEVICE_NAME - 定义蓝牙设备名称。
  • CONFIG_BT_L2CAP_TX_MTU - 设置L2CAP TX缓冲区的最大L2CAP MTU。启用GATT时,建议设置为“CONFIG_BT_BUF_ACL_TX_SIZE”减4。
  • CONFIG_BT_L2CAP_TX_BUF_COUNT - 设置出L2CAP包可用的缓冲区数量。
  • CONFIG_BT_RX_STACK_SIZE - 设置接收线程堆栈的大小。
  • CONFIG_BT_EXT_ADV_MAX_ADV_SET - 设置同时发布集的最大数量。
  • CONFIG_BT_BUF_ACL_RX_SIZE - 设置HCI ACL RX缓冲区所需的数据大小。

禁用和未使用的蓝牙功能

以下特性选项默认情况下在示例中是禁用的,但如果应用程序需要它们中的任何一个,则需要考虑启用它们:

  • CONFIG_BT_CTLR_DUP_FILTER_LEN = 0
  • CONFIG_BT_CTLR_LE_ENC = n
  • CONFIG_BT_CTLR_CHAN_SEL_2 = n
  • CONFIG_BT_CTLR_MIN_USED_CHAN = n
  • CONFIG_BT_CTLR_PRIVACY = n
  • CONFIG_BT_PHY_UPDATE = n

紧急数据存储(EMDS)​​​​​​​

在对存储重放保护列表(RPL)数据要求很高的大型网络中,应该考虑以下配置选项。这将需要额外的硬件。有关详细信息,请参阅紧急数据存储Emergency data storage (nordicsemi.com)。

  • CONFIG_EMDS - 启用应急数据存储功能。
  • CONFIG_BT_MESH_RPL_STORAGE_MODE_EMDS - 开启RPL在EMDS中的持久化存储。
  • CONFIG_PM_PARTITION_SIZE_EMDS_STORAGE =0x4000 - 定义分区管理器的分区大小。
  • CONFIG_EMDS_SECTOR_COUNT =4 - 定义紧急数据存储区域的扇区计数。

低功耗节点(LPN)

低功耗节点(LPN)是蓝牙Mesh特有的功耗优化功能。

使用LPN特性时,以下配置选项是相关的:

  • 串行通信消耗相当大的功率,应该考虑禁用它。
    • CONFIG_UART_CONSOLE = n
  • 启用后,将定期发布安全信标。低功耗节点不需要此操作。
    • CONFIG_BT_MESH_BEACON_ENABLED = n
  • 每个LPN轮询事件都会消耗功耗。延长轮询事件之间的间隔可以提高功耗。
    • CONFIG_BT_MESH_LPN_POLL_TIMEOUT = 600
  • 当启用GATT代理功能时,将定期发布网络ID。关闭它可以节省能量。
    • CONFIG_BT_MESH_GATT_PROXY_ENABLED = n
  • 减少节点ID发布超时时间,可以减少设备发布的耗电时间。
    • CONFIG_BT_MESH_NODE_ID_TIMEOUT = 30

​​​​​​​​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/227547.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷题总结 栈与队列

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 一、栈和队列的基础知识 队列是先进先出,栈是先进后出。同时二者都是容器适配器而不是容器。 二、题目实战 232.用栈…

Unity AssetBundle学习笔记

目录 基础介绍 动态资源加载 更新和添加内容 打包策略 资源分组 频繁更新的资源 资源压缩 Unload(true)和Unload(false) Unload(false) Unload(true) 确定何时卸载 引用计数 场景和状态管理 资源使用频率 内存预算…

基于CNN神经网络的手写字符识别实验报告

作业要求 具体实验内容根据实际情况自拟,可以是传统的BP神经网络,Hopfield神经网络,也可以是深度学习相关内容。 数据集自选,可以是自建数据集,或MNIST,CIFAR10等公开数据集。 实验报告内容包括但不限于&am…

前端图片适配不同屏幕方案

预备知识: 设备独立像素,以下图的iphone12 Pro为例,390*844表示的就是设备独立像素(DIP),也可以理解为CSS像素 物理像素(设备像素),就是屏幕的分辨率,显示屏就是由一个个物理像素…

【vim 学习系列文章 3.1 -- vim 删除 ^M】

请阅读【嵌入式开发学习必备专栏 之 VIM 专栏】 文章目录 ^M 来源^M 删除 ^M 来源 在 Vim 中打开文件时,您可能会遇到行尾的 ^M 字符,这通常是因为文件使用了 Windows 风格的回车换行符(CRLF),而不是 Unix/Linux 风格…

Java - 工厂设计模式

Java - 工厂设计模式 一. 简介二. 例子2.1 定义抽象类2.2 定义子类2.3 创建工厂2.4 测试 三. JDK中使用工厂模式的案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 工厂设计模式…

基于JAVA+SSM+VUE的前后端分离的大学竞赛管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着互联网技术的快速…

尽量避免删改List

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

【代码随想录】刷题笔记Day42

前言 这两天机器狗终于搞定了,一个控制ROS大佬,一个计院编程大佬,竟然真把创新点这个弄出来了,牛牛牛牛(菜鸡我只能负责在旁边喊加油)。下午翘了自辩课来刷题,这次应该是元旦前最后一刷了&…

苹果CMS超级播放器专业版无授权全开源,附带安装教程

源码介绍 超级播放器专业版v1.0.8,内置六大主流播放器,支持各种格式的视频播放,支持主要功能在每一个播放器内核中都相同效果。 搭建教程 1.不兼容IE浏览器 2.php版本推荐7.4 支持7.1~7.4 3.框架引入不支持同时引入多个播放器 json对接教…

搭建maven私服

maven maven简介 什么是maven? Maven这个单词来自于意第绪语(犹太语),意为知识的积累。 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以…

数据结构与算法 - 查找

文章目录 第1关:实现折半查找第2关:实现散列查找 第1关:实现折半查找 代码如下: /*************************************************************date: April 2009copyright: Zhu EnDO NOT distribute this code. ***********…

记录一下imx6ull linux 5.10.9多点电容触摸屏驱动报错问题解决方法

最近再研究如何将linux 5.10.9移植到imx6ull,用的原子的开发板,在移植电容触摸屏驱动时报错gpio gpiochip0: (209c000.gpio): gpiochip_lock_as_irq: tried to flag a GPIO set as output for IRQ,如下图: 该错误的意思就是尝试将…

Flink1.17实战教程(第三篇:时间和窗口)

系列文章目录 Flink1.17实战教程(第一篇:概念、部署、架构) Flink1.17实战教程(第二篇:DataStream API) Flink1.17实战教程(第三篇:时间和窗口) Flink1.17实战教程&…

[足式机器人]Part2 Dr. CAN学习笔记-Ch00 - 数学知识基础

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch00 - 数学知识基础 1. Ch0-1矩阵的导数运算1.1标量向量方程对向量求导,分母布局,分子布局1.1.1 标量方程对向量的导数1.1.2 向量方程对向量的导数 1.2 案例分析&#xf…

Java项目:101SpringBoot仓库管理系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 仓库管理系统基于SpringBootMybatis开发,系统使用shiro框架做权限安全控制,超级管理员登录系统后可根据自己的实际需求配角色&…

项目中使用Java中List.subList()的注意事项

使用介绍 在Java中&#xff0c;subList是List接口的一个方法&#xff0c;用于获取原始列表的子列表 方法的声明如下 List<E> subList(int fromIndex, int toIndex);fromIndex&#xff1a;起始索引&#xff08;包括&#xff09;toIndex&#xff1a;结束索引&#xff08…

SpringMVC学习与开发(四)

注&#xff1a;此为笔者学习狂神说SpringMVC的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 11、Ajax初体验 1、伪造Ajax 结果&#xff1a;并未有xhr异步请求 <!DOCTYPE html> &…

NXP实战笔记(一):基于RTD-SDK新建一个S32DS工程

目录 1、概述 2、操作步骤 2.1、新建Application工程 2.2、命名工程、选择芯片型号、选择编译器GCC版本 2.3、配置基本参数 3、文件描述 3.1、文件结构描述 3.2、编译之后 4、下载调试 1、概述 安装了S32DS之后&#xff0c;导入SDK插件&#xff0c;这个步骤不赘述&…

R统计学1 - 基础操作入门问题1-20

R统计学入门基础问题 1. 如何生成100个高斯&#xff08;正态&#xff09;分布随机数 x <- rnorm(100, mean 5, sd 0.1) x # [1] 4.893534 5.046611 5.081097 4.979164 5.181700 5.038192 5.135376 5.173346 4.968877 4.986146 # [11] 4.946258 5.198199 5.055531 4.9430…