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
<PackageReference Include="nanoFramework.Networking.Thread" Version="1.0.12" />
paket add nanoFramework.Networking.Thread --version 1.0.12
#r "nuget: nanoFramework.Networking.Thread, 1.0.12"
// 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
欢迎来到 .NET nanoFramework nanoFramework.Networking.Thread 库仓库
构建状态
组件 | 构建状态 | NuGet 包 |
---|---|---|
nanoFramework.Networking.Thread |
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 是兼容的。 |
-
- nanoFramework.CoreLibrary (>= 1.15.5)
- nanoFramework.System.Collections (>= 1.5.31)
- nanoFramework.System.Math (>= 1.5.43)
- nanoFramework.System.Net (>= 1.11.1)
NuGet 包
此包未用于任何 NuGet 包。
GitHub 仓库
此包未用于任何流行的 GitHub 仓库。