#networking #operating-system #async-trait #devices #traits #posix #standard

std-embedded-nal-async

为大设备实现支持标准库的 embedded-nal-async 特性

2 个不稳定版本

0.2.0 2024年1月18日
0.1.0 2023年10月27日

#1969 in 嵌入式开发

每月下载次数:23
用于 coap-message-demos

MIT/Apache 许可

28KB
502

std-embedded-nal-async

此软件包实现了 embedded-nal-async 网络特性,适用于支持标准库网络功能的操作系统。

在这方面,它对于 embedded-nal 的作用类似于 linux-embedded-hal 对于 embedded-hal:一种在 Linux 上使用为裸机嵌入式世界编写的库的方法。(只是网络接口比硬件访问标准化得更好,因此应该在任何 POSIX 系统上都能工作)。

用法

由于操作系统的网络堆栈始终可用,因此可以随时实例化和使用它,无需同步,大致如下

use std_embedded_nal_async::Stack;

let message = [0x50, 0x01, 0x00, 0x00];

let mut stack = Stack::default();
let (_local, mut sock) = stack.connect("[::1]:5683".parse()?).await?;
sock.send(&message).await?;

请参阅示例以获取完整和可工作的版本。

可移植性

与阻塞特性不同,针对异步特性所做的设计决策确保本地系统的 UDP 地址始终可用,这对于许多基于 UDP 的服务至关重要——但标准库并没有提供此类功能。

它们在 POSIX 系统中以标准化的形式提供,这就是为什么(与 std-embedded-nal 不同),此软件包依赖于 nix 以提供 recvmsg() 系统调用。

对于熟悉该平台的开发者来说,添加对 Windows 的支持应该是直截了当的,因为其软件包 表明支持等效操作

与 IPv4 相关的实现选择

在大多数现代 UNIX 系统中,使用 IPv4 的方式有两种:通过 IPv4 套接字,以及通过使用 V4MAPPED 地址的 IPv6 套接字。

该库目前实现了前者,以利于没有实现映射机制的FreeBSD系统,并且因为标准库的地址使使用该模式变得更加容易(枚举V4/V6地址,而不是V6地址,这些地址可能是V4映射的)。由于这条途径涉及一些代码重复和维护开销(特别是,它需要通过一个可能具有平台特定性的pktinfo结构,而不是来自RFC 3542struct in6_pktinfo),因此该选择被认为是实现细节,该库可能在以后切换到使用V4映射地址(或引入使用任一地址的功能)。

依赖关系

~6–16MB
~208K SLoC