2 个版本
0.2.2 | 2024年2月28日 |
---|---|
0.2.1 | 2024年2月16日 |
#442 在 嵌入式开发
每月 65 次下载
86KB
1.5K SLoC
quectel-bg77
本包实现了一个用于Quectel BG77和BG770 eMTC和NB-IoT调制解调器的驱动程序,它使用embedded-hal
特性进行底层硬件抽象,并为该库的用户实现embedded-nal
特性。目前,支持两种调制解调器的TcpClientStack
和UdpClientStack
。从Dns
特性,仅支持请求IPv4地址的get_host_by_name
。到目前为止,这仅适用于BG77。要选择使用的调制解调器,请激活bg77
或bg770
特性。
驱动程序同时支持最多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_puck
或motion2se
功能来选择正在使用的板,这将自动激活正确的调制解调器功能(bg77
或bg770
)。
如果需要,可以在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