【转载】浅谈蓝牙 Mesh 组网技术

2023-11-17

本文转载自 Eren:https://www.erenship.com/posts/63c7.html
蓝牙技术联盟官方网址:https://www.bluetooth.com/zh-cn/
蓝牙技术联盟公众号:BluetoothSIG
蓝牙技术联盟蓝牙Mesh相关参考此博客:蓝牙mesh — 解密蓝牙mesh系列文章汇总

本文主要根据蓝牙技术联盟(SIG)以及其官方微信公众号关于蓝牙 Mesh 组网的相关博文进行梳理,旨在对蓝牙 Mesh 组网技术有一个初步的认识。

前言

蓝牙 Mesh 脱胎于 CSR 倡导的私有协议- CSR Mesh,该技术诞生于 2014 年。

蓝牙技术联盟(SIG)于去年 7 月 19 日正式宣布,蓝牙技术开始全面支持 Mesh 网状网络。蓝牙 Mesh 组网是一种组网技术,蓝牙 4.0 以上支持低功耗蓝牙的芯片都支持。全新的 Mesh 功能提供设备间多对多传输,并特别提高构建大范围网络覆盖的通信能力,适用于楼宇自动化、无线传感器网络等需要让数以万计个设备在可靠、安全的环境下传输的物联网解决方案。如今,蓝牙适用的范围已经逐渐拓展到所有物联网边缘场景:“蓝牙增强速率技术(BR / EDR)” 的应用从无线耳机发展到鼠标键盘;“蓝牙低功耗技术” 应用于手表、手环,发掘了可穿戴市场;而“蓝牙 Mesh 组网技术”则瞄准了整个(边缘域)物联网市场,包括消费领域和工业领域[1]

低功耗蓝牙(BLE)

要讨论蓝牙 Mesh 组网技术就必须先说明低功耗蓝牙(Bluetooth Low Energy, BLE),因为蓝牙 Mesh 网络使用、并且依赖于低功耗蓝牙。低功耗蓝牙技术是蓝牙 Mesh 使用的无线通信协议栈[2]

首先蓝牙是一种短距离通信的无线电技术。其特点为:

  • 分散式网络结构;
  • 点对点或多点通信;
  • 快跳频和短包技术;
  • 工作在2.4GHz ISM 频段(Industrial Scientific Medical Band);
  • 时分全双工传输。

低功耗蓝牙泛指蓝牙 4.0 或更高的模块,蓝牙低功耗技术是一种低成本、短距离、可互操作的无线技术通信技术,工作在免许可的2.4GHz ISM 射频频段。相比于传统蓝牙(Classic Bluetooth,BT),低功耗蓝牙拥有更低的功耗,更远的传输距离,以及可以实现 AOA 室内定位。现如今的电子设备基本都配备 BLE 4.0 以上的蓝牙模块。例如我们的无线耳机,智能手环以及各种红黄蓝绿的单车等设备都使用到了低功耗蓝牙模块进行通信。

BLE 低功耗蓝牙和传统蓝牙有以下5大区别[5]

  1. 低功耗蓝牙的发送和接受任务会以最快的速度完成,完成之后蓝牙 BLE 会暂停发射无线(但是还是会接受),等待下一次连接再激活;传统蓝牙是持续保持连接;
  2. 低功耗蓝牙的广播信道(为保证网络不互相干扰而划分)仅有 3 个;传统蓝牙是 32 个;
  3. 低功耗蓝牙“完成”一次连接(即扫描其它设备、建立链路、发送数据、认证和适当地结束)只需 3ms;传统蓝牙完成相同的连接周期需要数百毫秒;
  4. 低功耗蓝牙使用非常短的数据包,多应用于实时性要求比较高,但是数据速率比较低的产品,遥控类的如键盘,遥控鼠标,传感设备的数据发送,如心跳带,血压计,温度传感器等;传统蓝牙使用的数据包长度较长,可用于数据量比较大的传输,如语音,音乐,较高数据量传输等;
  5. 低功耗蓝牙无功率级别,一般发送功率在 +4dBm,一般在空旷距离,达到 70m 的传输距离;传统蓝牙有3个功率级别,Class1,Class2,Class3,分别支持 100m,10m,1m 的传输距离。

