当前位置: 首页 > news >正文

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

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

相关文章:

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

蓝牙网状网络(Bluetooth mesh)概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范(Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol)是由蓝牙技术联盟(Bluetooth SIG)开…...

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象:①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…...

GitHub教程-自定义个人页制作

GitHub是全球最大的代码托管平台,除了存放代码,它还允许用户个性化定制自己的主页,展示个人特色、技能和项目。本教程旨在向GitHub用户展示如何制作个性化主页,同时,介绍了GitHub Actions的应用,可以自动化…...

Frappe Charts:数据可视化的强大工具

一、产品简介: 一个简单、零依赖、响应式的 开源SVG 图表库。这个图表库无论是数据更新还是屏幕大小变化,都能快速响应并更新图表。数据生成和悬停查看都有舒服的交互动效,体验感很好。不仅支持配置颜色,外观定制也很方便。还支持…...

【Vulnhub 靶场】【Hms?: 1】【简单】【20210728】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hms-1,728/ 靶场下载:https://download.vulnhub.com/hms/niveK.ova 靶场难度:简单 发布日期:2021年07月28日 文件大小:2.9 GB 靶场作者:niveK 靶场系…...

浅谈C4模型

C4模型(C4 Model)是一种用于描述软件系统架构的轻量级模型,其目标是通过简化、清晰和易于理解的方式来表达系统的不同层次的架构信息。C4代表了“上下文”(Context)、“容器”(Container)、“组…...

SeaTunnel流处理同步MySQL数据至ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统,ClickHouse完美的实现了OLAP和列式数据库的优势,因此在大数据量的分析处理应用中ClickHouse表现很优秀。 SeaTunnel是一个分布式、高性能、易扩展、用于海量数据同步和转化的数据集成平台。用户只需要配置…...

Arduino stm32 USB CDC虚拟串口使用示例

Arduino stm32 USB CDC虚拟串口使用示例 📍相关篇《STM32F401RCT6基于Arduino框架点灯程序》🔖本开发环境基于VSCode PIO🌿验证芯片:STM32F401RC⌛USB CDC引脚: PA11、 PA12🔧platformio.ini配置信息&…...

Java开发框架和中间件面试题(4)

27.如何自定义Spring Boot Starter? 1.实现功能 2.添加Properties 3.添加AutoConfiguration 4.添加spring.factory 在META INF下创建spring.factory文件 6.install 28.为什么需要spring boot maven plugin? spring boot maven plugin 提供了一些像jar一样打包…...

【腾讯云中间件】2023年热门文章集锦

各位读者,大家好! 光阴似箭,日月如梭,仿佛冬奥会的盛况还在眼前,新的一年却即将到来。在过去的一年里,我们见证了腾讯云中间件在产品升级与创新方面的显著进步,包括消息队列TDMQ品牌全新升级和…...

SpringBoot 实现订单30分钟自动取消的策略

简介 在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。 本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例…...

Qt篇——QwtPainter::drawPie绘制扇形

QwtPainter::drawPie(QPainter *painter, const QRectF &rect, int startAngle, int angle); 一、参数含义: painter: 重绘函数中的painter对象 rect: 要绘制扇形的圆的外切矩形。 startAngle: 要绘制的扇形的起始角 …...

Mybatis Java API - SqlSession

正如前面提到的,​SqlSession​实例是MyBatis中最重要、最强大的类。它是您将找到执行语句、提交或回滚事务以及获取映射器实例的所有方法的地方。 SqlSession 类上有超过二十个方法,让我们将它们分成更易理解的组别。 Statement Execution Methods-语…...

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能,这里记录下部分功能,主要用到的是freemarker框架,spring就有带,我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…...

第38节: Vue3 鼠标按钮修改器

在UniApp中使用Vue3框架时&#xff0c;你可以使用按键修饰符来更精确地处理键盘事件。以下是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用.left、.right和.middle按键修饰符&#xff1a; <template> <view> <input keydown"handleKeyDown&…...

redis cluster判断key属于那个分片。

一、判断阿里云 redis cluster&#xff0c;的key属于那个分片。 阿里云特有的命令info key 可以查看key属于那个slot&#xff0c;那个分片 命令行查看&#xff1a; xxxx:6379> info key xxxx_compressed_xxx slot:4941 node_index:9 xxxx:6379> cluster keyslot xxxx_…...

Centos7:Jenkins+gitlab+node项目启动(3)

Centos7&#xff1a;Jenkinsgitlabnode项目启动(1) Centos7&#xff1a;Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启动(2) Centos7&#xff1a;Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启…...

Linux安装GitLab教程

Linux安装GitLab教程 1、配置yum源 相当于新建一个文件&#xff0c;通过这个文件来安装gitlab vim /etc/yum.repos.d/gitlab-ce.repo 把这些配置粘进去 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gp…...

react 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地&#xff08;内置了基础静态组件和模版&#xff09; git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务&#xff08;内置了json-server&#xff09; npm run serve 启动前端服务 npm…...

C基础使用

return 0; 语句用于表示退出程序。 一个程序有且只能有一个main函数的存在 安装编译环境&#xff1a; 安装vim: ubuntu里vim编辑器使用方法_ubuntu vim-CSDN博客 编译与运行&#xff1a; gcc hello.c //编译源文件 ./a.out //运行…...

Linux网络编程——Socket编程步骤及常用API

