6LoWPAN Mesh
本指南提供了在 6LoWPAN 网状网解决方案之上开发应用程序的设计指南。这里不详细讨论 API 和技术。
6LoWPAN 网络概述
通常,6LoWPAN 网络由多个低功率节点上的一个边界路由器组成。节点连接到云服务,用于馈入传感器或控制数据。
6LoWPAN 网络中的不同设备类型
在 6LoWPAN 网络中,设备可以具有不同的角色。插图中的颜色代表不同的设备类型,并在本教程的示例中使用。
边界路由器(6LBR)
边界路由器是 6LoWPAN 网络的协调器。它处理 6LoWPAN 和 IPv6 网络之间的转换。由于地址空间有限,Arm 无法向 IPv4 网络提供转换。我们建议在此类环境中运行时,使用 IPv4 网络上的 IPv6 隧道。
边界路由器还验证加入网络的节点并跟踪路由拓扑。
6LoWPAN 路由器(6LR)
6LoWPAN 路由器是可以路由数据包的节点。此角色是形成拓扑或网状网络所必需的。此配置不允许节点休眠,因为它们将数据包路由到其兄弟节点。
6LoWPAN 主机(6LH)
6LoWPAN 主机是一种不路由任何数据包的节点。它只有一个父路由数据包。
6LoWPAN 困主机
6LoWPAN 困主机是 6LoWPAN 主机,定期允许其睡眠并关闭其无线电。
不同类型的 6LoWPAN 网状网络
基于 6LoWPAN 的网状网络不能被描述为统一的标准化网络类型,例如 Wi-Fi。根据业务要求和用例,网络可能具有不同的设置和要求。
星型网络
星型拓扑是网状网络的最简单形式。实际上,它根本不是网状物。每个节点直接连接到边界路由器。
在星型网络中,节点可以是具有最少 RAM 量的非常低功耗的设备,因为它们没有路由责任。它还允许睡眠节点。
网状/树状网络
在网状/树状网络中,所有节点都配置为 6LoWPAN 路由器。
在 6LoWPAN 网络中,RPL 协议用于形成路由拓扑。每个节点都选择一个主要父节点进行路由,因此结果看起来像一棵树。
此网络类型允许覆盖大区域,因为每个节点都扩展了网络的范围。但是,数据包在每一跳上重传,这意味着网络的传输容量随着网络规模的增加而减少。
示例网络
在后面的章节中,我们提供了三种不同网络规模的建议:
- 公寓的传感器网络。
- 建筑物的传感器/执行器网络。
- 城市的传感器/执行器网络。
Thread 网络栈简介
为什么要使用 Thread
Thread 的设计考虑了一个目标;创造在家中连接和控制产品的最佳方式。Thread 的主要特点是:
- 专为家庭设计。
- 内置安全性。
- 针对电池供电设备进行了优化。
- 利用 IPv6 协议。
- 强大的网状网络。
- 易于设置和使用。
线程栈基于 IPv6 通过低功耗无线个人局域网(6LoWPAN)构建,其本身构建在 IEEE 802.15.4 上以提供基于 IP 的网络。 互联网协议(IP)提供了跨 IP 网络中继数据报的核心机制,其路由功能可实现网络互联。
阅读 Thread Group 网站上的更多内容。
为什么 Mbed OS 有 Thread 栈
Mbed OS 是一个开源嵌入式操作系统,专门用于促进大规模商业化,基于标准的物联网解决方案的创建和部署。Mbed OS 完全支持 Thread,可简化家庭中安全 IoT 应用程序的开发,并简化 Thread 产品认证。Mbed OS 线程堆栈是经过线程组认证的组件。
Mbed Thread 基于 Mbed OS 关键元素
Mbed OS 的关键要素是:
- 硬件平台无关层,可轻松适应新硬件组件。
- 模块化方法,允许根据应用程序需求包含必要的库。
- 安全性中的多层构建(SW/HW)可帮助您保护物联网解决方案。
- Mbed RTOS(Arm CMSIS-RTOS)提供实时软件执行。
- 工具链和 IDE 支持。
Mbed Thread 在 Nanostack 库中实现,该库也支持 6LoWPAN 协议。在 Mbed OS 中,Thread 栈使用内部事件调度程序在其自己的 RTOS 线程中运行。Mbed OS 提供了用于构建 Thread 应用程序的 Mesh C++ API。
- 要连接到 Thread 网络,请使用 Thread 接口 API。
- 对于 Thread 网络上的套接字通信,请使用 Mbed 套接字 API。
Nanostack 提供了一组具有更多功能的 C API 头。nanostack 存储库具有以下头文件:
thread_management_if.h
用于初始化栈和管理网络数据。thread_commissioning_api.h
用于实现网状或本机 Thread 专员。thread_border_router_api.h
用于实现 Thread 边界路由器。thread_diagcop_lib.h
用于构建和解析 Thread 诊断协议 TLV 消息。thread_meshcop_lib.h
用于构建和解析 Thread mesh 调试协议 TLV 消息。thread_net_config_api.h
用于进行邻居发现(AND)数据请求。
可以在 Mbed OS 上构建的 Thread 设备
Mbed OS Mesh API 允许您定义 3 种类型的设备:
- 路由器启用设备(REED),可以成为活动路由器。
- 困尾终端设备(SED)。
- 最小终端设备(MED)。
此外,Nanostack API 允许您定义完整终端设备(FED)设备类型。
在大多数情况下,REED,MED 和 SED 配置足以构建网络。在 SED 设备中,在休眠时间期间关闭无线电。要充分利用 SED 配置,应用程序开发人员必须在设备中实现休眠过程。
有关终端设备或路由器示例,请参阅网格最小示例。
终端设备
Mbed OS 为不同的线程终端设备类型提供单独的配置。通常,终端设备是 Thread 网络中受约束最多的设备。它们充当网状拓扑中的最后一跳。诸如普通传感器,控制器和开关之类的设备只能作为终端设备实现。对于最受约束的硬件,最小端设备(MED)或困端设备(SED)是最佳选择,因为由于功能有限,实现需要最少量的 flash 和 RAM 存储器。请注意,困终端设备在父设备上也需要更多资源。终端设备通过父设备进行通信,如果当前连接中断,则可以切换到另一个父设备。
Thread 网络不仅适用于终端设备。必须有路由器设备,可以通过边界路由器在节点之间路由流量到后端网络。
最小终端设备(MED):
- 将其地址注册给单亲。
- 在父级上依赖所有路由和地址查询。
- 如果父母遗失,必须开始新的扫描;更长时间与网络脱节。
睡眠终端设备(SED)就像 MED,但是:
- 不要一直保持电台。
- 使用轮询机制从父节点接收数据包(轮询时间可配置)。
- 要求父进程在睡眠时存储数据包。
- 可以暂时切换到 MED 以传输大量数据。
全端设备(FED):
- 不向父母注册地址。
- 进行地址查询。
- 侦听来自其他设备(父节点以外的设备)的多播消息。
- 与 MED 和 SED 相比,减少了父设备的负载和内存要求。
路由器
在 Thread 网络中,设备以其提供的服务分隔的几个特定角色运行。所有路由器设备都提供网状路由,它们可以在活动路由器和 REED 设备之间切换状态,而无需任何用户交互。网络上的第一个路由器成为领导者,管理:
- 路由器 ID 分配。
- Thread 网络数据注册。
- 网络数据分发。
- 专员请愿。
此外,路由器可以充当边界路由器(必须在构建时配置),为线程网状网络和骨干网络内的设备提供服务。
Mbed OS 为 Thread 边界路由器提供单独的构建。边界路由器将 IPv6 流量路由到外部 IPv6 网络。目前,我们的边界路由器使用以太网连接到骨干 IP 网络,但也可以使用其他连接方式(蜂窝或 WiFi)。
请参阅 Thread 边界路由器的示例。
调试
当需要将新设备添加到 Thread 网络时进行调试。所有 Mbed OS Thread 设备(终端节点和路由器)都可以加入任何经过认证的 Thread 网络。在 Thread 中,可以有一个委员,允许新设备加入网络。委员会有三种类型:
- 本地专员使用 802.15.4 无线电接口,但不属于 Thread 网络。
- on-mesh 专员是已经加入 Thread 网络的 Thread 设备。
- 外部专员通过边界路由器连接到 Thread 网络,该路由器连接到主干网。
用于外部调试的示例用例
外部专员使用 mDNS-SD 服务发现来查找可用 Thread 网络的列表。选择要连接的网络时,应用程序会询问网络密码。密码短语通常放在边框路由器盒上的标签上(如 WiFi 中)。
专员申请从以下位置生成 PSKc:
- 网络密码。
- Thread 网络名称。
- 扩展的 PAN ID。
在扫描阶段接收 Thread 网络名称和扩展 PAN ID。委托人应用程序现在可以使用生成的 PSKc 启动 DTLS 会话。
在认证阶段之后,专员请求 Thread 网络负责人请求委员成为授权专员。这里,边界路由器在中间用作仲裁器。
现在,Thread 网络已准备好接受新的 joiner 设备。
- 专员应用程序从设备的标签扫描 QR 码,即 PSKd(设备的预共享密钥)+ EUI64,并通知线程网络该设备被网络接受。
- 加入者设备在扫描响应中检测到它现在可以加入网络并使用 PSKd 启动 DTLS 会话。
- 会话通过 Thread 网络(通过 joiner 路由器和边界路由器)创建到委托应用程序。
- 专员对设备进行身份验证并将其接受到网络。
- 设备接收 Thread 配置,允许它加入。
注意: Thread 使用散列和椭圆曲线算法进行安全通信。PSKd(s)和 EUI64(s)永远不会通过对等连接以纯文本形式传输。
如何从 Mbed OS 开始
Mbed OS 线程堆栈支持所有三种类型的委员。您可以使用 Thread MeshCoP 协议创建外部专员应用程序,或使用 Mbed OS API(thread_commissioning_api.h)实现本机或网状专员。目前,没有针对原生或在线委员的参考实施。通过 Nanostack 边界路由器支持外部调试。外部调试应用程序(Android)已经可用。 IOS 版本即将推出。
请参阅 Thread 调试指南如何在实践中将线程设备调试到网络。
Mbed OS Thread 实现的成熟度
Mbed OS 提供经过认证的 Thread 1.1 栈实现。
除了线程组认证,其重点是确保与不同实现的互操作性,Arm Mbed 团队专注于提供 Thread 实现中所需的软件组件的高质量实现。我们投资了自动化测试环境,在那里我们可以验证所有变更请求以及常规版本。
为了确保高质量,每天都会测试 Mbed OS Thread 栈,包括:
- 非功能测试集(稳定性,可靠性,性能,压力,恢复)。
- 使用 Valgrind 内存分析工具的功能测试用例。
- 使用 LCov 进行代码覆盖率测量。
- 自动化认证测试用例,以确保始终进行认证验证。
- RAM/ROM 和性能测量与趋势图表。
为确保生产准备交付,我们还检查:
- 使用 Defensics 自动化测试工具的安全漏洞。
- 使用 Coverity 工具进行静态代码分析。
- 使用官方 Thread 认证工具与其他供应商互操作。
配置硬件
选择你的电台
6LoWPAN 网络使用 IEEE 802.15.4 无线电,因此可在以下免许可频段之一上运行:
- 868.0–868.6 MHz: 欧洲,允许一个通信渠道(2003 年,2006 年,2011 年 [4])
- 902–928 MHz: 北美,多达 10 个频道(2003 年),延长至 30 个(2006 年)
- 2400–2483.5 MHz: 全球使用,最多 16 个频道(2003 年,2006 年)
数据速率从 20 kbit/s 到 250 kbit/s 不等。在设计应用程序时,应考虑每个节点可用的数据速率。基本上,数据速率在网络中的所有节点之间划分。应该为信令目的分配大约一半的信道容量,并且每一跳都需要重传该分组。
经验法则: 每个节点的带宽除以网络中的节点数和跳数。
关于不同硬件的说明
由于栈在多个不同的 Mbed OS 开发板上运行,因此可能存在由于引脚冲突或其他原因可能或可能不一起工作的板和 RF 屏蔽的组合。
此页面旨在收集有关不同硬件组合的信息。
有关此列表的最新副本,请参阅 Mesh 示例应用程序上有关于不同硬件的说明。
RF 屏蔽
以下 RF 屏蔽已与 Mbed OS 网格示例一起使用。
- FIREFLY 6LOWPAN ARDUINO SHIELD。
- Freedom Development Board for MCR20A。
- X-NUCLEO-IDS01A4。
- DVK-NCS36510-MBED-GEVB 开发板,包含内部 RF 芯片。
经过测试的开发板
下表显示了已测试的开发板。它没有提供我们当前的测试基础设施,因此我们无法保证所有组合,但我们会尽力确保它是最新的。
板/RF 屏蔽 | Atmel | MCR20A | X-NUCLEO-IDS01A4 |
---|---|---|---|
FRDM-K64F | Yes | Yes | |
NUCLEO_F429ZI (1) | Yes | Yes | Modified, (3) |
NUCLEO_F401RE | Yes | ||
ublox EVK-ODIN-W2 | Yes | No. (2) | |
Onsemi NCS36510 (internal RF) | |||
NXP KW24D (internal RF) | Yes (4) |
文件系统
Thread 网络堆栈可以将网络配置设置写入文件系统,并在以下启动时读取它们。Thread 配置设置的大小是几千字节。您可以在以下情况下将网络配置设置存储到文件系统:
- 您可以按照 Mbed OS 存储文档中的说明启用文件系统。
- 通过调用函数 ns_file_system_set_root_path(root-path) 将文件系统根路径设置为 Thread 网络栈。在启动 Thread 栈之前执行此操作以在第一次启动时读取可能的配置设置。
根据所选的文件系统,应用程序可能需要格式化文件系统才能使用它。
说明:
- 如果启用了以太网驱动程序,则在 RF 屏蔽使用 SPI1 时需要进行硬件修改。请参阅驱动程序说明和 nanostack-borderrouter-private Issue #17。
- 管脚冲突,见 mesh-minimal Issue 55。
- X-NUCLEO-IDS01A4 扩展板需要在 Mbed OS 中使用的修改。见驱动程序自述文件。
- KW24D 集成了 MCR20A 芯片。使用相同的驱动程序。
如何在实践中调试 Thread 设备
要求
调试 Thread 设备需要:
- 用于运行调试应用的 Android 设备。
- 具有 Wi-Fi 接入点的 IPv6 回程网络,能够通过 LAN 分发 IPv6 地址。
- 运行 nanostack-border-router 应用程序的边界路由器。
- 一个有效的 IPv6 网络:
- 一种可以 ping 边界路由器的 Android 设备。
- 可以 ping 边界路由器的开发机器(PC)。
- 从 Wi-Fi 接入点分配 IPv6 地址的 PC 和边界路由器。
- 支持 Thread 的终端设备。
模型网络设置可能如下所示:
示例网络设置
构建端节点应用程序
默认情况下,Mbed Thread 应用程序/示例使用 mesh-api 配置文件中定义的静态网络链接配置。如果要使用 Thread 调试,请将以下行添加到 .json 文件中。您可以使用 mesh-minimal 应用程序作为示例。
- “mbed-mesh-api.thread-use-static-link-config”:在 “target_overrides” 下为 false:
- “macros”:[“MBEDTLS_USER_CONFIG_FILE = \”mbedtls_config.h \“”] 与 “config”:和 “target_overrides” 处于同一级别:
将 thread-use-static-link-config 设置为 false 可防止使用预定义的链接配置值,并允许设备启动网络扫描。
现在从 Mbed CLI 为您选择的目标构建应用程序:
mbed compile -t <toolchain> -m <target> -c
生成二进制文件后,将二进制文件刷新到终端设备,然后运行应用程序。在边界路由器从 Wi-Fi 接入点获得 IPv6 地址之前,请勿打开终端设备的电源。
QR 码生成
您可以使用免费的在线工具生成 QR 码。
在在线工具中,填写 URL 字段。以下是一个示例:v = 1&eui = 000b57fffe07a8be&cc = PV7TUCB0。为您的设备填写正确的值,并确保始终存在 v = 1。其他必需参数是:
- cc 是 PSKd,它在 .json 文件中配置(请参阅 mesh-api 配置)。PSKd 必须是大写字符(0-9,A-Y,不包括 I,O,Q 和 Z)。
- eui 默认等于 RF MAC 地址。
要获取终端设备的 MAC 地址,请在启用静态配置的情况下将节点连接到 Thread 网络。换句话说,“mbed-mesh-api.thread-use-static-link-config”:true,除非您有自己的 MAC 地址配置。
例如,在 mesh-minimal 应用程序中,放置此 printf(“MAC address =%s \ n”,mesh.get_mac_address());之后 printf(“connected.IP =%s \ n”,mesh.get_ip_address());
您可以在此字段中添加四个附加(可选)查询参数:
vn
供应商名称。vm
供应商模型。vv
产品/供应商版本。vs
产品/供应商序列号。
完成详细信息后,请继续为终端设备生成 QR 代码。
使用 Thread 调试应用程序
您可以使用 Thread Android 应用程序进行调试。在 Android 设备上下载并安装此设备,打开 Wi-Fi 并启动应用。在确保满足上面列出的所有要求后,请按照以下步骤操作:
- 设置与线程边界路由器所连接的 Wi-Fi 接入点的连接。连接后,应用程序会列出您的 Thread 边界路由器。
- 从列表中选择边框路由器。
- 输入应用程序请求的密码。它是 Thread 网络(使用默认的 Mesh API Thread 配置时)。成功连接到边界路由器后,应用程序就可以扫描 QR 码了。注意:您可能需要在应用程序中授予 Android 权限。
- 如果 Thread 设备尚未打开,请打开它。
- 扫描二维码。Thread 设备加入网络。如果您使用的是 mesh-minimal 应用程序,则会在串行控制台上打印 IP 地址:connected. IP = ....
Thread mesh 问题和答案
设备如何加入网络以及调试模式的选项有哪些?
设备加入网络没有不同的调试模式,只有不同类型的委员(网状,本地,外部)。线程设备是否具有配置。如果他们没有配置,他们会尝试找到接受它们的 Thread 网络。然后,他们使用 DTLS 进行调试以验证自己,如果成功,他们将收到网络凭据并成为网络的一部分。
Nanostack 集的默认配置在哪里?
- Thread 设备没有默认配置。应始终将它们委托给网络并在现场接收配置。专员可以修改整个网络的配置,网络中的所有 Thread 设备将自动选择新配置并将其保存到 NVM。
- 边界路由器可以具有默认配置集,其提供用于建立网络的起始点。
Thread 配置是否容易暴露给应用程序并且是否可以在运行时配置?
- Thread 管理 API 可用于读取/存储/删除线程链接配置并定义设备配置(thread_management_if.h)。
- 线程专员可以更改整个 Thread 网络的网络配置。通过使用 thread_commissioning_api.h 和 thread_management_if.h,您可以构建可以更新网络配置的网状或本机委托。
- 例如,可以使用默认配置设置边界路由器。然后,专员可以更新整个 Thread 网络配置(包括边界路由器)。
谁选择了通道和 PAN ID?不同的制造商会选择不同的通道和 PAN ID 吗?
通道和 PAN ID 是将设备委托给 Thread 网络时收到的 Thread 配置的一部分。专员可以随时修改配置。制造商不决定 Thread 链接配置。
如何通过不同的制造商轻松形成 ad-hoc 网状网络?
通过调试可以轻松创建具有来自不同制造商的设备的 Ad-hoc 网络。
边界路由器是在所有频道上还是仅在一个频道上收听?
- 边界路由器是 Thread 路由器设备,使用与 Thread 网络中的其他设备相同的配置。所以它使用单一渠道。
- 尚未加入 Thread 网络的设备扫描所有通道和 PAN ID,以找到他们想要加入的 Thread 网络。
如何使用移动设备进行调试?有一个示例应用程序?
可以从 Android 应用商店下载示例应用程序。
有没有应用实例?它们支持/不支持哪些 Thread 功能?
- 支持 SED 和 REED 类型的应用示例:
- Thread 边界路由器。
如何调试和可视化网络?
- 您可以从 Wireshark 网页下载支持 Thread 协议的 Wireshark 版本。
- 委托人可以使用特定于 Thread 的诊断命令来执行网络诊断和拓扑图像。我们的软件支持此功能,但没有 C/C++ API 支持。
如何检查错误或检查链接质量?
使用 Wireshark 最容易调试链路质量和错误。
如何使用 UDP 和 TCP 套接字发送/接收。如何使用组播组?
mesh minimal 使用套接字通信和多播。在 mesh minimal 示例中查看更多详细信息。
如果我的 ISP 不提供 IPv6 服务怎么办?为什么我需要 IPv6 互联网服务?我可以使用隧道服务吗?
Thread 基于 IPv6 协议。如果通信必须通过 IPV4 网络,则有两种解决方案:
- NAT64。
- IPv6 隧道。
如果数据包无法到达目的地会发生什么情况(例如,没有到边界路由器的互联网连接)?对设备的响应是什么?
没有可用的特殊 Thread 代码,您将拥有正常的互联网错误代码。应用程序必须使用正确的重试逻辑来处理临时网络连接问题。
如何将网络错误发送回设备?有没有错误或没有回应的描述?
Thread 中没有特殊的错误代码。应用程序可以接收 ICMPv6 错误代码。
如何在网格中发送所有节点?我可以使用多播地址吗?
支持 IPv6 组播消息。link-local 和 realm-local(mesh-local)多播作用域在 Thread 网络中工作,以及站点本地多播消息。
如何使用链接本地地址与全局地址?
- 通常,全局地址用于与远程服务通信。当设备具有目标地址时,网络栈会选择正确的源地址并路由到该目标。
- 应用程序开发人员可以实现协议(使用多播)来从 Thread 网络中的其他设备查询链路本地或网状本地地址。链路本地地址仅在一个无线电跳上工作。网状本地地址在 Thread 网络中的多跳上工作。
- mbed OS mesh API 提供了查询设备自身地址(链接本地或全局)的功能。
Thread 设备中的可配置参数是什么?他们的意思是什么?他们在哪里记录?
- Thread 可配置参数是 Active Operational Dataset 参数。参数说明可以在 Mbed Mesh API 中找到。更多信息可以在 Thread 规范中找到。
- Thread 设备配置包括用于调试设备的 PSKd 和 EUI64(通常是无线电芯片的 MAC 地址)。
什么是 PSKc 和 PSKd?哪里可以找到这些?
- PSKc 是本地或外部专员的身份验证密钥。此值是根据网络的密码短语与扫描网络时收到的网络名称和 XPANID 生成的。委托人应用程序在扫描并选择可用的 Thread 网络后请求此密码短语,与 WiFi 中的方式完全相同。
- PSKd 是用于与 EUI64 一起向 Thread 网络验证设备的验证密钥。
- 这些值以 QR 码的形式打印到设备或设备包装上的标签上,然后由专员应用程序扫描。这将允许将设备调试到 Thread 网络。验证之后,将为新设备提供线程配置。
Nanostack
本章介绍 6LoWPAN 栈架构。它包含以下部分:
架构
IPv6 低功耗无线个域网(6LoWPAN)是一个适配层,可以在低功耗无线上使用 IPv6,并支持 IPv6 和用户数据报协议(UDP)报头压缩。互联网协议(IP)报头压缩允许 6LoWPAN 数据包紧凑,使其健壮,是低功耗和有损网络的理想选择。在传输大于支持接口的最大传输单元(MTU)的有效负载(最多 1280 字节)的情况下,它还处理分组的分段和重组。
业界领先的 Arm 6LoWPAN 栈具有高度可扩展性和可靠性,同时还提供无与伦比的功能集,包括紧凑的源代码库和最佳的内存使用。此外,6LoWPAN 栈可以提供可选的软件模块,用于安全性和嵌入式 Web 服务(Mbed 设备服务器)。该设计的模块化结构使 Arm 可以满足大多数要求。
6LoWPAN 栈和 6LoWPAN 边界路由器接入点(AP)软件的组合使开发人员能够在大多数应用中使用极其灵活的多用途网状通信解决方案(参见图 1-1)。
图 1-1 6LoWPAN 网络架构
6LoWPAN 栈
6LoWPAN 栈采用模块化设计,使用极其轻量级的事件环境,允许开发人员在独立模式下完全运行栈,而无需第三方操作系统(OS)。该模型的其他好处是在 flash 和 RAM 使用方面的硬件要求较低。这种方法显着降低了集成工作量,从而缩短了产品上市时间。栈也可以在配置中使用,以便开发人员可以将其作为任务或线程运行,例如,在完整的实时操作系统(RTOS)中。但是,这将不可避免地增加系统资源需求,因为 RTOS 需要额外的资源。
栈架构可分为四个高级组件:
这些组件如图 1-2 所示。
图 1-2 构成 6LoWPAN 栈体系结构的组件
注意: 为简单起见,事件核心与协议模块一起显示为同一组件的一部分。
事件核心
事件核心负责低级事件,调度和系统计时器功能。核心模块提供了其他模块所需的所有基本功能(应用程序模块除外),并且资源要求较低。设计目标是保留和使用硬件平台的最小资源,而是保留所有不必要的计时器,例如,未使用的计时器,以便开发人员可以完全控制来自应用程序层的这些资源。
事件系统为应用程序提供所需的工具和功能,例如,将定时事件发布到自身并创建具有特定回调函数的事件。
事件系统依赖于平台 API 来提供它所需的便携式功能集。然后,为要运行 6LoWPAN 栈的每个操作系统或嵌入式平台移植这些平台驱动程序。
协议模块
6LoWPAN 栈作为单独的模块实现了多种协议,如图 1-2 所示。这些模块旨在使用用于交换数据包的内部数据结构。栈尽可能使用无复制设计,因为在某些模块中,可以复制数据包以提供相关标准规定的重传功能。
6LoWPAN 栈的模块化设计允许从构建中省略一些模块,例如,不包括传输控制协议(TCP)模块将禁用 TCP 传输机制。
在 6LoWPAN 栈的上边缘,暴露了套接字应用程序编程接口(API)(参见图 1-2)。此 API 旨在为应用程序提供 伯克利软件分销(BSD)类似套接字的接口,以使用标准 IPv6 地址和端口号定义来接收和传输数据包。由于事件环境的性质,函数名称也大致遵循 BSD 套接字定义,并进行一些小的修改。目的是向开发人员清楚地指出嵌入式套接字接口和完整 BSD 套接字接口之间存在微小差异。
可选的安全组件
6LoWPAN 栈可以与可选的安全组件一起提供。这些组件提供强大的安全机制,可提供数据身份验证,设备身份验证和授权以及数据加密。该栈支持以下标准:
- PANA(需要 EAP,TLS 和 SHA-256)
- EAP(需要 TLS 和 SHA-256)
- TLS1.2(需要 SHA-256)
- SHA-256
- ECC(ECDSA 和 ECDHE)(要求 X509.3)
- X509.3(需要 ECC)
椭圆曲线密码(ECC)组件支持 EEC 曲线 NIST-P256,如美国国家标准与技术研究院(NIST)的智能电网标准集中所定义;见 NIST。该栈还提供完整的 x509.3 证书支持以及证书链。
栈基本上允许终端设备成为完整公钥基础结构(PKI)安全方案的一部分。
注意: 6LoWPAN 栈依赖于高级加密标准(AES) - 计数器模式密码 *(CCM *)组件,该组件是核心栈的一部分。
应用模块
6LoWPAN 栈运行在基于事件的轻量级系统上,可实现低功耗和最小延迟。应用程序逻辑在名为 tasklet 的特定事件处理程序中实现。6LoWPAN 栈允许开发人员定义多个 tasklet 以简化应用程序设计任务。然后,这些 tasklet 中的每一个都可以完全访问网络栈及其功能。系统依赖于事件并且不会尝试提供真正的多线程服务,因此开发人员不需要关心对资源的多次访问。
应用程序 tasklet 设计最重要的一个方面是让开发人员了解事件环境如何影响它。系统不支持多线程环境的功能。
必须设计应用程序 tasklet,以便它不会在很长一段时间内阻止执行。一个简单的设计规则是需要以状态机方式实现 tasklet。 tasklet 接收它处理的事件,执行操作,例如读取传感器值,构建数据包并传输它,设置新的定时事件,并最终返回。当 tasklet 返回时,事件核心系统调度网络栈以处理数据包的实际传输。数据包的实际传输与应用层的 socket_sendto() 函数之间的延迟取决于此时设备的总体负载。在其他情况下,延迟取决于处理器的性能,但通常可以忽略不计。
图 1-3 显示了构成 6LoWPAN 栈的各种协议模块,它们与开放系统互连(OSI)模型并排放置。
图 1-3 与 OSI 模型一起放置的 6LoWPAN 栈
协议层和相关标准
栈支持的相关标准是:
- 6LoWPAN:
- RFC4944。
- RFC6282。
- RFC6775。
- IPv6:
- RFC2460。
- RFC2464。
- RFC3168 (部分)。
- RFC4291 (部分)。
- RFC6040。
- RFC6437。
- RFC6946。
- UDP:
- RFC768。
- TCP:
- RFC793 (部分)。
- RPL:
- RFC6550。
- RFC6552。
- RFC6553。
- RFC6554。
- RFC6719。
- RFC2473 (部分)。
- ICMPv6:
- RFC4443 (部分)。
- RFC4861 (部分)。
- RFC4862 (部分)。
- MLE:
- IETF draft-kelsey-intarea-mesh-link-establishment-06。
- IEEE802.15.4。
- IEEE802.15.4-2006 (认证)。
- IEEE802.15.4g (部分)。
- MPL:
- IETF draft-ietf-roll-trickle-mcast-12 (部分)。
- AES:
- FIPS 197。
- SP 800-38C。
- PANA:
- RFC5191。
- RFC6345。
- RFC6786。
- EAP:
- RFC3748。
- RFC5216。
- TLS:
- RFC4279。
- RFC5216。
- RFC5246。
- RFC6655。
- IETF draft-mcgrew-tls-aes-ccm-ecc-05。
- ECC:
- RFC4492。
- RFC5289。
- IETF draft-mcgrew-tls-aes-ccm-ecc-05。
接口
6LoWPAN 栈为应用程序开发人员提供编程接口,用于配置 6LoWPAN 网络,定义安全级别以及发送和接收数据包。6LoWPAN 栈要求开发人员为平台特定任务提供功能,并为物理层提供网络驱动程序。有关编程接口的更多信息,请参阅 Mbed Mesh API。
操作模式
在 6LoWPAN 网络中,RFC 中描述了以下角色:
6LoWPAN 节点(6LN)
6LoWPAN 节点是参与网络的任何主机或路由器。当引用主机或路由器可以扮演所述角色的情况时,使用该术语。
6LoWPAN 路由器(6LR)
可以路由数据包的节点。此角色是形成拓扑或网状网络所必需的。
6LoWPAN 边界路由器(6LBR)
边界路由器位于 6LoWPAN 网络和 IPv6 网络之间。6LBR 是其服务的 6LoWPAN 网络的 IPv6 前缀传播的负责权限。
运行 6LoWPAN 栈的设备可以在运行时配置为以下三种模式之一:
- 路由器:
- 实际上是 6LoWPAN 路由器(6LR)。
- 将数据包路由到网络中的其他设备或从其他设备路由。
- 通常是永远在线,即无线电始终开启。
- 栈在空闲时将处理器置于休眠状态,从而自动降低功耗,从而不会路由或处理数据包。
- 主机:
- 是 6LoWPAN 节点(6LN),没有路由功能。
- 不与网络中的其他设备路由数据包。
- 通常 RF 始终打开。
- 可以睡眠,但父路由器不会缓存发往此设备的数据包。
- 睡眠主机:
- 是 6LoWPAN 节点(6LN),没有路由功能,并且使用延长的睡眠时间。
- 不与网络中的其他设备路由数据包。
- 通常在长时间睡眠中。
- 工作周期通常不到 1%。
- 由于定时器触发或外部中断而唤醒,执行某些操作,轮询来自父路由器的数据并返回休眠状态。
- 需要 MLE 协议或替代方案。
- 睡觉时可能会关闭电台。
联网
本章讨论网络拓扑和使用的协议。
网络拓扑
6LoWPAN 栈使用两种类型的网络拓扑,即星形和树形拓扑,如图 1-5 所示。
图 1-5 6LoWPAN 堆叠生态系统支持的网络拓扑
MAC
媒体访问控制(MAC)实现基于 IEEE802.15.4-2006 标准(参见 [MAC]),并且用于节点之间的 MAC 层通信,例如信标扫描和响应,以及数据请求和指示。MAC 实施已经在多个平台上获得认证。
MAC 实现标准的非信标启用模式。它没有实现保证时隙(GTS)。
UDP
6LoWPAN 栈支持 UDP 传输协议。应用程序可以使用套接字 API 使用 UDP 套接字发送和接收数据。应用程序通常使用 UDP 来通过 IP 传递短消息。它是一种不可靠的无连接协议,但可用于广播和多播消息。UDP 的优点在于它不需要在通信之前进行任何类型的连接形成或握手过程。UDP 是经典的 “即发即忘” 传输机制,它结合了固有的低可靠性,只需要最小的开销。
通过使用简单的应用层,端到端确认方案,可以容易地减轻 UDP 的缺点。作为此类解决方案的有效且可扩展的示例,请参阅 CoAP 中定义的约束应用协议(CoAP)确认(ACK)机制。
TCP
6LoWPAN 栈支持传输控制协议(TCP),应用程序可以使用栈的套接字接口 API 使用 TCP 套接字发送和接收数据。需要可靠,有序传输的字节流的应用程序通常可以使用 TCP。但是,TCP 不适用于每个应用程序,因为它仅支持单播通信,并且对数据包丢失反应很差。TCP 不适用于非常短的事务,因为开销与应用程序数据的比率通常会相当快地增加。另外,由于 TCP 握手过程的持续时间,TCP 的使用会对设备的功耗产生非常不利的影响。
RPL 路由
用于低功率和有损网络(RPL)的路由协议是因特网工程任务组(IETF)中针对低功率和有损网络定义的距离矢量 IPv6 路由协议,其指定如何使用以下方式构建目的地定向非循环图(DODAG)。目标函数和一组度量和约束。RPL 针对多对一拓扑进行了优化。邻居将边缘路由器的路由记录保留为最终目的地。反向路由或源路由由边缘路由器保存,用于将数据发送到其具有路由的网络中的任何节点。当节点将数据包发送到另一个节点时,数据包将传输到 DAG 中的公共祖先,此时它将向下转发到目标。
网络加入流程
开发人员可以完全控制 6LoWPAN 栈何时尝试加入网络。开发人员可以配置通道,个人区域网络标识符(PANID)和 128 位网络标识符(NWKID)掩码,以过滤掉不需要的通道或网络。通过一些简单的函数调用,开发人员可以通知栈启动被动能量扫描或信标扫描以选择通道。网络 PANID 和 NWKID 将被过滤,非匹配网络将被静默丢弃。然后,栈将根据 6LOWPAN-ND 继续执行网络级引导。当栈加入网络或找不到网络时,将使用标准系统事件通知开发人员。如果栈尚未加入网络,开发人员可以选择 1)选择其他参数;2)停止进一步尝试加入网络或 3)继续重试加入过程。当栈通知应用程序层尝试失败时,栈将不会尝试加入网络。但是,栈可以选择使用初始参数重试。
图 1-6 使用网络身份验证时网络引导过程的高级视图
加入 6LoWPAN 网络
加入网络的初始过程涉及 MAC 级别关联,其中节点将使用其信道列表中的信道执行 MAC 信标扫描。所得到的信标将使用信标协议 ID 过滤器忽略来自相邻节点的响应,其中该节点将与网络中的最佳父路由器相关联,通常是具有匹配的 PANID 的最高链路质量指示符(LQI)。然后,节点将对父路由器以及已响应初始信标扫描的其他路由器执行网状链路建立(MLE)请求。如果所选路由器未响应 MLE 请求,则节点将从信标扫描结果中选择新路由器。
随后,6LoWPAN 网状网络中的节点发起 6LoWPAN 邻居发现(6LoWPAN-ND)过程。邻居发现协议处理地址分配,包括重复地址检测(DAD)和向边缘路由器注册。边缘路由器保留已加入 6LoWPAN 网络的所有节点的白板。在 6LoWPAN 网格中,对于与边缘路由器不相邻的路由器或主机设备,在多跳上重复注册过程。RPL 仅适用于路由器。
最后一步,不包括 RPL 模块之上的任何内容,是 RPL 拓扑结构。RPL DODAG 形成是一个多阶段过程,其中加入节点主动尝试找到用于注册 6LoWPAN 边界路由器(6LBR)的最佳可用父节点。
图 1-7 显示了 6LoWPAN 节点(6LN)在网状拓扑配置中使用 6LoWPAN 路由器(6LR)连接到 6LBR 的过程。在图示中,纵轴表示时间。6LN 通常将接收多个路由器通告(RA)消息。
图 1-7 网状拓扑的连接过程
图 1-8 网络引导程序的高级状态机描述
图 1-9 显示了加入节点可以使用来自 6LBR 的多跳的场景的 RPL 层注册和拓扑形成过程消息流。
注意: 加入设备可以接收多个 DIO 消息。
图 1-9 多跳的 RPL 路由层消息流
图 1-10 网状拓扑的高级视图
加入星型网络
6LoWPAN 星型网络中节点的加入过程使用加入 6LoWPAN 网络中提到的相同过程。然而,星型网络不同,因为注册过程仅作为与边缘路由器的单跳序列进行。
图 1-11 显示了星型拓扑配置中 6LBR 的无线个人局域网(WPAN)节点(6LN)加入过程。在图示中,纵轴表示时间。
注意: 通常,6LN 将接收多个 RA 消息。
图 1-11 6LoWPAN 加入边界路由器的过程
图 1-12 显示了加入节点是来自 6LBR 的单跳的场景的 RPL 层注册和拓扑形成过程消息序列。
注意: 加入设备可以接收多个 DIO 消息。
图 1-12 RPL 层注册形成过程
网络重新加入流程
如果具有 6LoWPAN 栈的设备被强制进入睡眠模式一段时间以使其注册 6LBR 已过期,则栈将自动检测到并更新其注册。然后,当设备唤醒时,栈就可以进行通信而无需应用程序的任何进一步操作。
栈刷新注册所需的确切时间取决于是使用全网状网络拓扑还是星型拓扑。此外,在网状网络方案中,网格中设备的确切位置(特定于 6LBR 的深度)对恢复完整网络功能的时间影响很小。
自动网络修复过程
即使实际网状网络的物理位置没有,RF 通道也会发生变化。然后,网络必须立即轻松适应新频道。
6LoWPAN 栈使用的标准提供来自多个协议层的反馈,例如 MAC,网络和路由层。这种多层方法为栈提供了大量信息源,可用于自动决定何时可以启动网络重新配置。它还可以使用标准互联网控制消息协议(ICMP)v6 消息传送到 IP 网络中的其他设备。 更具体地说,这些消息可以是 ICMPv6 Destination Unreachable 或 No Route To Host 类型。
MAC 层
当第二层(L2)ACK 的重复通知未传递到更高层时,可能发生了丢失的连接。如果 ACK 消息从路由拓扑中的父设备丢失,则会导致以下操作之一:1)切换到辅助父节点,即已存储用于备份的备用父节点;或 2)栈应启动本地网络重新配置。
如果子节点丢失了 L2 ACK,则路由节点通常将 ICMPv6 错误消息发送到分组的发起者。如果设备本身的应用程序是创建者,则使用系统事件通知应用程序错误。
网络层
如果 MAC 层向主网络通知连接问题的第三层(L3),则 L3 负责重新配置网络。这可以通过使用配置的通道发送多播路由器请求(RS)消息以尝试查找备用父节点来实现。由于已加入 RPL DODAG 的 6LR 和 6LBR 设备通过 RA 消息回复 RS 消息,因此扫描设备可以确定所有回复都来自能够路由数据包的设备。如果先前使用的网络的 6LBR 变得不可用,则该步骤基本上确保设备可以加入新网络。重要的是要了解 6LoWPAN-ND 进程不用于形成网络拓扑,而仅用于建立 IPv6 前缀上下文信息和可用(直接或多跳)6LBR 设备的标识。
路由层
如果设备已决定执行本地重新配置并使用 6LoWPAN-ND 进程更新了 6LoWPAN 网络信息,则下一步是(重新)加入 RPL DODAG。为实现此目的,设备将遵循加入 6LoWPAN 网络中所述的标准 RPL 网络加入流程。