蓝牙低能耗架构共有两种芯片构成:单模芯片和双模芯片。蓝牙单模芯片可以和其它单模芯片及双模芯片通信,此时后者需要使用自身架构中的蓝牙低能耗技术部分进行收发数据。双模芯片也能与标准蓝牙技术及使用传统蓝牙架构的其它双模芯片通信。

蓝牙 Mesh 组网

蓝牙 Mesh 技术并非无线通信技术,而是一种网络(组网)的技术,用于构建 “多对多通信连接” 的网络。

简单来说,蓝牙 Mesh 组网就是将众多的蓝牙设备互相连接,进而组成一个网络。各个蓝牙设备在网络中被称为节点(某些关键节点被称为网关)。各节点之间能够互相进行通信。

蓝牙 Mesh 能让我们建立无线设备之间的“多对多”(m:m)关系。此外,设备能够将数据中继到不在初始设备直接无线电覆盖范围内的其他设备。这样,Mesh 网络就能够跨越非常大的物理区域,并包含大量设备。

The new mesh capability enables many-to-many (m:m) device communications and is optimized for creating large-scale device networks. It is ideally suited for building automation, sensor networks, and other IoT solutions where tens, hundreds, or thousands of devices need to reliably and securely communicate with one another[2].

新的网状功能可实现多对多 (m:m) 设备通信,并为创建大规模设备网络进行了优化。它非常适合楼宇自动化、传感器网络和其他物联网解决方案,在这些方案中,几十台、几百台或几千台设备需要可靠和安全地相互通信。

对于满足日益普及的各种通信需求,Mesh 拓扑结构能提供最佳的方式,因此蓝牙 Mesh 网络应运而生,典型的应用包括楼宇自动化和传感器网络等。这些通信需求包括:

  • 覆盖面积广
  • “直联互通性”
  • 监测和控制大量设备的能力
  • 经优化的、低功耗的
  • 有效利用无线电资源,有可扩展性
  • 与当前市场上的智能手机、平板电脑和个人电脑产品兼容
  • 符合行业标准,具有政府级安全性

特性

  • 以消息为中心的通信

    蓝牙 Mesh 网络使用发布/订阅 (publish/subscribe)消息系统

    设备可以将消息发送至特定地址,这些地址的名称和含义与用户能够理解的高级概念相对应,如“花园灯”(Garden Lights)。这被称为“发布”(publishing)。

    设备经配置后,可接收由其他设备发送到特定地址的消息。这被称为“订阅” (subscribing) 。

    当设备向特定地址发布消息时,订阅该地址的所有其他设备将收到该地址的副本,对其进行处理,并以某种方式作出回应。

    想象一下花园里安装的一套户外灯, 每盏灯都已经过配置,以便其订阅“花园灯”消息。现在,想像一个蓝牙Mesh 电灯开关向“花园灯”地址发送了 “开” 的消息。没错,花园里的所有灯都会收到 “ON” 消息,并做出开灯的回应。Snipaste_2020-09-13_13-11-08

  • 消息和设备状态

    “状态” (state) 是蓝牙 Mesh 网络中的一个关键概念。蓝牙 Mesh 网络中的每台设备都具有一组独立的状态值,表示设备的某些状态。在花园灯的示例中,每盏灯都有一个状态值,表示设备当前是处于打开或关闭状态。通过发布一类在定义上意味着能够回应“开”或“关”状态值的消息,来改变状态值,蓝牙 Mesh 电灯开关就能对灯泡进行控制。更改状态值会修改设备本身的物理状况,例如打开或关闭设备。

    消息、状态、以及这些和其他概念相关的设备行为已被定义在规格中,称为“模型”(modules)。模型由蓝牙Mesh 设备实施。

  • 中继

    得益于 Mesh 网络,设备可以在非常广阔的区域中安装,同时彼此之间保持通信。想象一下购物中心、机场或办公大楼的占地空间有多广阔。因为存在墙壁和其他物理上的障碍物,楼宇中的设备可能无法与安装在同一楼宇远侧的设备、或临近楼宇中的设备建立直接的无线连接。而蓝牙 Mesh 网络则能够将网络中的某些设备指定为“中继设备”,进而解决这一难题。

    中继设备能够转发从其他设备接收到的消息。在转发消息时,它们能够与位于初始消息发布设备无线范围以外的设备进行通信。消息可多次被中继,每一次中继即为一 “跳”,最多可进行 127 跳,足以在一片广阔的物理区域中进行消息传输。

    Snipaste_2020-09-13_12-54-27

  • 管理型网络泛洪(Managed Flooding)

    蓝牙 Mesh 网络采用一种称为 “网络泛洪(flooding)” 的方式来发布和中继消息。这意味着消息不会通过某一进程进行路由, 也不会沿着由一系列特定设备构成的特定路径来进行传输。相反,传输范围内的所有设备都会接收消息,负责中继的设备能将消息转发至其传输范围内的所有其他设备。

    网络泛洪的优势在于无需特定设备专门扮演集中式路由器的角色。集中式路由器一旦发生故障,就可能会导致整个网络无法运行。没有特定的路由也可能对网络造成灾难性的影响,但这种情况也可以通过在 Mesh 网络中采用网络泛洪的方法来避免。

    网络泛洪的方式也意味着消息一般能够通过多重路径到达其目的地。这就构建了一个相当可靠的网络。

    • 优化 Mesh 网络

      蓝牙 Mesh 网络也采取了一系列措施,支持采用网络泛洪的方式,同时优化每台设备、甚至整体网络的能耗。

      所有数据包都包含一个称为 TTL 的字段,它可用于限制消息中继的跳数。由设备间歇性发送的心跳消息中包含的信息,能够让网络了解其拓扑结构、以及传到其他每台设备之间的跳数。这能够让设备将 TTL 设置为最佳值,从而避免不必要的中继操作。

      每台设备都包含消息缓存,以确定自身是否已经中继过该消息。如果是,则会立即丢弃该消息,从而避免上层堆栈进行不必要的处理。

    功率非常受限的设备(例如由小型电池持续供电多年的传感器)可能被指定为 “低功耗节点”。低功耗节点能够与一个或多个被指定为 “friends” 的设备协同工作。Friends 并非功率受限,它可以作为低功耗节点,存储寻址到这一低功耗节点的消息,并且只有在低功耗节点需要时才传送消息。低功耗节点和 “friends” 之间的关系理所当然就称为 “friendship”。