Sockt服务器和客户端的开发步骤 TCP connect()最好建立在listen()后&#xff0c;一旦监听到就建立连接。 UDP 常用API 包含头文件 #include<sys/types.h> #include<sys/socket.h>创建套接字&#xff08;连接协议&#xff09; 作用 用于根据指定的地址族、数据…...

数据挖掘 K-Means聚类

未格式化之前的代码&#xff1a; import pandas as pd#数据处理 from matplotlib import pyplot as plt#绘图 from sklearn.preprocessing import MinMaxScaler#归一化 from sklearn.cluster import KMeans#聚类 import os#处理文件os.environ["OMP_NUM_THREADS"] …...

医疗卫生行业网络安全需求发展

文章目录 一、行业安全建设需求分析1、等级保护2.0合规建设云计算技术大数据技术物联网技术移动互联网技术2、加强医疗数据安全保护加密存储与传输数据加强数据备份与恢复注重数据脱敏与分级保护3、强化网络安全制度管理完善应急预案与响应机制加强网络安全人员管理二、行业新技…...

【Unity热更新】学会AssetsBundle打包、加载、卸载

本教程详细讲解什么是AssetBundle压缩包机制!然后构建 AssetBundle、加载 AssetBundle 以及卸载 AssetBundle 的简要教程。这一个流程就是热更新! AssetBundles 简介 1.什么是AssetBundles? AssetBundles是Unity中一种用于打包和存储资源(如模型、纹理、声音等)的文件格…...

智能优化算法应用:基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于指数分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.指数分布算法4.实验参数设定5.算法结果6.…...

vue 监听浏览器关闭或刷新事件

vue 监听浏览器关闭或刷新事件 需求 web项目中使用socket时&#xff0c;涉及到关闭刷新浏览器多次连接问题&#xff0c;其中一个解决方法是在关闭或刷新浏览器时&#xff0c;将连接断开。 代码 <script> export default {// 可以在created、beforeMount或mounted生命…...

VuePress-theme-hope 搭建个人博客 2【快速上手】 —— 安装、部署 防止踩坑篇

续&#x1f446;VuePress、VuePress-theme-hope 搭建个人博客 1【快速上手】 项目常用命令 vuepress dev [dir] 会启动一个开发服务器&#xff0c;以便让你在本地开发你的 VuePress 站点。vuepress build [dir] 会将你的 VuePress 站点构建成静态文件&#xff0c;以便你进行后…...

ClickHouse基础知识(四):ClickHouse 引擎详解

1. 表引擎的使用 表引擎是 ClickHouse 的一大特色。可以说&#xff0c; 表引擎决定了如何存储表的数据。包括&#xff1a; ➢ 数据的存储方式和位置&#xff0c;写到哪里以及从哪里读取数据。 默认存放在/var/lib/clickhouse/data ➢ 支持哪些查询以及如何支持。 ➢ 并发数…...

关于设计模式、Java基础面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法&#xff1f; 细分起来就有9种&#xff1a;懒汉&#x…...

Python爱心光波完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…...

wordpress 模板 删除/最快的新闻发布平台

python中的import引用不了模块为什么我用from lianxi import*就可以引用&#xff0c;用import lianxi就不行坐在天台上&#xff0c;对着绯色初显的天空&#xff0c;捧着一盘西瓜&#xff0c;一口一口&#xff0c;将晚霞吃掉&#xff0c;吐出的籽就成了星星。python 中 用import…...

namecheap建站wordpress/搜索引擎营销推广

ubuntu一些基本软件安装方法 首先说明一下 ubuntu 的软件安装大概有几种方式:1。 deb 包的安装方式deb 是 debian 系 Linux 的包管理方式, ubuntu 是属于 debian 系的 Linux 发行版,所以默认支持这种软件安装方式,当下载到一个 deb 格式的软件后,在终端输入这个命令就能安装:su…...

wordpress siren主题/引流软件

我希望通过博客的形式记录自己项目和基础积累的过程&#xff0c;这篇是算法以及程序设计的开篇。 题目&#xff1a;poj1753 Flip Game Time:1000MS Mem:65536K 描述&#xff1a;黑白两面的棋子&#xff0c;给一个4*4棋盘&#xff0c;每轮可以翻动其中任意一个棋子&#xff0…...

网站开发用什么技术做好/seo优化培训课程

一开始博主项目中做的是跳转到浏览器下载 后面发现有的手机跳转后无法连接服务器 但是在浏览器访问连接又可以 还没发现什么原因 后面试了3种解决方案 &#xff08;改为 app内下载、更新&#xff09;如下&#xff1a; ios由于系统原因 只能跳转到 app stor 这里不讨论 注意…...

怎么做动态网站/网络推广官网首页

https://www.cnblogs.com/alimjan/p/7798295.html https://blog.csdn.net/qq_43847542/article/details/93412505 https://blog.csdn.net/qq_33696345/article/details/79989880 设计说明书以及功能演化 1&#xff1a; 单线程实现网络聊天室----》多线程实现----》线程池实现…...

合肥网站建设公司 招聘/微信引流推广怎么找平台

本文转载自&#xff1a;http://blog.jobbole.com/74951/ 在多数数据和机器学习的blog里&#xff0c;特征工程 Feature Engineering 都很少被提到。做模型的或者搞Kaggle比赛的人认为这些搞feature工作繁琐又不重要不如多堆几个模型&#xff0c;想入手实际问题的小朋友又不知道…...