static cell usage
This commit is contained in:
@@ -6,21 +6,28 @@ use rust_mqtt::client::client::MqttClient;
|
|||||||
use rust_mqtt::client::client_config::{ClientConfig, MqttVersion};
|
use rust_mqtt::client::client_config::{ClientConfig, MqttVersion};
|
||||||
use rust_mqtt::packet::v5::publish_packet::QualityOfService;
|
use rust_mqtt::packet::v5::publish_packet::QualityOfService;
|
||||||
use rust_mqtt::utils::rng_generator::CountingRng;
|
use rust_mqtt::utils::rng_generator::CountingRng;
|
||||||
|
use static_cell::ConstStaticCell;
|
||||||
|
|
||||||
|
// TCP socket buffers (for embassy-net TcpSocket)
|
||||||
|
static TCP_RX_BUFFER: ConstStaticCell<[u8; 2048]> = ConstStaticCell::new([0; 2048]);
|
||||||
|
static TCP_TX_BUFFER: ConstStaticCell<[u8; 2048]> = ConstStaticCell::new([0; 2048]);
|
||||||
|
|
||||||
|
// MQTT client buffers (separate from the TcpSocket’s buffers)
|
||||||
|
static MQTT_TX_BUF: ConstStaticCell<[u8; 1024]> = ConstStaticCell::new([0; 1024]);
|
||||||
|
static MQTT_RX_BUF: ConstStaticCell<[u8; 1024]> = ConstStaticCell::new([0; 1024]);
|
||||||
|
|
||||||
#[embassy_executor::task]
|
#[embassy_executor::task]
|
||||||
pub async fn mqtt_task(stack: Stack<'static>) {
|
pub async fn mqtt_task(stack: Stack<'static>) {
|
||||||
info!("MQTT task starting...");
|
info!("MQTT task starting...");
|
||||||
|
|
||||||
// TCP socket buffers (for embassy-net TcpSocket)
|
// Safely take buffers (only allowed once)
|
||||||
static mut TCP_RX_BUFFER: [u8; 2048] = [0; 2048];
|
let tcp_rx = TCP_RX_BUFFER.take();
|
||||||
static mut TCP_TX_BUFFER: [u8; 2048] = [0; 2048];
|
let tcp_tx = TCP_TX_BUFFER.take();
|
||||||
|
|
||||||
// pass Stack by value
|
// Pass Stack by value to embassy-net TcpSocket
|
||||||
let mut socket =
|
let mut socket = TcpSocket::new(stack, tcp_rx, tcp_tx);
|
||||||
TcpSocket::new(stack, unsafe { &mut TCP_RX_BUFFER }, unsafe { &mut TCP_TX_BUFFER });
|
|
||||||
|
|
||||||
// Adjust broker IP/port as needed
|
// TODO broker details
|
||||||
// TODO
|
|
||||||
let broker_ip = Ipv4Address::new(192, 168, 1, 100);
|
let broker_ip = Ipv4Address::new(192, 168, 1, 100);
|
||||||
let broker_port = 1883;
|
let broker_port = 1883;
|
||||||
|
|
||||||
@@ -32,32 +39,27 @@ pub async fn mqtt_task(stack: Stack<'static>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MQTT client buffers (separate from the TcpSocket's buffers)
|
// Safely take MQTT buffers
|
||||||
static mut MQTT_TX_BUF: [u8; 1024] = [0; 1024];
|
let mqtt_tx = MQTT_TX_BUF.take();
|
||||||
static mut MQTT_RX_BUF: [u8; 1024] = [0; 1024];
|
let mqtt_rx = MQTT_RX_BUF.take();
|
||||||
|
|
||||||
// rust-mqtt 0.3.0 RNG
|
let mqtt_tx_len = mqtt_tx.len();
|
||||||
|
let mqtt_rx_len = mqtt_rx.len();
|
||||||
|
|
||||||
|
// RNG
|
||||||
let rng = CountingRng(0);
|
let rng = CountingRng(0);
|
||||||
|
|
||||||
// Build client config
|
// Build config
|
||||||
let mut cfg: ClientConfig<'static, 8, _> = ClientConfig::new(MqttVersion::MQTTv5, rng);
|
let mut cfg: ClientConfig<'static, 8, _> = ClientConfig::new(MqttVersion::MQTTv5, rng);
|
||||||
cfg.keep_alive = 60;
|
cfg.keep_alive = 60;
|
||||||
cfg.add_client_id("esp32-client");
|
cfg.add_client_id("esp32-client");
|
||||||
// Optional:
|
|
||||||
// cfg.add_username("user");
|
// cfg.add_username("user");
|
||||||
// cfg.add_password("pass");
|
// cfg.add_password("pass");
|
||||||
|
|
||||||
// Create client
|
// Build MQTT client
|
||||||
let mut client: MqttClient<'static, _, 8, _> = MqttClient::new(
|
let mut client = MqttClient::new(socket, mqtt_tx, mqtt_tx_len, mqtt_rx, mqtt_rx_len, cfg);
|
||||||
socket,
|
|
||||||
unsafe { &mut MQTT_TX_BUF },
|
|
||||||
unsafe { MQTT_TX_BUF.len() },
|
|
||||||
unsafe { &mut MQTT_RX_BUF },
|
|
||||||
unsafe { MQTT_RX_BUF.len() },
|
|
||||||
cfg,
|
|
||||||
);
|
|
||||||
|
|
||||||
// CONNECT
|
// Connect
|
||||||
match client.connect_to_broker().await {
|
match client.connect_to_broker().await {
|
||||||
Ok(_) => info!("MQTT CONNACK received"),
|
Ok(_) => info!("MQTT CONNACK received"),
|
||||||
Err(reason) => {
|
Err(reason) => {
|
||||||
@@ -66,7 +68,7 @@ pub async fn mqtt_task(stack: Stack<'static>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Publish a message (QoS1)
|
// Publish simple message
|
||||||
match client
|
match client
|
||||||
.send_message(
|
.send_message(
|
||||||
"esp32/topic",
|
"esp32/topic",
|
||||||
@@ -80,7 +82,7 @@ pub async fn mqtt_task(stack: Stack<'static>) {
|
|||||||
Err(reason) => info!("MQTT publish failed: {:?}", reason),
|
Err(reason) => info!("MQTT publish failed: {:?}", reason),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep the session alive; send PING and await PINGRESP every 30s
|
// Keep alive
|
||||||
loop {
|
loop {
|
||||||
if let Err(reason) = client.send_ping().await {
|
if let Err(reason) = client.send_ping().await {
|
||||||
info!("MQTT ping failed: {:?}", reason);
|
info!("MQTT ping failed: {:?}", reason);
|
||||||
|
|||||||
Reference in New Issue
Block a user