基本术语

  • 节点(Node)

    蓝牙 Mesh 网络中的这些设备被称为节点 (node) 。每个节点都能发送和接收消息。信息能够在节点之间被中继,从而让消息传输至比无线电波正常传输距离更远的位置。

  • 元素(Elements)

    一些节点(如传感器)的电池有可能会被耗尽,而其他节点(如照明设备、制造机械和安防摄像机)则会通过主电网来获取电力。一些节点的处理能力会高于其他节点。这些节点在 Mesh 网络中可承担更为复杂的任务,扮演不同的角色,表现出 以下四个节点特征(Features)

    低功耗 (Low-Power) 特性

    功率受限的节点可能会利用低功耗特性来减少无线电接通时间并节省功耗。同时低功耗节点(LPN)可以与friend 节点协同工作。

Friend 特性

功率不受限的节点很适合作为 friend 节点。Friend 节点能够存储发往低功耗节点(LPN)的消息和安全更新;当低功耗节点需要时再将存储的信息传输至低功耗节点。

中继 (Relay) 特性

中继节点能够接收和转发消息,通过消息在节点之间的中继,实现更大规模的网络。节点是否能够具备这一特性取决于其电源和计算能力。

代理 (Proxy) 特性

代理节点能够实现 GATT 和蓝牙 Mesh 节点之间的 Mesh 消息发送与接收。承担这一角色的节点需要固定的电源和计算资源。

Snipaste_2020-09-13_13-46-07

一些节点的复杂性高于其他节点,由多个称为元素(Element)的独立部分组成。每个节点至少拥有一个元素,称为主元素(Primary Element),同时还可能包含其他多个元素。

Snipaste_2020-09-13_13-28-21

元素由定义节点功能和元素条件的实体组成。例如,一个灯泡内有一个元素, 并具有两种功能:

节点 = 灯泡

一个元素 = 主元素

节点功能:

​ - 开/关

​ - 亮度

元素条件/状态:

​ - “开”或“关”

​ - 0 – 10 (亮度等级)

