Resolve MQTT and update IP using DNS, also slight import cleanup

This commit is contained in:
Dreaded_X 2023-09-05 03:45:07 +02:00
parent 0f1e181b92
commit 5cce3e78aa
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
3 changed files with 58 additions and 32 deletions

9
Cargo.lock generated
View File

@ -1103,6 +1103,13 @@ version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65"
[[package]]
name = "nourl"
version = "0.1.1"
dependencies = [
"defmt",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.16" version = "0.2.16"
@ -1416,11 +1423,13 @@ dependencies = [
"embedded-io-async", "embedded-io-async",
"heapless", "heapless",
"log", "log",
"nourl",
"panic-probe", "panic-probe",
"rand", "rand",
"rust-mqtt", "rust-mqtt",
"serde", "serde",
"serde-json-core", "serde-json-core",
"smoltcp",
"static_cell", "static_cell",
] ]

View File

@ -40,6 +40,7 @@ embassy-net = { version = "0.1", features = [
"nightly", "nightly",
"medium-ethernet", "medium-ethernet",
"defmt", "defmt",
"dns",
] } ] }
embassy-sync = { version = "0.2", features = ["defmt"] } embassy-sync = { version = "0.2", features = ["defmt"] }
embassy-futures = { version = "0.1", features = ["defmt"] } embassy-futures = { version = "0.1", features = ["defmt"] }
@ -70,6 +71,13 @@ rand = { version = "0.8.5", features = [
serde-json-core = "0.5.1" serde-json-core = "0.5.1"
serde = { version = "1.0.188", default-features = false, features = ["derive"] } serde = { version = "1.0.188", default-features = false, features = ["derive"] }
cfg-if = "1.0.0" cfg-if = "1.0.0"
# Embassy harfcodes a max of 6 dns servers, if there are more it crashes. This is a workaround
# Ideally embassy returns an error instead of crashing...
# Interestingly though, I only get 2 DNS servers...
smoltcp = { version = "0.10.0", default-features = false, features = [
"dns-max-server-count-4",
] }
nourl = { version = "0.1.1", features = ["defmt"] }
[patch.crates-io] [patch.crates-io]
embassy-executor = { git = "https://github.com/embassy-rs/embassy" } embassy-executor = { git = "https://github.com/embassy-rs/embassy" }
@ -83,6 +91,7 @@ embassy-futures = { git = "https://github.com/embassy-rs/embassy" }
embassy-boot-rp = { git = "https://github.com/embassy-rs/embassy" } embassy-boot-rp = { git = "https://github.com/embassy-rs/embassy" }
rust-mqtt = { path = "../rust-mqtt" } rust-mqtt = { path = "../rust-mqtt" }
nourl = { path = "../nourl" }
[build-dependencies] [build-dependencies]
dotenvy = "0.15" dotenvy = "0.15"

View File

@ -2,40 +2,37 @@
#![no_main] #![no_main]
#![feature(type_alias_impl_trait)] #![feature(type_alias_impl_trait)]
use core::str::FromStr;
use cyw43::PowerManagementMode;
use cyw43_pio::PioSpi;
use defmt::{debug, error, info, warn, Format};
use dsmr5::Readout;
use embassy_executor::Spawner;
use embassy_futures::{
select::{select3, Either3},
yield_now,
};
use embassy_net::{tcp::TcpSocket, Config, IpEndpoint, Stack, StackResources};
use embassy_rp::{
bind_interrupts,
clocks::RoscRng,
gpio,
peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0, UART0},
pio::{self, Pio},
uart::{self, BufferedUartRx, Parity},
};
use embassy_time::{Duration, Ticker, Timer};
use embedded_io_async::Read;
use embassy_sync::{
blocking_mutex::raw::NoopRawMutex,
channel::{Channel, Sender},
};
use gpio::{Level, Output};
use heapless::Vec; use heapless::Vec;
use rand::{ use rand::{
rngs::{SmallRng, StdRng}, rngs::{SmallRng, StdRng},
RngCore, SeedableRng, RngCore, SeedableRng,
}; };
use cyw43::PowerManagementMode;
use cyw43_pio::PioSpi;
use embassy_executor::Spawner;
use embassy_futures::{
select::{select3, Either3},
yield_now,
};
use embassy_net::{dns::DnsQueryType, tcp::TcpSocket, Config, Stack, StackResources};
use embassy_rp::{
bind_interrupts,
clocks::RoscRng,
gpio::{Level, Output},
peripherals::{DMA_CH0, PIN_23, PIN_25, PIO0, UART0},
pio::{self, Pio},
uart::{self, BufferedUartRx, Parity},
};
use embassy_sync::{
blocking_mutex::raw::NoopRawMutex,
channel::{Channel, Sender},
};
use embassy_time::{Duration, Ticker, Timer};
use embedded_io_async::Read;
use dsmr5::Readout;
use nourl::Url;
use rust_mqtt::{ use rust_mqtt::{
client::{ client::{
client::MqttClient, client::MqttClient,
@ -46,6 +43,8 @@ use rust_mqtt::{
use serde::Deserialize; use serde::Deserialize;
use static_cell::make_static; use static_cell::make_static;
use defmt::{debug, error, info, trace, warn, Format};
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
bind_interrupts!(struct Irqs { bind_interrupts!(struct Irqs {
@ -217,7 +216,7 @@ async fn main(spawner: Spawner) {
let stack = make_static!(Stack::new( let stack = make_static!(Stack::new(
net_device, net_device,
config, config,
make_static!(StackResources::<2>::new()), make_static!(StackResources::<6>::new()),
rng.next_u64(), rng.next_u64(),
)); ));
@ -245,7 +244,11 @@ async fn main(spawner: Spawner) {
let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
// socket.set_timeout(Some(Duration::from_secs(10))); // socket.set_timeout(Some(Duration::from_secs(10)));
let addr = IpEndpoint::from_str(env!("MQTT_ADDRESS")).unwrap(); let url = Url::parse(env!("MQTT_ADDRESS")).unwrap();
debug!("MQTT URL: {}", url);
let ip = stack.dns_query(url.host(), DnsQueryType::A).await.unwrap()[0];
let addr = (ip, url.port_or_default());
debug!("MQTT ADDR: {}", addr);
while let Err(e) = socket.connect(addr).await { while let Err(e) = socket.connect(addr).await {
warn!("Connect error: {:?}", e); warn!("Connect error: {:?}", e);
@ -329,7 +332,12 @@ async fn main(spawner: Spawner) {
} }
}; };
info!("{}", message); trace!("UpdateMessage: {}", message);
let url = Url::parse(message.url).unwrap();
let ip = stack.dns_query(url.host(), DnsQueryType::A).await;
debug!("Update IP: {}", ip);
} }
} }
} }