Add mqtt publish

Signed-off-by: Thomas Klaehn <thomas.klaehn@perinet.io>
This commit is contained in:
Thomas Klaehn 2025-02-25 00:47:44 +01:00
parent b87e6c552f
commit feaf167e85
3 changed files with 94 additions and 2 deletions

10
Cargo.lock generated
View File

@ -1229,6 +1229,7 @@ dependencies = [
"ieee80211", "ieee80211",
"ieee802154", "ieee802154",
"log", "log",
"mqttrust",
"nb 1.1.0", "nb 1.1.0",
"portable-atomic", "portable-atomic",
"sha2", "sha2",
@ -1411,6 +1412,15 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "mqttrust"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae32f7b780d20b0fc574bba0ca71b33838bb264d7a48b098cd18e3327c30edde"
dependencies = [
"heapless 0.7.17",
]
[[package]] [[package]]
name = "nb" name = "nb"
version = "0.1.3" version = "0.1.3"

View File

@ -23,6 +23,7 @@ embedded-hal-async = "1.0.0"
embedded-io = { version = "0.6.1", default-features = false } embedded-io = { version = "0.6.1", default-features = false }
embedded-io-async = "0.6.1" embedded-io-async = "0.6.1"
embedded-storage = "0.3.1" embedded-storage = "0.3.1"
embedded-time = "=0.12.1"
esp-alloc = "0.6.0" esp-alloc = "0.6.0"
esp-backtrace = { version = "0.15.0", features = ["esp32c6", "exception-handler", "panic-handler", "println"] } esp-backtrace = { version = "0.15.0", features = ["esp32c6", "exception-handler", "panic-handler", "println"] }
esp-hal = { version = "0.23.1", features = ["esp32c6", "log"] } esp-hal = { version = "0.23.1", features = ["esp32c6", "log"] }
@ -36,11 +37,11 @@ hmac = { version = "0.12.1", default-features = false }
ieee80211 = { version = "0.4.0", default-features = false } ieee80211 = { version = "0.4.0", default-features = false }
ieee802154 = "0.6.1" ieee802154 = "0.6.1"
log = "0.4.22" log = "0.4.22"
mqttrust = "0.6.0"
nb = "1.1.0" nb = "1.1.0"
portable-atomic = { version = "1.9.0", default-features = false } portable-atomic = { version = "1.9.0", default-features = false }
sha2 = { version = "0.10.8", default-features = false } sha2 = { version = "0.10.8", default-features = false }
smoltcp = { version = "0.12.0", default-features = false, features = [ "medium-ethernet", "socket-raw"] } smoltcp = { version = "0.12.0", default-features = false, features = [ "medium-ethernet", "socket-raw"] }
embedded-time = "=0.12.1"
static_cell = { version = "2.1.0", features = ["nightly"] } static_cell = { version = "2.1.0", features = ["nightly"] }
usb-device = "0.3.2" usb-device = "0.3.2"
usbd-serial = "0.2.2" usbd-serial = "0.2.2"

View File

@ -3,6 +3,10 @@
extern crate alloc; extern crate alloc;
use embedded_io::{
Read,
Write
};
use blocking_network_stack::Stack; use blocking_network_stack::Stack;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{ use esp_hal::{
@ -45,12 +49,25 @@ use esp_wifi::{
WifiStaDevice, WifiStaDevice,
} }
}; };
use mqttrust::encoding::v4::{
encode_slice,
Connect,
Packet,
Protocol,
Publish,
QoS
};
use smoltcp::{ use smoltcp::{
iface::{ iface::{
SocketSet, SocketSet,
SocketStorage SocketStorage
}, },
wire::DhcpOption wire::{
DhcpOption,
IpAddress,
Ipv4Address
}
}; };
const SSID: &str = env!("SSID"); const SSID: &str = env!("SSID");
@ -135,6 +152,63 @@ fn main() -> ! {
} }
} }
let mut rx_buffer = [0u8; 1536];
let mut tx_buffer = [0u8; 1536];
let mut socket = stack.get_socket(&mut rx_buffer, &mut tx_buffer);
socket
.open(IpAddress::Ipv4(Ipv4Address::new(192, 168, 178, 143)), 1883) // p5
.unwrap();
sleep_millis(1_000);
println!("Trying to connect");
let connect = Packet::Connect(Connect {
protocol: Protocol::MQTT311,
keep_alive: 10,
client_id: "tmp",
clean_session: true,
last_will: None,
username: None,
password: None,
});
let mut buf = [0u8; 1024];
let len = encode_slice(&connect, &mut buf).unwrap();
let _ = match socket.write(&buf[..len]) {
Ok(value) => value,
Err(err) => panic!("Error connection mqtt: {:?}",err),
};
println!("Connected to MQTT broker");
let packet = Publish {
dup: false,
qos: QoS::AtMostOnce,
pid: None,
retain: false,
topic_name: "topic",
payload: b"hello",
}.into();
let len = encode_slice(&packet, &mut buf).unwrap();
let _ = match socket.write(&buf[..len]) {
Ok(value) => value,
Err(err) => panic!("Error publishing mqtt: {:?}",err),
};
// read back result (?!?)
let len = match socket.read(&mut buf) {
Ok(value) => value,
Err(err) => panic!("Error reading socket: {:?}", err),
};
if len > 0 {
println!("got {} bytes: {:02x?}", len, &buf[..len]);
}
println!("Disconnecting");
socket.disconnect();
println!("Disconnected");
let lp_pin = LowPowerOutput::new(peripherals.GPIO1); let lp_pin = LowPowerOutput::new(peripherals.GPIO1);
let uart_cfg = Config::default(); let uart_cfg = Config::default();
let tx = LowPowerOutput::new(peripherals.GPIO5); let tx = LowPowerOutput::new(peripherals.GPIO5);
@ -170,3 +244,10 @@ fn main() -> ! {
// rtc.sleep_light(&[&reason]); // rtc.sleep_light(&[&reason]);
} }
} }
pub fn sleep_millis(delay: u32) {
let sleep_end = as_millis() + delay as u64;
while as_millis() < sleep_end {
// wait
}
}