nanoFramework.Networking.Thread 1.0.12

前缀已保留
dotnet add package nanoFramework.Networking.Thread --version 1.0.12                
NuGet\Install-Package nanoFramework.Networking.Thread -Version 1.0.12                
此命令旨在在Visual Studio的包管理器控制台中使用,因为它使用NuGet模块的Install-Package版本。
<PackageReference Include="nanoFramework.Networking.Thread" Version="1.0.12" />                
对于支持PackageReference的项目,将此XML节点复制到项目文件中以引用此包。
paket add nanoFramework.Networking.Thread --version 1.0.12                
#r "nuget: nanoFramework.Networking.Thread, 1.0.12"                
#r 指令可用于F# Interactive和Polyglot Notebooks。将其复制到交互工具或脚本的源代码中以引用此包。
// Install nanoFramework.Networking.Thread as a Cake Addin
#addin nuget:?package=nanoFramework.Networking.Thread&version=1.0.12

// Install nanoFramework.Networking.Thread as a Cake Tool
#tool nuget:?package=nanoFramework.Networking.Thread&version=1.0.12                

Quality Gate Status Reliability Rating License NuGet #yourfirstpr Discord

nanoFramework logo


文档语言: 英文 | 简体中文

欢迎来到 .NET nanoFramework nanoFramework.Networking.Thread 库仓库

构建状态

组件 构建状态 NuGet 包
nanoFramework.Networking.Thread Build Status NuGet

nanoFramework.Networking.Thread

.NET nanoFramework 库,用于处理OpenThread 网络功能。

OpenThread 网络基于 IPV6,需要具有 IPV6 和 Thread 功能的固件。目前有3种不同的固件可用。

  • ESP32_C6_Thread
  • ESP32_H2_Thread
  • ESP32_PSRAM_REV3_IPV6

ESP32_PSRAM_REV3_IPV6 固件需要使用 RCP 固件的 OpenThread 无线 Co-Processor。此固件可在 Espressif IDF SDK 的 examples/openthread/ot_rcp 下找到。

此库是初始版本,仍在开发中。为添加对 CoAP 的直接支持,还需要做更多工作。此版本允许访问 OpenThread CLI,这使得大多数选项都可以访问,即使不是直接在 C# 中可用的。

有关OpenThread的更多信息,请访问网站 https://openthread.io/

创建线程网络堆栈对象

当创建 openThread 堆栈时,需要指定节点设备类型。

这可以是以下类型之一。

  • 路由器
  • 终端设备
  • 睡眠终端设备

路由器终端设备用于有电源的设备。终端设备将保持子节点角色,不会被提升为路由器。路由器类型将以子节点角色开始,并根据需要提升到路由器或领导者角色。

睡眠终端设备用于电池供电设备,并且为了节省电池不会连接到网状网络。它将定期轮询其连接的路由器以获取任何消息。连接到睡眠终端设备的路由器将存储并转发消息。

如前所述,设备可以采取多种角色。这些是子节点、路由器或领导者。

内置了802.15.4无线电台的设备

为内置802.15.4无线电台的设备创建openThread对象。

OpenThread ot = OpenThread.CreateThreadWithNativeRadio(ThreadDeviceType.Router);

带有带无线电台的协处理器(RCP)的设备

通过UART端口连接

创建openThread对象,指定连接到协处理器的串行端口。在此调用之前,可能需要设置串行端口使用的引脚。这取决于目标设备。(例如,ESP32)

此代码使用通过COM1连接的UART网路处理器创建堆栈。

OpenThread ot = OpenThread.CreateThreadWithUartRadio(ThreadDeviceType.Router, 1);
通过SPI端口连接。**

创建openThread对象,指定连接到协处理器的SPI端口。在此调用之前,可能需要设置SPI端口使用的引脚。这取决于目标设备。(例如,ESP32)

此代码使用通过SPI1连接的网路处理器创建堆栈。

OpenThread ot = OpenThread.CreateThreadWithSpiRadio(ThreadDeviceType.Router, 1);

连接到现有的网状网络

要连接到现有的Thread网络,您需要指定网络名称、网络密钥和panId的最小值。提供其他参数,如频道号码可以减少重新连接所需的时间,因为它不需要扫描所有频道来搜索网络。

// Create dataset for existing network
OpenThreadDataset data = new OpenThreadDataset()
{
   NetworkName = "nanoFramework",
   NetworkKey = new byte[16] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },
   Channel = 15
};

// Set the Active Dataset
ot.Dataset = data;

// Start Thread network
ot.Start();

如果已存在现有网络,它将附加到该网络。如果不存在,它将等待约2分钟,并使用数据集中的证书创建新的网络。

监控状态更改事件,以了解设备何时已连接到网状网络。请参阅有关OpenThread类引发的事件的后续部分。

使用管理员加入现有网络

要将设备连接到现有网络,其中网络证书是未知的。需要使用另一个网络中的设备(边缘路由器)或外部设备上的管理员。

这是通过设备和管理员之间共享密钥来完成的。设备连接到网络后,可以将网络证书保存,以便下次可以直接连接到网状网络。

使用预共享密钥(PSKd)启动加入器。当JoinerStart()返回true时,配置将完成。

无限循环,直到设备被配对。

while (ot.JoinerStart("J01NME") == false)
{
    // Wait for Join to work
    Thread.Sleep(2000);
}