节点中的每个元素都有一个唯一的地址,称为单播地址(unicast address),使每个元素都有址可寻。

  • 模型 (Model) 和状态 (State)

    无论节点位于制造厂房、酒店、办公楼、还是商业园区的网络中,节点的基本功能都由模型(Model)来定义和实施。模型位于元素内,元素必须具有至少一个模型。模型能够定义并实施节点的功能和行为,而状态 (State) 能够定义元素的条件

    Snipaste_2020-09-13_13-31-29

    以灯泡为例,该模型的功能是开关和调节亮度。相关的状态分别为 “开” / “关” 和 0-10:

    模型 (节点功能)

    1. 开/关

    ​ 状态 -> “开” 或 “关”

    2. 亮度 (0-10)

    ​ 状态 -> 0-10

  • 蓝牙 Mesh 支持复合状态,即由两个或多个值组成的状态。变色灯就是这样的一个例子,色调可以不受颜色饱和度或亮度的局限而改变。

    “绑定状态” (Bound State) 这一术语的定义源自一种状态的变化导致另一状态变化的情况。级别状态和开/关状态通常就相互绑定。如果级别从0变为1,则“开/关”的状态也从“关”变为“开”。

    每个模型都有唯一的标识符。蓝牙技术联盟采用 16 位的模型,而供应商采用 32 位(其中包含蓝牙技术联盟指定的16位公司标识符以及16位供应商指定的模型标识符)。这确保了每个模型的地址都独一无二并且能确定被寻址到。

    蓝牙 Mesh 网络可借助消息,通过客户端 - 服务器架构进行通信。服务器的功能是暴露元素的状态。最简单的状态之一是二进制开关,其中状态为“开”或“关”。简单的服务器模型是通用开/关服务器模型 (Generic On/Off Server Model) ,其中包含表示开关开启或关闭的状态。

    客户端可对状态进行访问,请求、更改或使用服务器的状态。举例来说,一个简单的客户端模型就是通用开/关客户端模型(Generic On/Off Client Model)(二进制开关)。通用开/关客户端模型通过发送消息来控制通用开/关服务器模型。例如,客户端可利用这一机制开启或关闭指示灯。

    协议栈

    蓝牙 Mesh 网络引入了全新的协议栈。这一协议栈建立在低功耗蓝牙技术之上。下图描绘了协议栈的层级

    Snipaste_2020-09-13_13-48-12

    • 承载层(bearer layer):承载层定义了如何使用底层低功耗堆栈传输 PDU。目前定义了两个承载层:广播承载层(Advertising Bearer)和 GATT 承载层。
    • 网络层(network layer):网络层定义了各种消息地址类型和网络消息格式。中继和代理行为通过网络层实施。
    • 底层传输层(lower transport layer):在需要之时,底层传输层能够处理 PDU 的分段和重组。
    • 上层传输层(upper transport layer):负责对接入层进出的应用数据进行加密、解密和认证。它还负责称为 “传输控制消息”(transport control messages)这一特殊的消息,包括与 “friendship” 相关的心跳和消息。
    • 接入层(access layer):负责应用数据的格式、定义并控制上层传输层中执行的加密和解密过程,并在将数据转发到协议栈之前,验证接收到的数据是否适用于正确的网络和应用。
    • 基础模型(foundation models):基础模型层负责实现与 Mesh 网络配置和管理相关的模型。
    • 模型(models):模型层与模型等的实施、以及诸如行为、消息、状态等的实施有关。

    节点(如照明装置、温控设备、制造设备和电动门)是蓝牙 Mesh 网络中能够发送、接收或中继消息的设备。消息(message)用于在节点之间传输数据,地址(address)用于定义消息源(source)地址和目的(destination)地址。

    地址(Address)

    地址有四种类型,其中的三类用于消息的传送:单播(unicast)、虚拟(virtual)和群组(group)地址。第四种被称为未分配(unassigned)地址。地址长度为16位,并按下述定义进行编码。

    640

    未分配地址(Unassigned Address)

    未经配置的元素或未被指定地址的元素拥有的就是未分配地址。鉴于这些元素没有唯一的地址,它们不会用于消息的传送。

    单播地址(Unicast Address)

    在“启动配置”(provisioning)期间,启动配置设备(provisioner)会在网络节点的生命周期内为节点中的每个元素分配一个单播地址。单播地址可能出现在消息的源地址字段或目的地址字段中。发送到单播地址的消息只能由一个元素进行处理。

    虚拟地址(Virtual Address)

    虚拟地址是与特定的 UUID 标签相关联的一组元素;这些地址可能会被发布或订阅。UUID 标签是与多个来自一个或多个节点的元素相关联的 128 位值。

    对于虚拟地址,15 和 14 位分别设置为 1 和 0;13 – 0 位被设置为散列值(hash value)(提供 16384 个散列值)。散列(hash)来自于 Label UUID。使用订阅元素(subscribing element)来检查完整的 128 位 UUID 是十分低效的,特别当 UUID 跨越多个消息段时更为低效。散列值提供了一种更为有效的方式来确定哪些消息被发送至哪些元素。

    群组地址(Group Address)

    群组地址是蓝牙 Mesh 网络中的另一种多播地址(multicast address),它通常代表一个或多个节点中的多个元素,包含两种类型:

    • 动态分配的地址(Dynamically Assigned) -> 0xC000-0xFEFF
    • 固定地址(Fixed Address) – 由蓝牙技术联盟分配,分为五段。

    消息(Message)

    蓝牙 Mesh 网络通过消息进行通信。消息可以分为控制消息和接入消息。

    控制消息(Control Message):与蓝牙 Mesh 网络操作有关的消息,例如心跳(heartbeat)和 friend 的请求消息。

    接入消息(Access Message):该类消息允许客户端模型检索或设置服务器模型中的状态值,或被服务器用于报告状态值。

    模型可实施并定义节点的功能。元素是节点内唯一可被寻址的实体(节点中可包含一个或多个模型),并由状态(state)定义元素的状况变化。对于每个状态,都有一组服务器模型支持的消息。例如请求状态值或请求改变状态的客户端模型、以及发送状态或状态改变相关消息的服务器模型。

    接入消息分为两类:经确认的(acknowledged)和未经确认的(unacknowledged)。经确认的消息被发送至每个接收元素,并经其确认。响应通常为状态消息。对于未经确认的消息则不作出响应。例如蓝牙 Mesh 网络的状态消息就是一种未经确认的消息。

    安全(Security)

    所有蓝牙 Mesh 网络消息的安全保障都来自网络密钥(NetKey)和应用密钥(AppKey)对消息的加密和验证。NetKey 用于网络层通信。假设蓝牙 Mesh 网络没有子网,则该 Mesh 网络内的所有通信都使用相同的网络密钥。

    AppKey 用于应用程序的数据。网络中的一些节点具有特定应用,并且根据应用的需要对一些潜在敏感数据的访问进行限制。这些节点具有特定的 AppKey,并与特定应用相关联。会使用不同 AppKey 的领域通常包括安全(楼宇门禁、机房门禁和 CEO 办公室门禁)、照明(制造厂房、外部楼宇照明和人行道)和 HVAC 系统。

    中继节点(relay node)(如灯泡或墙壁开关)通常具有有效的 NetKey,能够在网络内中继敏感性消息。然而,这些节点无法访问各种限制区域(如楼宇控制或 HVAC 系统)的特定 AppKey,,亦无法解密应用程序的数据。

    启动配置(Provisioning)

    启动配置的全过程包括大概 5 个步骤[1], 分别是:

    • Beaconing: 发送Beacon信号,告诉你我要配网, 这里使用的是新定义的 AD 广播包类型, Mesh AD;
    • Invitation: 配网者 Provisioner 听到了这个 Beacon 以后, 就发一个邀请, 用的就是配网邀请 PDU(Protocol Data Unit);
    • Exchanging Public Keys: 交换公钥;
    • Authentication: 一个互动随机数的认证流程;
    • Distribution of the Provisioning Data: 认证完成, 从公钥和两个设备的私钥派生出 Session Key,后面的配网的信息交互的过程会用这个 Session key 来加密, 配网成功以后, 就会根据最后一步里面包含交换的 NetKey 来加密后面的数据交换

    信息交换

    蓝牙 Mesh 网络使用发布/订阅 (publish/subscribe) 模型来进行消息传输。生成消息的节点会发布消息。需要接收消息的节点会订阅它们所需的地址。消息可被发布至单播、群组或虚拟地址。

    消息可以作为对其他消息的回复而发送,也可以作为非请求消息(unsolicited messages)被发送。当模型发送回复消息时,使用消息始发处的源地址作为目标地址。发送非请求消息时,模型将使用模型的发布地址作为目标地址。节点中的每个模型都有一个发布地址。

    接收消息时,节点内模型(节点中可能存在多个模型)中的每个实例均可通过订阅方式从一个或多个群组或虚拟地址接收消息。

    订阅消息的模型使用模型的订阅列表来定义用于接收消息的有效地址。当模型接收到消息时,模型将检查其订阅列表。当订阅列表上的地址设置为模型的元素单播地址或属于该节点的固定群组地址时,则视为一个匹配(match)。下图表示了接入消息的有效源地址和目标地址。

    640 (1)

    蓝牙 Mesh 实体发布各种节点的状态时,无论其与发送数据的节点位置距离远近,整个蓝牙 Mesh 网络中的系统均可订阅该数据。这就实现了网络一端的设备可通过低功耗无线消息与设施中的其他的管理者进行对话,而不受距离限制。

    进阶篇

    后记

    虽然蓝牙 Mesh 组网技术的协议早已提出,但个人感觉相关 SDK 开发包仍不太成熟。不过未来应用场景仍然是可以畅想的。

    正如蓝牙兴趣联盟所畅想的一样:

    我们期待蓝牙 Mesh 网络广泛应用于各行各业和各种应用,预计最初会从楼宇自动化、商业照明和传感器网络等应用开始。尤其令人兴奋的是蓝牙 Mesh 网络在商业照明方面的应用。试想一下,有了正确的固件,照明系统能实现的就不仅是无线灯光控制,还能够成为楼宇中各种蓝牙服务的平台,如物资跟踪和定位服务!

    参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转载】浅谈蓝牙 Mesh 组网技术 的相关文章

  • ESP32的WIFI的STA模式&调控ESP32蓝牙和WIFI发射功率

    以下相关API接口的定义可进入l乐鑫官方查看 Wi Fi 库 ESP32 ESP IDF 编程指南 v4 4 文档 STA模式配置过程 include
  • 公司章程变更需要经过哪些程序

    公司章程变更需要经过以下程序 1 提议修改公司章程 一般由董事会提出修改建议 董事会是公司经营的决策机构 对公司经营情况以及章程的执行和变化情况较为了解 能够对公司章程的修改提出具有积极意义的建议 2 将修改公司章程的提议通知股东 公司章程
  • 蓝牙-基础篇-蓝牙简介

    文章目录 蓝牙特点 蓝牙功能 蓝牙的两种技术 蓝牙特点 低功耗 短距离 跨设备 蓝牙功能 跨设备传输流式音频 跨设备传输数据 广播信息 蓝牙的两种技术 传统蓝牙技术 蓝牙版本2 0 2 1 即Basic Rate Enhanced Data
  • Linux及Windows下编译exosip和osip2源码

    eXosip库及编译流程简介 1 eXosip库的简介 1 1 osip简介 osip2是一个开放源代码的sip协议栈 是开源代码中不多使用C语言写的协议栈之一 它具有短小简洁的特点 专注于sip底层解析使得它的效率比较高 但缺点也很明显
  • 智能家居 (2) ——设计模式的引入

    目录 设计模式的概念引入 工厂模式的实现 animal h mainPro c cat c dog c person c 工厂模式的功能验证 往期文章 设计模式的概念引入 工厂模式的实现 所有代码最好在Source Insight下编写 并
  • MOS管的知识,看这一篇就可以了

    转载 21ic电子网 2020 11 15 18 19 以下文章来源于记得诚电子设计 作者记得诚 记得诚电子设计 分享电子硬件知识 永远相信美好的事情即将发生 今天的文章简单总结一下MOS管 如下是本文目录 场效应管分类 场效应管分为结型
  • 蓝牙设备中的Device UUID 与 Service UUID

    Device UUID也可以被称作为DeviceID Android 设备上扫描获取到的 deviceId 为外围设备的 MAC 地址 相对固定 iOS 设备上扫描获取到的 deviceId 是系统根据外围设备 MAC 地址及发现设备的时间
  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被
  • ESP32-C2开发板 Homekit烧录教程

    准备 1 1硬件ESP32 C2开发板 如图1 1所示 图1 1 ESP32 C2开发板 1 2软件 CozyLife APP可以在各大应用市场搜索下载 也可以扫描二维码下载如图1 2所示 HomeKit flash download to
  • 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构

    什么是蓝牙 在开启基于蓝牙Spec v5 2的学习前 我们先了解下什么是蓝牙 蓝牙在我们日常生活中又存在哪些实际应用呢 蓝牙无线技术是一种短距离无线通信系统 其核心特性主要是以下三点 robustness 鲁棒性 抗干扰能力强 Low po
  • 智能家居地址

    http blog yeelink net p 509
  • 蓝牙ble tips3-MAC地址

    和计算机网络IP地址类似 BLE也会有属于自己的一个地址 BLE设备地址 蓝牙地址 也称作 Bluetooth MAC Media Access Control 地址 是一个48位的唯一硬件标识符 用于在蓝牙设备之间建立连接和通信 它由全球
  • STM32项目--基于STM32的办公室安保(智能家居)系统设计

    基于嵌入式系统的办公室安保系统设计 简介 设计一套基于STM32的办公室安防系统 系统内部包括门禁系统 灾害报警系统 人脸识别系统和交互中心四个子系统 门禁系统 主要实现对门禁卡的存储和读取并识别已存储卡片的信息并控制开门 如读取卡片为未存
  • 如何在 Windows Core IoT 应用程序中显示当前时间的时钟?

    我正在尝试创建一个在 Raspberry Pi 2 上无头运行的 Windows 10 IoT 应用程序 一切都设置正确 我可以使用 Raspberry Pi 作为远程机器进行调试 从 Visual Studio 进行调试 现在我想在应用程
  • 如何实现MQTT网关连接各类工业物联设备,实现数据传输与控制

    MQTT是一种轻量级的发布 订阅消息传输协议 专门为低带宽 高延迟或不稳定的网络环境设计 它支持离线消息存储 使客户端在未连接到服务器时也能接收到消息 MQTT网关是一种采用MQTT协议的网关设备 可以连接不同类型的工业物联设备 实现设备之
  • Spring Boot 应用程序一天后冻结

    我有一个 Spring Boot 应用程序在两台服务器上运行 它接受文件上传请求 约 1 KB 通过来自 1000 个物联网设备的控制器 另外还有一个TCP监听器它还接受来自这些物联网设备的 GPS 数据作为流 我已将一台服务器上的 Tom
  • sim800L GPRS 发布请求

    我一直在研究 LoNet 迷你 GSM 模块 SIM800L 并将其与 Arduino 连接 我已插入 SIM 移动卡并且可以连接互联网 通过串行监视器 我可以毫无问题地与它通信 但是当向网络服务器页面发出 GET 或 POST 请求时 它
  • Eclipse Californium CoAP 通配符作为 url 路径

    我正在使用 Eclipse Californium 开发一个 CoAP 应用程序 它将仅显式声明根资源路径 其余资源应通过通配符提供和解析 root 就像在 REST API 或 servlet 上一样 有什么办法可以实现这一点吗 好吧 我
  • 将数据从 Azure HUB-IOT 保存到 Azure SQL 数据库

    我最近创建了一个 Azure Hub IOT 其中我从虚拟设备发送一些数据 我知道数据已到达 因为我可以从终端看到它们 但现在我想获取这些数据并将它们保存到 Azure SQL DataBase 中 我怎样才能做到这一点 如果有人可以向我解
  • 请求/响应的 MQTT 主题名称

    我正在设计一个包含许多设备的系统 使用 MQTT 连接到中央代理 有些主设备可以向某些从设备发送请求 来自一台主机的请求通常会发送给一台从机 请求的主题可以是 mysystem slaveId req 因此从站可以订阅该主题 并且主站可以发

