#硬件抽象 #网络 #无标准库 #资源 #主机名 #bg77 #quectel

无标准库 quectel-bg77

Quectel BG77 和 BG770 eMTC 和 NB-IoT 调制解调器的驱动程序

2 个版本

0.2.2 2024年2月28日
0.2.1 2024年2月16日

#442嵌入式开发

Download history 3/week @ 2024-03-08 8/week @ 2024-03-29

每月 65 次下载

OLFL-1.3

86KB
1.5K SLoC

quectel-bg77

本包实现了一个用于Quectel BG77和BG770 eMTC和NB-IoT调制解调器的驱动程序,它使用embedded-hal特性进行底层硬件抽象,并为该库的用户实现embedded-nal特性。目前,支持两种调制解调器的TcpClientStackUdpClientStack。从Dns特性,仅支持请求IPv4地址的get_host_by_name。到目前为止,这仅适用于BG77。要选择使用的调制解调器,请激活bg77bg770特性。

驱动程序同时支持最多12个套接字,并在套接字句柄类型上实现了Drop/RAII,以防止资源泄漏。这是通过使用内部可变性模式实现的:所有套接字句柄都持有对驱动类型(拥有硬件)的引用。每当它们需要访问硬件时,驱动程序都会以可变借用(在运行时进行检查)的形式被借用。这始终有效,因为没有任何可变借用会超过任何方法调用。

目前,AT命令不会部分运行,这会复杂化内部状态的处理,并增加可能的错误原因的数量,例如当多个套接字同时尝试访问调制解调器时。因此,所有方法调用实际上都是阻塞的。唯一的例外是receive,如果没有数据可用,则返回nb::Error::WouldBlock。对于send方法,这不是一个大问题,因为它只会阻塞直到数据传输到调制解调器(实际的传输将在后台发生)。只有将调制解调器连接到网络会长时间阻塞。

使用示例

use embedded_nal::TcpClientStack;

// The hardware abstraction used for the Bg77Hal must implement the respective embedded-hal
// traits
let bg77_hal = quectel_bg77::Bg77Hal {
    pin_enable: bg77_enable,
    pin_reset_n: bg77_reset_n,
    pin_pwrkey: bg77_pwrkey,
    tx: bg77_tx,
    rx: bg77_rx,
    at_timer,
    modem_timer,
};
// choose which radio technologies and bands to use
let radio_config = quectel_bg77::RadioConfig::OnlyNbiot {
    bands: quectel_bg77::NbiotBand::B8.into(),
};
let mut bg77 = quectel_bg77::Bg77Driver::new(
    bg77_hal,
    radio_config,
    Some("iot.1nce.net"),                   // configure APN
    Some("26201"),                          // configure operator
    core::time::Duration::from_secs(60),    // configure connection/attach timeout
    core::time::Duration::from_millis(500), // configure internal safety delays
    core::time::Duration::from_millis(20),  // configure internal safety delays
);
let mut bg77 = quectel_bg77::Bg77ClientStack::new(&mut bg77);
// request a new socket handle, this only fails if all sockets are already in use
let mut socket = bg77.socket().unwrap();
// turn on the modem and try to attach to the network; generally, this takes the most time
let socket_address: embedded_nal::SocketAddr = "192.168.1.1:8080".parse().unwrap();
nb::block!(bg77.connect(&mut socket, socket_address))?;
// transmit data via the socket
nb::block!(bg77.send(&mut socket, b"Hello, BG77"))?;
// close the socket; when the last socket is closed, this also turns off the modem
// with this driver, this never fails
bg77.close(socket).unwrap();

示例

有一些示例可以在适当的硬件上运行。此驱动程序最初是与Sensing Puck一起开发的,因此最初只支持一块板。后来,增加了对MotionAI的支持。可以通过激活sensing_puckmotion2se功能来选择正在使用的板,这将自动激活正确的调制解调器功能(bg77bg770)。

如果需要,可以在examples/boards下添加更多板,并在Cargo.toml中添加相应的功能。但是,必须调整memory.x文件,并且可能需要根据MCU架构调整构建目标。

由于目前只支持基于STM32L452的板,因此附带了一个适当的memory.x。因此,运行示例应该像以下示例一样简单:cargo run --example tcp-client --features sensing_puck --target thumbv7em-none-eabihf。这使用probe-run来闪存固件。

单元测试

由于示例仅针对适当的架构构建,因此需要使用--lib标志来运行测试:cargo test --lib

功能

  • bg77 / bg770选择正在使用的调制解调器
  • sensing_puck / motion2se选择示例板
  • direct-serial-access允许直接访问底层串行端口。这仅应用于开发/调试。

许可

开放物流基金会许可
版本1.3,2023年1月

请参阅顶级目录中的LICENSE文件。

联系

弗劳恩霍夫IML嵌入式Rust组 - [email protected]

依赖项

~1.2–1.8MB
~37K SLoC