From cfcdb56fe84053310963b5eb28d6462f8134698c Mon Sep 17 00:00:00 2001 From: Priec Date: Sat, 4 Oct 2025 18:21:50 +0200 Subject: [PATCH] static cell usage --- final/src/mqtt/client.rs | 54 +++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/final/src/mqtt/client.rs b/final/src/mqtt/client.rs index 66da915..f53ee34 100644 --- a/final/src/mqtt/client.rs +++ b/final/src/mqtt/client.rs @@ -6,21 +6,28 @@ use rust_mqtt::client::client::MqttClient; use rust_mqtt::client::client_config::{ClientConfig, MqttVersion}; use rust_mqtt::packet::v5::publish_packet::QualityOfService; 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] pub async fn mqtt_task(stack: Stack<'static>) { info!("MQTT task starting..."); - // TCP socket buffers (for embassy-net TcpSocket) - static mut TCP_RX_BUFFER: [u8; 2048] = [0; 2048]; - static mut TCP_TX_BUFFER: [u8; 2048] = [0; 2048]; + // Safely take buffers (only allowed once) + let tcp_rx = TCP_RX_BUFFER.take(); + let tcp_tx = TCP_TX_BUFFER.take(); - // pass Stack by value - let mut socket = - TcpSocket::new(stack, unsafe { &mut TCP_RX_BUFFER }, unsafe { &mut TCP_TX_BUFFER }); + // Pass Stack by value to embassy-net TcpSocket + let mut socket = TcpSocket::new(stack, tcp_rx, tcp_tx); - // Adjust broker IP/port as needed - // TODO + // TODO broker details let broker_ip = Ipv4Address::new(192, 168, 1, 100); 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) - static mut MQTT_TX_BUF: [u8; 1024] = [0; 1024]; - static mut MQTT_RX_BUF: [u8; 1024] = [0; 1024]; + // Safely take MQTT buffers + let mqtt_tx = MQTT_TX_BUF.take(); + 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); - // Build client config + // Build config let mut cfg: ClientConfig<'static, 8, _> = ClientConfig::new(MqttVersion::MQTTv5, rng); cfg.keep_alive = 60; cfg.add_client_id("esp32-client"); - // Optional: // cfg.add_username("user"); // cfg.add_password("pass"); - // Create client - let mut client: MqttClient<'static, _, 8, _> = MqttClient::new( - socket, - unsafe { &mut MQTT_TX_BUF }, - unsafe { MQTT_TX_BUF.len() }, - unsafe { &mut MQTT_RX_BUF }, - unsafe { MQTT_RX_BUF.len() }, - cfg, - ); + // Build MQTT client + let mut client = MqttClient::new(socket, mqtt_tx, mqtt_tx_len, mqtt_rx, mqtt_rx_len, cfg); - // CONNECT + // Connect match client.connect_to_broker().await { Ok(_) => info!("MQTT CONNACK received"), Err(reason) => { @@ -66,7 +68,7 @@ pub async fn mqtt_task(stack: Stack<'static>) { } } - // Publish a message (QoS1) + // Publish simple message match client .send_message( "esp32/topic", @@ -80,7 +82,7 @@ pub async fn mqtt_task(stack: Stack<'static>) { Err(reason) => info!("MQTT publish failed: {:?}", reason), } - // Keep the session alive; send PING and await PINGRESP every 30s + // Keep alive loop { if let Err(reason) = client.send_ping().await { info!("MQTT ping failed: {:?}", reason);