随机推荐

  • (已解决)DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`.

    DeprecationWarning np float is a deprecated alias for the builtin float To silence this warning use float by itself Doin
  • upload-labs-1

    打开第一关 通过查看源码我们可以发现第一关属于前端验证 我们可以将浏览器JS代码禁用掉 禁用JavaScript
  • [图形学] 《Real-Time Rendering》碰撞检测(二)

    reference Real Time Rendering 目录 17 前言 17 1 和射线的碰撞检测 17 2 使用BSP树的动态碰撞检测 17 3 一般层次的碰撞检测 17 3 1 分层的构建 17 3 2 不同层之间的碰撞检测 17
  • 验证码图片实现

    使用验证码进行验证 自动生成验证码 后台实现 package common makeCertPic import java awt Color import java awt Font import java awt Graphics im
  • 第15课:生活中的命令模式——大闸蟹,走起

    用程序来模拟生活 从剧情中思考命令模式 命令模式 命令模式的模型抽象 代码框架 类图 模型说明 实战应用 应用场景 故事剧情 David 听说阿里开了一家实体店 盒马鲜生 特别火爆 明天就周末了 我们一起去吃大闸蟹吧 Tony 吃货 真是味
  • 前端三剑客---HTML&CSS&JavaScript

    HTML CSS JavaScript 1 HTML 1 1 介绍 1 2 快速入门 1 3 基础标签 1 3 1 标题标签 1 3 2 hr标签 1 3 3 字体标签 1 3 4 换行标签 1 3 5 段落标签 1 3 6 加粗 斜体 下
  • diagnose-tools 编译报错

    在 Ubuntu 20 04 4 LTS 环境中 编译diagnose tools 执行make deps时报错 checking whether gcc m32 makes executables we can run no config
  • ValueError: Buffer dtype mismatch, expected ‘unsigned char‘ but got ‘long‘

    在使用pydensecrf进行densecrf时出现ValueError def dense crf img probs n labels 2 h probs shape 0 w probs shape 1 probs np expand
  • NBA GLOSSARY

    NBA 全称 National Basketball Association 美国国家篮球协会 DRAFT draft dr ft n 选秀 R1 Round one 第一轮 St Vincent St Mary HS OH Saint V
  • electron-builder打包过程中报错——网络下载篇(转)

    在electron使用electron builder打包过程中需要用到几个github上的包 但是由于网络原因 会科学上网的同学基本不用看了 下载不下来 导致出错 一 electron v8 2 0 win32 x64 zip 如下图 导
  • MCP4725介绍和STM32模拟IC2驱动

    一 MCP4725 简单总结为下面几个特点 1路DAC输出 12位分辨率 I2C 接口 标准 快速 高速支持 供电电压2 7 5 5 内部EEPROM存储设置 I2C地址可配置 A0 A1 A2内置 默认为 00 二 硬件设计 MCP472
  • torch 测试GPU能否正常使用

    运行程序 import torch print torch cuda is available num gpu 1 Decide which device we want to run on device torch device cuda
  • 介绍D3DPOOL和Lock

    介绍D3DPOOL和Lock 分类 DirectX 2013 02 28 00 21 322人阅读 评论 0 收藏 举报 D3D RUTIME的内存类型 分为3种 VIDEO MEMORY VM AGP MEMORY AM 和SYSTEM
  • 最能感动女人的十大瞬间

    拉着手在街上闲逛 忽然之间 他将她拽停 伸手轻轻地将眼睑下的一根睫毛拨开 她顿感幸福 拨走睫毛不过是弹指之间的小事 却充分说明他对她的注意力100 集中 要不是他喜欢仔细地偷看她 怎能发现刚跌落的一根细小睫毛 没有一个女人 能够抵抗男人如此
  • Java爬虫框架WebMagic的使用总结

    最近 项目做一个公司新闻网站 分为PC 移动端 h5 数据来源是从HSZX与huanqiu2个网站爬取 主要使用Java编写的WebMagic作为爬虫框架 数据分为批量抓取 增量抓取 批量抓当前所有历史数据 增量需要每10分钟定时抓取一次
  • CSS3 弹性盒子(flex、flex-direction属性、flex-wrap属性、align-items属性、align-content属性)详解

    文章目录 flex flex direction 属性 flex wrap 属性 align items 属性 align content 属性的使用 flex 在 CSS3 中给 display 属性增加了新的属性值 flex 如果一个元
  • 关于MFC中使用ShellExecute出现的进程冲突问题

    目录 问题背景 问题分析 问题背景 现在有一个MFC写的界面程序 以及一个外部exe文件 用户通过界面选择文件a MFC将文件a的路径作为参数 调用exe文件生成一个解析文件b 然后MFC再读取这个文件b 为了完成这一目的 就需要在MFC中
  • Airtest IDE 使用方法

    1 assert exists 找到图片则返回图片坐标 否则报错 raise AssertionError 引发断言错误 2 assert not exists 没找到图片则返回None 否则报错 raise AssertionError
  • 项目实战——文档扫描OCR识别

    扫描全能王的实现 maybe 目录 一 文档扫描 1 引入所需要的库 2 图像的读取与预处理 读取图像 图像reszie 图像灰度化 滤波 边缘检测 3 轮廓检测 4 透视与二值变换 二 文字识别 一 文档扫描 文档扫描所实现的功能如下图所
  • 【转载】浅谈蓝牙 Mesh 组网技术

    本文转载自 Eren https www erenship com posts 63c7 html 蓝牙技术联盟官方网址 https www bluetooth com zh cn 蓝牙技术联盟公众号 BluetoothSIG 蓝牙技术联盟