From ef60562cf33eb85cc8d3d721c7a5fd3912a56fc6 Mon Sep 17 00:00:00 2001 From: Claas Date: Sat, 27 Jul 2024 00:55:42 +0200 Subject: [PATCH] Begin custom MQTT implementation --- Cargo.lock | 514 +++++++++++++++++++++++++++++-------- Cargo.toml | 2 +- fan-controller/Cargo.toml | 1 + fan-controller/src/main.rs | 11 + mqtt/Cargo.toml | 10 + mqtt/src/main.rs | 158 ++++++++++++ 6 files changed, 595 insertions(+), 101 deletions(-) create mode 100644 mqtt/Cargo.toml create mode 100644 mqtt/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 44abb53..b2630dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,6 +124,33 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "aws-lc-rs" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e89b6941c2d1a7045538884d6e760ccfffdf8e1ffc2613d8efa74305e1f3752" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] + [[package]] name = "az" version = "1.2.1" @@ -166,6 +193,35 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "bbqueue" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3baa8859d1a4c7411039a75c0599a4640ef1c9a8fc811e4325b00e6cfe0a55" + +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.71", + "which", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -241,6 +297,19 @@ name = "cc" version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -258,6 +327,26 @@ dependencies = [ "inout", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -568,6 +657,12 @@ dependencies = [ "litrs", ] +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "either" version = "1.13.0" @@ -857,6 +952,17 @@ dependencies = [ "embedded-io", ] +[[package]] +name = "embedded-nal" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9efecb57ab54fa918730f2874d7d37647169c50fa1357fecb81abee840b113" +dependencies = [ + "heapless 0.7.17", + "nb 1.1.0", + "no-std-net 0.5.0", +] + [[package]] name = "embedded-nal" version = "0.8.0" @@ -864,7 +970,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a943fad5ed3d3f8a00f1e80f6bba371f1e7f0df28ec38477535eb318dc19cc" dependencies = [ "nb 1.1.0", - "no-std-net", + "no-std-net 0.6.0", ] [[package]] @@ -874,8 +980,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72229137a4fc12d239b0b7f50f04b30790678da6d782a0f3f1909bf57ec4b759" dependencies = [ "embedded-io-async", - "embedded-nal", - "no-std-net", + "embedded-nal 0.8.0", + "no-std-net 0.6.0", ] [[package]] @@ -931,6 +1037,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "fan-controller" version = "0.1.0" @@ -948,6 +1064,7 @@ dependencies = [ "embassy-rp", "embassy-time", "mqttrust", + "mqttrust_core", "panic-probe", "portable-atomic", "reqwless", @@ -988,6 +1105,31 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "fugit" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" +dependencies = [ + "gcd", +] + +[[package]] +name = "fugit-timer" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9607bfc4c388f9d629704f56ede4a007546cad417b3bcd6fc7c87dc7edce04a" +dependencies = [ + "fugit", + "nb 1.1.0", +] + [[package]] name = "futures" version = "0.3.30" @@ -1061,6 +1203,12 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + [[package]] name = "generic-array" version = "0.12.4" @@ -1117,6 +1265,12 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "group" version = "0.13.0" @@ -1192,6 +1346,7 @@ dependencies = [ "atomic-polyfill", "hash32 0.2.1", "rustc_version 0.4.0", + "serde", "spin", "stable_deref_trait", ] @@ -1237,6 +1392,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys", +] + [[package]] name = "httparse" version = "1.9.4" @@ -1286,7 +1450,7 @@ checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1298,6 +1462,15 @@ dependencies = [ "either", ] +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "lalrpop" version = "0.19.12" @@ -1329,12 +1502,34 @@ dependencies = [ "regex", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets", +] + [[package]] name = "libredox" version = "0.1.3" @@ -1365,6 +1560,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "litrs" version = "0.4.1" @@ -1408,6 +1609,12 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -1419,13 +1626,30 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys", +] + +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + +[[package]] +name = "mqtt" +version = "0.1.0" +dependencies = [ + "thiserror", + "tokio", + "tokio-rustls", + "webpki-roots", ] [[package]] @@ -1437,6 +1661,22 @@ dependencies = [ "heapless 0.7.17", ] +[[package]] +name = "mqttrust_core" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d1cddb4f21cfbf6757aeb2ee8723a0b0d7f14199825989af6ccfef15e6a9d1" +dependencies = [ + "bbqueue", + "defmt", + "embedded-nal 0.6.0", + "fugit", + "fugit-timer", + "heapless 0.7.17", + "mqttrust", + "nb 1.1.0", +] + [[package]] name = "nb" version = "0.1.3" @@ -1469,12 +1709,28 @@ dependencies = [ "libc", ] +[[package]] +name = "no-std-net" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bcece43b12349917e096cddfa66107277f123e6c96a5aea78711dc601a47152" + [[package]] name = "no-std-net" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nourl" version = "0.1.1" @@ -1493,16 +1749,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" version = "0.5.11" @@ -1583,7 +1829,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1702,6 +1948,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.71", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -1845,6 +2101,21 @@ dependencies = [ "rand_core", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys", +] + [[package]] name = "rp-pac" version = "6.0.0" @@ -1870,6 +2141,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1888,6 +2165,52 @@ dependencies = [ "semver 1.0.23", ] +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustls" +version = "0.23.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-webpki" +version = "0.102.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -1985,6 +2308,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2027,7 +2356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2152,34 +2481,44 @@ dependencies = [ [[package]] name = "tokio" -version = "1.38.1" +version = "1.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", "syn 2.0.71", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "typenum" version = "1.17.0" @@ -2223,6 +2562,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "vcell" version = "0.1.3" @@ -2256,6 +2601,27 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "webpki-roots" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2278,7 +2644,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2287,37 +2653,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -2326,46 +2668,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -2378,48 +2702,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -2431,3 +2731,17 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] diff --git a/Cargo.toml b/Cargo.toml index 3fbf864..61f9b2e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["debug-listener", "fan-controller", ] +members = ["debug-listener", "fan-controller", "mqtt", ] resolver = "2" diff --git a/fan-controller/Cargo.toml b/fan-controller/Cargo.toml index 112a584..a94ad11 100644 --- a/fan-controller/Cargo.toml +++ b/fan-controller/Cargo.toml @@ -17,6 +17,7 @@ embassy-net = { version = "0.4.0", features = ["defmt", "tcp", "dhcpv4", "dns"] embassy-rp = { version = "0.1.0", features = ["defmt", "unstable-pac", "time-driver", "critical-section-impl"] } embassy-time = "0.3.1" mqttrust = "0.6.0" +mqttrust_core = { version = "0.6.0", features = ["defmt"] } panic-probe = "0.3.2" portable-atomic = { version = "1.7", features = ["critical-section"] } reqwless = { version = "0.12.1", features = ["defmt"] } diff --git a/fan-controller/src/main.rs b/fan-controller/src/main.rs index a78f320..77bf4dc 100644 --- a/fan-controller/src/main.rs +++ b/fan-controller/src/main.rs @@ -29,6 +29,7 @@ use embassy_rp::{bind_interrupts, uart, Peripherals, Peripheral, pio, dma}; use embassy_rp::clocks::RoscRng; use embassy_rp::spi::ClkPin; use embassy_time::{Duration, Timer}; +use mqttrust_core::bbqueue::BBBuffer; use reqwless::client::{TlsConfig, TlsVerify}; use static_cell::StaticCell; use {defmt_rtt as _, panic_probe as _}; @@ -199,6 +200,16 @@ async fn setup_tls(spawner: Spawner, net_device: NetDriver, mut control: Control //TODO consider increasing security by including a pre shared key otherwise this is // vulnerable to man in the middle attacks let tls_configuration = TlsConfig::new(seed, &mut tls_read_buffer, &mut tls_write_buffer, TlsVerify::None); + + + // MQTT stuff following the examples in the mqttrust repository + static mut BUFFER: BBBuffer<{ 1024 * 6 }> = BBBuffer::new(); + + let (producer, consumer) = unsafe { BUFFER.try_split_framed().unwrap() }; + + let client_id = "mqtt_test_client_id"; + + let client = mqttrust_core::Client::new(producer, client_id); } } diff --git a/mqtt/Cargo.toml b/mqtt/Cargo.toml new file mode 100644 index 0000000..c78e699 --- /dev/null +++ b/mqtt/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "mqtt" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "1.0.63" +tokio = { version = "1.39.1", features = ["full"] } +tokio-rustls = "0.26.0" +webpki-roots = "0.26.3" diff --git a/mqtt/src/main.rs b/mqtt/src/main.rs new file mode 100644 index 0000000..c30f28e --- /dev/null +++ b/mqtt/src/main.rs @@ -0,0 +1,158 @@ +use std::net::{AddrParseError, SocketAddr, ToSocketAddrs}; +use std::str::FromStr; +use std::sync::Arc; +use tokio::net::TcpStream; +use tokio_rustls::rustls::{ClientConfig, RootCertStore}; +use tokio_rustls::rustls::pki_types::{InvalidDnsNameError, ServerName}; +use tokio_rustls::TlsConnector; + +const MQTT_BROKER_ADDRESS: &str = "91c57a00c93443dc90b40bfcaefa7aa3.s1.eu.hivemq.cloud"; + +#[derive(Debug, thiserror::Error)] +enum AppError { + #[error("Failed to create address")] + CreateAddressError(#[from] AddrParseError), + #[error("Could not create server name")] + CreateServerNameError(#[from] InvalidDnsNameError), + #[error("Failed to connect to broker")] + ConnectError(#[from] std::io::Error), +} + +/// Encodes an integer as variable byte integer according to the MQTT specification +fn encode_variable_byte_integer(mut x: u32) -> Vec { + // Each byte can hold 7 bits, so how many 7 bit "bytes" do we need for 32 bits? + // 32 / 7 + let length = 32usize.div_ceil(7); + let mut output = Vec::with_capacity(length); + loop { + // 128 = 0b1000_0000 + + // x = 128 = 0b1000_0000 + // encoded_byte = 128 % 0b1000_0000 = 0 + let mut encoded_byte = (x % 0b1000_0000); + println!("Encoded byte (remainder): {encoded_byte:#010b} {encoded_byte} {x} {}", 0x00_00_80_01_u32); + + // x = 128 / 128 = 1 + x = x / 0b1000_0000; + // If there is more data to encode, set the top bit of this byte + if x > 0 { + encoded_byte |= 0b1000_0000; + } + + output.push(encoded_byte as u8); + + if x > 0 { + continue; + } else { + break; + } + } + + output +} + +#[test] +fn can_encode_variable_byte_integer() { + // Random examples from https://www.emqx.com/en/blog/mqtt-5-0-control-packets-01-connect-connack + assert_eq!(encode_variable_byte_integer(47), [0x2f]); + assert_eq!(encode_variable_byte_integer(19), [0x13]); + + // Range one byte + assert_eq!(encode_variable_byte_integer(0), [0b0000_0000]); + assert_eq!(encode_variable_byte_integer(1), [0b0000_0001]); + assert_eq!(encode_variable_byte_integer(127), [0b0111_1111]); + // Range two bytes + assert_eq!(encode_variable_byte_integer(128), [0b1000_0000, 0b0000_0001]); + assert_eq!(encode_variable_byte_integer(16_383), [0b1111_1111, 0b0111_1111]); + + // Range three bytes + assert_eq!(encode_variable_byte_integer(16_384), [0b1000_0000, 0b1000_0000, 0b0000_0001]); + assert_eq!(encode_variable_byte_integer(2_097_151), [0b1111_1111, 0b1111_1111, 0b0111_1111]); + // Range four bytes + assert_eq!(encode_variable_byte_integer(2_097_152), [0b1000_0000, 0b1000_0000, 0b1000_0000, 0b0000_0001]); + assert_eq!(encode_variable_byte_integer(268_435_455), [0b1111_1111, 0b1111_1111, 0b1111_1111, 0b0111_1111]); +} + +#[derive(Debug)] +enum DecodeVariableByteIntegerError { + MalformedVariableByteIntegerError, + UnexpectedEndOfInput, +} + + +fn decode_variable_byte_integer(bytes: impl IntoIterator + std::fmt::Debug) -> Result { + dbg!(&bytes); + let mut multiplier = 1; + let mut value: u32 = 0; + + let mut bytes = bytes.into_iter(); + loop { + let encoded_byte = bytes.next().ok_or(DecodeVariableByteIntegerError::UnexpectedEndOfInput)?; + dbg!(encoded_byte); + + value += (encoded_byte & 127) as u32 * multiplier; + + if multiplier > 128 * 128 * 128 { + return Err(DecodeVariableByteIntegerError::MalformedVariableByteIntegerError); + } + + multiplier *= 128; + + // The last byte has the most significant bit set to 0 indicating that there are no more bytes to follow + if (encoded_byte & 128) != 0 { + continue; + } else { + break; + } + } + + Ok(value) +} + +#[test] +fn can_decode_variable_byte_integer() { + // Random examples from https://www.emqx.com/en/blog/mqtt-5-0-control-packets-01-connect-connack + assert_eq!(decode_variable_byte_integer([0x2f]).unwrap(), 47); + assert_eq!(decode_variable_byte_integer([0x13]).unwrap(), 19); + + // Range one byte + assert_eq!(decode_variable_byte_integer([0b0000_0000]).unwrap(), 0); + assert_eq!(decode_variable_byte_integer([0b0000_0001]).unwrap(), 1); + assert_eq!(decode_variable_byte_integer([0b0111_1111]).unwrap(), 127); + + // Range two bytes + assert_eq!(decode_variable_byte_integer([0b1000_0000, 0b0000_0001]).unwrap(), 128); + assert_eq!(decode_variable_byte_integer([0b1111_1111, 0b0111_1111]).unwrap(), 16_383); + + // Range three bytes + assert_eq!(decode_variable_byte_integer([0b1000_0000, 0b1000_0000, 0b0000_0001]).unwrap(), 16_384); + assert_eq!(decode_variable_byte_integer([0b1111_1111, 0b1111_1111, 0b0111_1111]).unwrap(), 2_097_151); + + // Range four bytes + assert_eq!(decode_variable_byte_integer([0b1000_0000, 0b1000_0000, 0b1000_0000, 0b0000_0001]).unwrap(), 2_097_152); + assert_eq!(decode_variable_byte_integer([0b1111_1111, 0b1111_1111, 0b1111_1111, 0b0111_1111]).unwrap(), 268_435_455); +} + +#[tokio::main] +async fn main() -> Result<(), AppError> { + let mut root_certificate_store = RootCertStore::empty(); + root_certificate_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned()); + let configuration = ClientConfig::builder() + .with_root_certificates(root_certificate_store) + .with_no_client_auth(); + let connector = TlsConnector::from(Arc::new(configuration)); + let address = (MQTT_BROKER_ADDRESS, 8883).to_socket_addrs()?.next().unwrap(); + // let address = SocketAddr::from_str(MQTT_BROKER_ADDRESS)?; + let server_name = ServerName::try_from("91c57a00c93443dc90b40bfcaefa7aa3.s1.eu.hivemq.cloud")?; + + let stream = TcpStream::connect(&address).await?; + let mut stream = connector.connect(server_name, stream).await?; + + // MQTT + // Connection request + let fixed_header = 0b001_0000_u8; + + + println!("Hello, world! {fixed_header}"); + Ok(()) +} -- 2.51.2