// Start Thread network
ot.Start();

设备处于附加状态时,可以使用openThread对象的《strong>Dataset属性读取当前数据集,并保存以供下次使用。

监控事件以检查状态。

OpenThread对象可以监控3种事件。

ot.OnStatusChanged += Ot_OnStatusChanged;
ot.OnRoleChanged += Ot_OnRoleChanged;
ot.OnConsoleOutputAvailable += Ot_OnConsoleOutputAvailable;

OnStatusChanged

当Thread堆栈的状态改变时,此事件被触发。需要监控的主要状态是解附和附加事件。也会有网络接口上下文,IPV6地址被分配,以及堆栈开始或停止的事件。

这是一个处理附件事件的示例。它使用事件来通知主线程何时连接到网状网络。启动openThread后,主线程可以等待事件。

请参见示例代码。

static AutoResetEvent WaitNetAttached = new AutoResetEvent(false);

private static void Ot_OnStatusChanged(OpenThread sender, OpenThreadStateChangeEventArgs args)
{
    switch ((ThreadDeviceState)args.currentState)
    {
	    case ThreadDeviceState.OPENTHREAD_EVENT_ATTACHED:
            WaitNetAttached.Set();
            break;
    }
}

OnRoleChanged

当设备角色发生变化时,将触发此事件。

角色可以是以下之一

角色 描述
禁用 OpenThread堆栈未启动。
分离 OpenThread堆栈已启动但未连接到网状网络。
子节点 设备当前是子节点,连接到路由器。
路由器 设备是路由器,并具有0个或多个子设备。
领导者 该设备是已被提升为领导者的路由器。

OnConsoleOutputAvailable

当在命令行界面(CLI)收到非请求消息时,将触发此事件。该事件将向应用程序提供从CLI发送的字符串数组。有关更多信息,请参阅CLI部分。

通过网状网络进行通信

由于资源开销低,Thread的主要通信方式是通过UDP。因此,错误/重试需要在应用层完成。为此,CoAP是推荐在设备之间传输信息的方式,因为它有保证消息传递的机制。

在OpenThread中,使用多播地址在网络内部同时与多个设备通信。例如,网状网络中除了休眠端设备外的所有节点都可以使用IPV6多播地址FC03::1进行通信。休眠端设备需要直接寻址。

有关OpenThread IPV6地址的更多信息,请参见:https://openthread.io/guides/thread-primer/ipv6-addressing。这些地址对于在OpenThread网络中有效地向多个设备发送消息至关重要。

通过CoAP进行通信

openThread堆栈包含CoAP支持。目前这尚未用C#实现,但可以通过CLI界面访问(尽管此方法有限)。

另一种方法是通过第三方库。

使用CLI通过UDP进行通信

CLI支持有限的UDP通信,但目前最佳方法是使用内置于nanoFramework中的标准UDP套接字通信。示例显示了如何使用套接字完成此操作。

使用套接字通过UDP进行通信

有关使用套接字进行通信的示例,请参阅Thread套接字示例。

通过TCP/IP进行通信。

由于OpenThread基于IP网络,它也支持通过TCP/IP进行通信。与TCP/IP通信的所有正常方法都将正常工作。

OpenThread CLI界面。

OpenThread库包含大量不同的API。
我们无法在这个库中实现所有这些,但已经创建了一个API来调用命令行界面(CLI),它提供了对构建中所有OpenThread API的访问。

有关可用的CLI命令详细信息,请参见:https://openthread.io/reference/cli/commands

有两种不同的API可以发送命令到CLI。一个是命令的结果作为API的返回值,另一个API是所有结果都在OnConsoleOutputAvailable事件上触发。

如果您同时在CLI输出非请求消息和命令返回结果,那么最好只需为所有输出使用OnConsoleOutputAvailable事件。

CommandLineInputAndWaitResponse

这将以命令的形式发送到CLI,并等待返回所有字符串直到看到“完成”字符串。这些字符串将由命令直接返回,不包括“完成”消息。

CLI命令返回接口分配的所有IPV6地址。

string[] results = ot.CommandLineInputAndWaitResponse("ipaddr");

如果您想了解本地通信的IPV6地址,则只需使用MeshLocalAddress属性。

IPAddress meshLocal = ot.MeshLocalAddress;

CommandLineInput

CommandLineInput 方法将命令发送到 CLI 并返回。所有命令的结果都通过 OnConsoleOutputAvailable 事件返回。


反馈和文档

有关文档、提供反馈、提出问题以及了解如何贡献,请参阅主仓库

加入我们的 Discord 社区 此处

致谢

此项目贡献者名单可在CONTRIBUTORS中找到。

许可证

nanoFramework 类库遵循 MIT 许可协议

行为准则

此项目采用了贡献者公约中定义的行为准则,以明确我们社区中预期行为。更多信息请参阅.NET 基金会行为准则

.NET 基金会

此项目由.NET 基金会支持。

产品 兼容和额外的计算目标框架版本。
.NET Framework net 是兼容的。
兼容的目标框架
包含的目标框架(在包中)
了解有关目标框架.NET Standard的更多信息。

NuGet 包

此包未用于任何 NuGet 包。

GitHub 仓库

此包未用于任何流行的 GitHub 仓库。

版本 下载 最后更新
1.0.12 73 8/1/2024
1.0.11 89 7/21/2024
1.0.10 96 7/10/2024