8个版本 (5个重大变更)

0.6.1 2024年6月17日
0.6.0 2021年5月19日
0.5.0 2020年5月19日
0.4.0 2019年11月15日
0.1.0 2019年9月29日

网络编程类别中排名第236

每月下载量23
用于nrf-modem-nal

MIT/Apache

96KB
1.5K SLoC

crates.io crates.io

nrfxlib

Rust nrfxlib包装器,用于nRF9160

此crate由42 Technology Ltd发布。

简介

此crate为在Nordic nRF9160上运行的嵌入式应用程序提供Socket API。

nRF9160上的LTE基带目前只能通过Nordic的闭源二进制blob访问 - 一个名为 libbsd.a 的静态库,该库位于一个名为 nrfxlib 的公共Nordic git仓库中,其中还包括一些其他组件(见https://github.com/NordicPlayground/nrfxlib)。

该库提供类似于Berkeley的socket API,对常用的socket类型进行了一些扩展,以便您可以打开AT socket与基带通信AT命令,以及GNSS socket以读取GPS数据。

获取静态库

我们使用名为 nrfxlib-sys 的crate将其链接到库。此crate包括Nordic的头文件和静态库作为git子模块(来自其Github页面),并运行 bindgen 生成与相关头文件中的函数和常量相对应的Rust '头文件'。您不再需要安装 bindgen - 它作为一个crate被拉取 - 但您需要使用Rust 1.51或更高版本。

使用此包装器

基本前提是,这个crate调用Nordic的库来完成所有工作,并向用户提供一些简单的类型(希望这能降低用户出错的可能性)。

例如,Nordic的库使用标准的C整型作为它们的套接字文件描述符。我们把这些封装在Socket结构体中,确保当Socket对象被丢弃时,会调用nrf_socket_close。您也不再能将任意整数传递给readwrite函数,而是调用Socket类型的方法。

我们将Socket进一步特殊化为TlsSocketAtSocketGnssSocketTcpSocket,每个都有自己的工厂函数和特殊方法。对UDP数据报和其他类型套接字的支持待定——欢迎提交pull请求!

如果您想建立TLS连接,您需要首先将证书和密钥推送到由Nordic库控制的特殊闪存区域。您可以使用provision_certificates函数来做这件事。每个证书或密钥都由您提供一个唯一的整数标签,当您创建TlsSocket时,传递这些标签,以便堆栈知道您想使用哪些证书。您至少需要提供一个用于验证服务器端证书的根证书。您还可以选择提供客户端证书和私钥,以执行客户端认证。

当前工作情况

  • 打开普通的TCP连接,包括对主机名的DNS查找
  • 打开TLS连接,有或没有客户端证书
  • 打开AT套接字,发送AT命令并接收响应
  • 打开GNSS套接字并获取GNSS定位
  • 轮询套接字
  • 配置芯片以支持LTE-M、NB-IoT和/或GNSS模式。

示例

请参阅nrf9160-demo,这是一个使用该库的演示应用程序。

变更日志

未发布更改( | 更改

v0.6.1( | 更改

  • nrf_modem_init中修复了内存所有权问题。传递给init的nrf_modem_init_params指针必须具有静态生命周期。这始终是一个栈变量。
    最初这似乎不是必需的,但大约4年前,Nordic没有更新文档,就进行了更改。

v0.6.0( | 更改

  • 更新到nrfxlib-sys v1.5.1。
    • 需要Rust v1.51,因为我们使用新的解析器来允许bindgen作为构建依赖项
    • 将FFI导出从bsd_X重命名为nrf_modem_X
    • 实现IPC功能
    • 实现库和传输堆栈
    • 默认提供硬浮点库。nRF9160具有FPU,所以我们不妨使用VFP寄存器。
  • 更新到最新的heapless - 不再需要heapless::consts::Uxx

v0.5.0( | 更改

  • 更新到nrfxlib版本1.2.0
  • 现在通过AT命令处理证书。

v0.4.0( | 更改

  • 添加TLS v1.3和DTLS v1.2支持

v0.3.0 (源码 | 变更)

  • Error 衍生 clone
  • 更新到最新的 nrxflib-sys 包。
  • 更新 GPS API 的包装器。

v0.2.2 (源码 | 变更)

  • 修复了 README 中的变更日志。

v0.2.1 (源码 | 变更)

  • 将 PollEntry 改为持有对 socket 的 const 引用而不是可变引用。
  • 使用最新的 nrfxlib-sys 包。

v0.2.0 (源码 | 变更)

  • modem::start() 更改为 modem::on() 并删除了 AT+COPS=0 的调用。
  • 添加了对 nrf_poll 的包装器,以便一次挂起多个套接字。
  • 添加了 GnssSocket::get_blocking_fix()
  • 添加了获取/设置系统模式的 API。
  • 为 GPS 添加了 'use_case' 套接字选项。
  • 使用具有 cargo-5730 工作的 git 版本的 nrfxlib-sys

v0.1.0 (源码)

首次发布。

许可证

根据您的选择,许可如下

任选其一。

贡献

除非您明确声明,否则您有意提交以包含在作品中的任何贡献,根据 Apache-2.0 许可证定义,将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~10MB
~198K SLoC