From d77a3da68d2848555274a9886c1dfe6b166b3cf3 Mon Sep 17 00:00:00 2001 From: LailaTheElf Date: Mon, 20 Jan 2025 23:15:55 +0100 Subject: [PATCH] move to rust --- .gitignore | 1 + .gitmodules | 3 - Cargo.lock | 800 +++++++ Cargo.toml | 9 + Makefile | 29 - VersionInfo.h | 7 - include/paho-mqtt/MQTTAsync.h | 2383 -------------------- include/paho-mqtt/MQTTClient.h | 1972 ---------------- include/paho-mqtt/MQTTClientPersistence.h | 277 --- include/paho-mqtt/MQTTExportDeclarations.h | 36 - include/paho-mqtt/MQTTProperties.h | 219 -- include/paho-mqtt/MQTTReasonCodes.h | 79 - include/paho-mqtt/MQTTSubscribeOpts.h | 46 - mqttClient | Bin 45880 -> 0 bytes src/conf.h | 19 - src/main.c | 44 - src/main.rs | 173 ++ src/module.c | 66 - src/module.h | 19 - src/modules/buttons.c | 33 - src/modules/clock.c | 102 - src/mqtt.c | 259 --- src/mqtt.h | 25 - src/test.c | 35 - 24 files changed, 983 insertions(+), 5653 deletions(-) create mode 100644 .gitignore delete mode 100644 .gitmodules create mode 100644 Cargo.lock create mode 100644 Cargo.toml delete mode 100644 Makefile delete mode 100644 VersionInfo.h delete mode 100644 include/paho-mqtt/MQTTAsync.h delete mode 100644 include/paho-mqtt/MQTTClient.h delete mode 100644 include/paho-mqtt/MQTTClientPersistence.h delete mode 100644 include/paho-mqtt/MQTTExportDeclarations.h delete mode 100644 include/paho-mqtt/MQTTProperties.h delete mode 100644 include/paho-mqtt/MQTTReasonCodes.h delete mode 100644 include/paho-mqtt/MQTTSubscribeOpts.h delete mode 100755 mqttClient delete mode 100644 src/conf.h delete mode 100644 src/main.c create mode 100644 src/main.rs delete mode 100644 src/module.c delete mode 100644 src/module.h delete mode 100644 src/modules/buttons.c delete mode 100644 src/modules/clock.c delete mode 100644 src/mqtt.c delete mode 100644 src/mqtt.h delete mode 100644 src/test.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 43ca15e..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "paho.mqtt.c"] - path = libs/paho.mqtt.c/ - url = https://github.com/eclipse/paho.mqtt.c.git diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..75c7c9d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,800 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bitflags" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "cc" +version = "1.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "mqttclient" +version = "0.1.0" +dependencies = [ + "chrono", + "crossbeam", + "rumqttc", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[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 0.52.0", +] + +[[package]] +name = "rumqttc" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1568e15fab2d546f940ed3a21f48bbbd1c494c90c99c4481339364a497f94a9" +dependencies = [ + "bytes", + "flume", + "futures-util", + "log", + "rustls-native-certs", + "rustls-pemfile", + "rustls-webpki", + "thiserror", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustls" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio" +version = "1.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0b3b5cb --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "mqttclient" +version = "0.1.0" +edition = "2021" + +[dependencies] +chrono = "0.4.39" +crossbeam = "0.8.4" +rumqttc = "0.24.0" diff --git a/Makefile b/Makefile deleted file mode 100644 index 8a72668..0000000 --- a/Makefile +++ /dev/null @@ -1,29 +0,0 @@ - -SRC := src/main.c src/mqtt.c src/module.c src/modules/*.c -INC := -I src -LIBS := -lpthread -lpthread - -# paho mqtt -LIBPAHO_DIR := libs/paho.mqtt.c -INC += -I $(LIBPAHO_DIR)/src -LIBS += -L$(LIBPAHO_DIR)/build/output -lpaho-mqtt3a -lpaho-mqtt3c - -all: build - -build-paho: $(LIBPAHO_DIR) - cd $(LIBPAHO_DIR) && make build - -build: $(SRC) | ${build-paho} - gcc $(SRC) $(LIBS) -o mqttClient $(INC) - -debug: $(SRC) - gcc $(SRC) $(LIBS) -g -o mqttClient $(INC) - -install: - mkdir -p $$HOME/.local/bin - cp mqttClient $$HOME/.local/bin/mqttClient - chmod +x $$HOME/.local/bin/mqttClient - # sed -e "s//$$(id -un)/g" mqttClient.service >/etc/systemd/system/mqttClient.service - -clean: - rm mqttClient diff --git a/VersionInfo.h b/VersionInfo.h deleted file mode 100644 index 16e878f..0000000 --- a/VersionInfo.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef VERSIONINFO_H -#define VERSIONINFO_H - -#define BUILD_TIMESTAMP "2022-10-16T18:54:22Z" -#define CLIENT_VERSION "" - -#endif /* VERSIONINFO_H */ diff --git a/include/paho-mqtt/MQTTAsync.h b/include/paho-mqtt/MQTTAsync.h deleted file mode 100644 index 90f9f7b..0000000 --- a/include/paho-mqtt/MQTTAsync.h +++ /dev/null @@ -1,2383 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2022 IBM Corp., Ian Craggs and others - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial API and implementation - * Ian Craggs, Allan Stockdill-Mander - SSL connections - * Ian Craggs - multiple server connection support - * Ian Craggs - MQTT 3.1.1 support - * Ian Craggs - fix for bug 444103 - success/failure callbacks not invoked - * Ian Craggs - automatic reconnect and offline buffering (send while disconnected) - * Ian Craggs - binary will message - * Ian Craggs - binary password - * Ian Craggs - remove const on eyecatchers #168 - * Ian Craggs - MQTT 5.0 - *******************************************************************************/ - -/********************************************************************/ - -/** - * @cond MQTTAsync_main - * @mainpage Asynchronous MQTT client library for C (MQTTAsync) - * - * © Copyright 2009, 2022 IBM Corp., Ian Craggs and others - * - * @brief An Asynchronous MQTT client library for C. - * - * An MQTT client application connects to MQTT-capable servers. - * A typical client is responsible for collecting information from a telemetry - * device and publishing the information to the server. It can also subscribe - * to topics, receive messages, and use this information to control the - * telemetry device. - * - * MQTT clients implement the published MQTT v3 protocol. You can write your own - * API to the MQTT protocol using the programming language and platform of your - * choice. This can be time-consuming and error-prone. - * - * To simplify writing MQTT client applications, this library encapsulates - * the MQTT v3 protocol for you. Using this library enables a fully functional - * MQTT client application to be written in a few lines of code. - * The information presented here documents the API provided - * by the Asynchronous MQTT Client library for C. - * - * Using the client
- * Applications that use the client library typically use a similar structure: - * - * Some simple examples are shown here: - * - * Additional information about important concepts is provided here: - * - * @endcond - */ - -/* -/// @cond EXCLUDE -*/ -#if !defined(MQTTASYNC_H) -#define MQTTASYNC_H - -#if defined(__cplusplus) - extern "C" { -#endif - -#include -/* -/// @endcond -*/ - -#include "MQTTExportDeclarations.h" - -#include "MQTTProperties.h" -#include "MQTTReasonCodes.h" -#include "MQTTSubscribeOpts.h" -#if !defined(NO_PERSISTENCE) -#include "MQTTClientPersistence.h" -#endif - -/** - * Return code: No error. Indicates successful completion of an MQTT client - * operation. - */ -#define MQTTASYNC_SUCCESS 0 -/** - * Return code: A generic error code indicating the failure of an MQTT client - * operation. - */ -#define MQTTASYNC_FAILURE -1 - -/* error code -2 is MQTTAsync_PERSISTENCE_ERROR */ - -#define MQTTASYNC_PERSISTENCE_ERROR -2 - -/** - * Return code: The client is disconnected. - */ -#define MQTTASYNC_DISCONNECTED -3 -/** - * Return code: The maximum number of messages allowed to be simultaneously - * in-flight has been reached. - */ -#define MQTTASYNC_MAX_MESSAGES_INFLIGHT -4 -/** - * Return code: An invalid UTF-8 string has been detected. - */ -#define MQTTASYNC_BAD_UTF8_STRING -5 -/** - * Return code: A NULL parameter has been supplied when this is invalid. - */ -#define MQTTASYNC_NULL_PARAMETER -6 -/** - * Return code: The topic has been truncated (the topic string includes - * embedded NULL characters). String functions will not access the full topic. - * Use the topic length value to access the full topic. - */ -#define MQTTASYNC_TOPICNAME_TRUNCATED -7 -/** - * Return code: A structure parameter does not have the correct eyecatcher - * and version number. - */ -#define MQTTASYNC_BAD_STRUCTURE -8 -/** - * Return code: A qos parameter is not 0, 1 or 2 - */ -#define MQTTASYNC_BAD_QOS -9 -/** - * Return code: All 65535 MQTT msgids are being used - */ -#define MQTTASYNC_NO_MORE_MSGIDS -10 -/** - * Return code: the request is being discarded when not complete - */ -#define MQTTASYNC_OPERATION_INCOMPLETE -11 -/** - * Return code: no more messages can be buffered - */ -#define MQTTASYNC_MAX_BUFFERED_MESSAGES -12 -/** - * Return code: Attempting SSL connection using non-SSL version of library - */ -#define MQTTASYNC_SSL_NOT_SUPPORTED -13 -/** - * Return code: protocol prefix in serverURI should be: - * @li @em tcp:// or @em mqtt:// - Insecure TCP - * @li @em ssl:// or @em mqtts:// - Encrypted SSL/TLS - * @li @em ws:// - Insecure websockets - * @li @em wss:// - Secure web sockets - * - * The TLS enabled prefixes (ssl, mqtts, wss) are only valid if the TLS - * version of the library is linked with. - */ -#define MQTTASYNC_BAD_PROTOCOL -14 -/** - * Return code: don't use options for another version of MQTT - */ -#define MQTTASYNC_BAD_MQTT_OPTION -15 -/** - * Return code: call not applicable to the client's version of MQTT - */ -#define MQTTASYNC_WRONG_MQTT_VERSION -16 -/** - * Return code: 0 length will topic - */ -#define MQTTASYNC_0_LEN_WILL_TOPIC -17 -/* - * Return code: connect or disconnect command ignored because there is already a connect or disconnect - * command at the head of the list waiting to be processed. Use the onSuccess/onFailure callbacks to wait - * for the previous connect or disconnect command to be complete. - */ -#define MQTTASYNC_COMMAND_IGNORED -18 - /* - * Return code: maxBufferedMessages in the connect options must be >= 0 - */ - #define MQTTASYNC_MAX_BUFFERED -19 - -/** - * Default MQTT version to connect with. Use 3.1.1 then fall back to 3.1 - */ -#define MQTTVERSION_DEFAULT 0 -/** - * MQTT version to connect with: 3.1 - */ -#define MQTTVERSION_3_1 3 -/** - * MQTT version to connect with: 3.1.1 - */ -#define MQTTVERSION_3_1_1 4 -/** - * MQTT version to connect with: 5 - */ -#define MQTTVERSION_5 5 -/** - * Bad return code from subscribe, as defined in the 3.1.1 specification - */ -#define MQTT_BAD_SUBSCRIBE 0x80 - - -/** - * Initialization options - */ -typedef struct -{ - /** The eyecatcher for this structure. Must be MQTG. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 */ - int struct_version; - /** 1 = we do openssl init, 0 = leave it to the application */ - int do_openssl_init; -} MQTTAsync_init_options; - -#define MQTTAsync_init_options_initializer { {'M', 'Q', 'T', 'G'}, 0, 0 } - -/** - * Global init of mqtt library. Call once on program start to set global behaviour. - * handle_openssl_init - if mqtt library should handle openssl init (1) or rely on the caller to init it before using mqtt (0) - */ -LIBMQTT_API void MQTTAsync_global_init(MQTTAsync_init_options* inits); - -/** - * A handle representing an MQTT client. A valid client handle is available - * following a successful call to MQTTAsync_create(). - */ -typedef void* MQTTAsync; -/** - * A value representing an MQTT message. A token is returned to the - * client application when a message is published. The token can then be used to - * check that the message was successfully delivered to its destination (see - * MQTTAsync_publish(), - * MQTTAsync_publishMessage(), - * MQTTAsync_deliveryComplete(), and - * MQTTAsync_getPendingTokens()). - */ -typedef int MQTTAsync_token; - -/** - * A structure representing the payload and attributes of an MQTT message. The - * message topic is not part of this structure (see MQTTAsync_publishMessage(), - * MQTTAsync_publish(), MQTTAsync_receive(), MQTTAsync_freeMessage() - * and MQTTAsync_messageArrived()). - */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQTM. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 or 1. - * 0 indicates no message properties */ - int struct_version; - /** The length of the MQTT message payload in bytes. */ - int payloadlen; - /** A pointer to the payload of the MQTT message. */ - void* payload; - /** - * The quality of service (QoS) assigned to the message. - * There are three levels of QoS: - *
- *
QoS0
- *
Fire and forget - the message may not be delivered
- *
QoS1
- *
At least once - the message will be delivered, but may be - * delivered more than once in some circumstances.
- *
QoS2
- *
Once and one only - the message will be delivered exactly once.
- *
- */ - int qos; - /** - * The retained flag serves two purposes depending on whether the message - * it is associated with is being published or received. - * - * retained = true
- * For messages being published, a true setting indicates that the MQTT - * server should retain a copy of the message. The message will then be - * transmitted to new subscribers to a topic that matches the message topic. - * For subscribers registering a new subscription, the flag being true - * indicates that the received message is not a new one, but one that has - * been retained by the MQTT server. - * - * retained = false
- * For publishers, this indicates that this message should not be retained - * by the MQTT server. For subscribers, a false setting indicates this is - * a normal message, received as a result of it being published to the - * server. - */ - int retained; - /** - * The dup flag indicates whether or not this message is a duplicate. - * It is only meaningful when receiving QoS1 messages. When true, the - * client application should take appropriate action to deal with the - * duplicate message. This is an output parameter only. - */ - int dup; - /** The message identifier is reserved for internal use by the - * MQTT client and server. It is an output parameter only - writing - * to it will serve no purpose. It contains the MQTT message id of - * an incoming publish message. - */ - int msgid; - /** - * The MQTT V5 properties associated with the message. - */ - MQTTProperties properties; -} MQTTAsync_message; - -#define MQTTAsync_message_initializer { {'M', 'Q', 'T', 'M'}, 1, 0, NULL, 0, 0, 0, 0, MQTTProperties_initializer } - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * receipt of messages. The function is registered with the client library by - * passing it as an argument to MQTTAsync_setCallbacks(). It is - * called by the client library when a new message that matches a client - * subscription has been received from the server. This function is executed on - * a separate thread to the one on which the client application is running. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * MQTTAsync_setCallbacks(), which contains any application-specific context. - * @param topicName The topic associated with the received message. - * @param topicLen The length of the topic if there are one - * more NULL characters embedded in topicName, otherwise topicLen - * is 0. If topicLen is 0, the value returned by strlen(topicName) - * can be trusted. If topicLen is greater than 0, the full topic name - * can be retrieved by accessing topicName as a byte array of length - * topicLen. - * @param message The MQTTAsync_message structure for the received message. - * This structure contains the message payload and attributes. - * @return This function must return 0 or 1 indicating whether or not - * the message has been safely received by the client application.
- * Returning 1 indicates that the message has been successfully handled. - * To free the message storage, ::MQTTAsync_freeMessage must be called. - * To free the topic name storage, ::MQTTAsync_free must be called.
- * Returning 0 indicates that there was a problem. In this - * case, the client library will reinvoke MQTTAsync_messageArrived() to - * attempt to deliver the message to the application again. - * Do not free the message and topic storage when returning 0, otherwise - * the redelivery will fail. - */ -typedef int MQTTAsync_messageArrived(void* context, char* topicName, int topicLen, MQTTAsync_message* message); - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * notification of delivery of messages to the server. The function is - * registered with the client library by passing it as an argument to MQTTAsync_setCallbacks(). - * It is called by the client library after the client application has - * published a message to the server. It indicates that the necessary - * handshaking and acknowledgements for the requested quality of service (see - * MQTTAsync_message.qos) have been completed. This function is executed on a - * separate thread to the one on which the client application is running. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * MQTTAsync_setCallbacks(), which contains any application-specific context. - * @param token The ::MQTTAsync_token associated with - * the published message. Applications can check that all messages have been - * correctly published by matching the tokens returned from calls to - * MQTTAsync_send() and MQTTAsync_sendMessage() with the tokens passed - * to this callback. - */ -typedef void MQTTAsync_deliveryComplete(void* context, MQTTAsync_token token); - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * notification of the loss of connection to the server. The function is - * registered with the client library by passing it as an argument to - * MQTTAsync_setCallbacks(). It is called by the client library if the client - * loses its connection to the server. The client application must take - * appropriate action, such as trying to reconnect or reporting the problem. - * This function is executed on a separate thread to the one on which the - * client application is running. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * MQTTAsync_setCallbacks(), which contains any application-specific context. - * @param cause The reason for the disconnection. - * Currently, cause is always set to NULL. - */ -typedef void MQTTAsync_connectionLost(void* context, char* cause); - - -/** - * This is a callback function, which will be called when the client - * library successfully connects. This is superfluous when the connection - * is made in response to a MQTTAsync_connect call, because the onSuccess - * callback can be used. It is intended for use when automatic reconnect - * is enabled, so that when a reconnection attempt succeeds in the background, - * the application is notified and can take any required actions. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * MQTTAsync_setCallbacks(), which contains any application-specific context. - * @param cause The reason for the disconnection. - * Currently, cause is always set to NULL. - */ -typedef void MQTTAsync_connected(void* context, char* cause); - -/** - * This is a callback function, which will be called when the client - * library receives a disconnect packet from the server. This applies to MQTT V5 and above only. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * MQTTAsync_setCallbacks(), which contains any application-specific context. - * @param properties the properties in the disconnect packet. - * @param properties the reason code from the disconnect packet - * Currently, cause is always set to NULL. - */ -typedef void MQTTAsync_disconnected(void* context, MQTTProperties* properties, - enum MQTTReasonCodes reasonCode); - -/** - * Sets the MQTTAsync_disconnected() callback function for a client. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to any application-specific context. The - * the context pointer is passed to each of the callback functions to - * provide access to the context information in the callback. - * @param co A pointer to an MQTTAsync_connected() callback - * function. NULL removes the callback setting. - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTAsync_setDisconnected(MQTTAsync handle, void* context, MQTTAsync_disconnected* co); - -/** The connect options that can be updated before an automatic reconnect. */ -typedef struct -{ - /** The eyecatcher for this structure. Will be MQCD. */ - char struct_id[4]; - /** The version number of this structure. Will be 0 */ - int struct_version; - /** - * MQTT servers that support the MQTT v3.1 protocol provide authentication - * and authorisation by user name and password. This is the user name parameter. - * Set data to NULL to remove. To change, allocate new - * storage with ::MQTTAsync_allocate - this will then be free later by the library. - */ - const char* username; - /** - * The password parameter of the MQTT authentication. - * Set data to NULL to remove. To change, allocate new - * storage with ::MQTTAsync_allocate - this will then be free later by the library. - */ - struct { - int len; /**< binary password length */ - const void* data; /**< binary password data */ - } binarypwd; -} MQTTAsync_connectData; - -#define MQTTAsync_connectData_initializer {{'M', 'Q', 'C', 'D'}, 0, NULL, {0, NULL}} - -/** - * This is a callback function which will allow the client application to update the - * connection data. - * @param data The connection data which can be modified by the application. - * @return Return a non-zero value to update the connect data, zero to keep the same data. - */ -typedef int MQTTAsync_updateConnectOptions(void* context, MQTTAsync_connectData* data); - -/** - * Sets the MQTTAsync_updateConnectOptions() callback function for a client. - * @param handle A valid client handle from a successful call to MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to each of the callback functions to - * provide access to the context information in the callback. - * @param co A pointer to an MQTTAsync_updateConnectOptions() callback - * function. NULL removes the callback setting. - */ -LIBMQTT_API int MQTTAsync_setUpdateConnectOptions(MQTTAsync handle, void* context, MQTTAsync_updateConnectOptions* co); - -/** - * Sets the MQTTPersistence_beforeWrite() callback function for a client. - * @param handle A valid client handle from a successful call to MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to the callback function to - * provide access to the context information in the callback. - * @param co A pointer to an MQTTPersistence_beforeWrite() callback - * function. NULL removes the callback setting. - */ -LIBMQTT_API int MQTTAsync_setBeforePersistenceWrite(MQTTAsync handle, void* context, MQTTPersistence_beforeWrite* co); - - -/** - * Sets the MQTTPersistence_afterRead() callback function for a client. - * @param handle A valid client handle from a successful call to MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to the callback function to - * provide access to the context information in the callback. - * @param co A pointer to an MQTTPersistence_beforeWrite() callback - * function. NULL removes the callback setting. - */ -LIBMQTT_API int MQTTAsync_setAfterPersistenceRead(MQTTAsync handle, void* context, MQTTPersistence_afterRead* co); - - -/** The data returned on completion of an unsuccessful API call in the response callback onFailure. */ -typedef struct -{ - /** A token identifying the failed request. */ - MQTTAsync_token token; - /** A numeric code identifying the error. */ - int code; - /** Optional text explaining the error. Can be NULL. */ - const char *message; -} MQTTAsync_failureData; - - -/** The data returned on completion of an unsuccessful API call in the response callback onFailure. */ -typedef struct -{ - /** The eyecatcher for this structure. Will be MQFD. */ - char struct_id[4]; - /** The version number of this structure. Will be 0 */ - int struct_version; - /** A token identifying the failed request. */ - MQTTAsync_token token; - /** The MQTT reason code returned. */ - enum MQTTReasonCodes reasonCode; - /** The MQTT properties on the ack, if any. */ - MQTTProperties properties; - /** A numeric code identifying the MQTT client library error. */ - int code; - /** Optional further text explaining the error. Can be NULL. */ - const char *message; - /** Packet type on which the failure occurred - used for publish QoS 1/2 exchanges*/ - int packet_type; -} MQTTAsync_failureData5; - -#define MQTTAsync_failureData5_initializer {{'M', 'Q', 'F', 'D'}, 0, 0, MQTTREASONCODE_SUCCESS, MQTTProperties_initializer, 0, NULL, 0} - -/** The data returned on completion of a successful API call in the response callback onSuccess. */ -typedef struct -{ - /** A token identifying the successful request. Can be used to refer to the request later. */ - MQTTAsync_token token; - /** A union of the different values that can be returned for subscribe, unsubscribe and publish. */ - union - { - /** For subscribe, the granted QoS of the subscription returned by the server. - * Also for subscribeMany, if only 1 subscription was requested. */ - int qos; - /** For subscribeMany, if more than one subscription was requested, - * the list of granted QoSs of the subscriptions returned by the server. */ - int* qosList; - /** For publish, the message being sent to the server. */ - struct - { - MQTTAsync_message message; /**< the message being sent to the server */ - char* destinationName; /**< the topic destination for the message */ - } pub; - /* For connect, the server connected to, MQTT version used, and sessionPresent flag */ - struct - { - char* serverURI; /**< the connection string of the server */ - int MQTTVersion; /**< the version of MQTT being used */ - int sessionPresent; /**< the session present flag returned from the server */ - } connect; - } alt; -} MQTTAsync_successData; - - -/** The data returned on completion of a successful API call in the response callback onSuccess. */ -typedef struct -{ - char struct_id[4]; /**< The eyecatcher for this structure. Will be MQSD. */ - int struct_version; /**< The version number of this structure. Will be 0 */ - /** A token identifying the successful request. Can be used to refer to the request later. */ - MQTTAsync_token token; - enum MQTTReasonCodes reasonCode; /**< MQTT V5 reason code returned */ - MQTTProperties properties; /**< MQTT V5 properties returned, if any */ - /** A union of the different values that can be returned for subscribe, unsubscribe and publish. */ - union - { - /** For subscribeMany, the list of reasonCodes returned by the server. */ - struct - { - int reasonCodeCount; /**< the number of reason codes in the reasonCodes array */ - enum MQTTReasonCodes* reasonCodes; /**< an array of reasonCodes */ - } sub; - /** For publish, the message being sent to the server. */ - struct - { - MQTTAsync_message message; /**< the message being sent to the server */ - char* destinationName; /**< the topic destination for the message */ - } pub; - /* For connect, the server connected to, MQTT version used, and sessionPresent flag */ - struct - { - char* serverURI; /**< the connection string of the server */ - int MQTTVersion; /**< the version of MQTT being used */ - int sessionPresent; /**< the session present flag returned from the server */ - } connect; - /** For unsubscribeMany, the list of reasonCodes returned by the server. */ - struct - { - int reasonCodeCount; /**< the number of reason codes in the reasonCodes array */ - enum MQTTReasonCodes* reasonCodes; /**< an array of reasonCodes */ - } unsub; - } alt; -} MQTTAsync_successData5; - -#define MQTTAsync_successData5_initializer {{'M', 'Q', 'S', 'D'}, 0, 0, MQTTREASONCODE_SUCCESS, MQTTProperties_initializer, {.sub={0,0}}} - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * notification of the successful completion of an API call. The function is - * registered with the client library by passing it as an argument in - * ::MQTTAsync_responseOptions. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * ::MQTTAsync_responseOptions, which contains any application-specific context. - * @param response Any success data associated with the API completion. - */ -typedef void MQTTAsync_onSuccess(void* context, MQTTAsync_successData* response); - -/** - * This is a callback function, the MQTT V5 version of ::MQTTAsync_onSuccess. - * The client application - * must provide an implementation of this function to enable asynchronous - * notification of the successful completion of an API call. The function is - * registered with the client library by passing it as an argument in - * ::MQTTAsync_responseOptions. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * ::MQTTAsync_responseOptions, which contains any application-specific context. - * @param response Any success data associated with the API completion. - */ -typedef void MQTTAsync_onSuccess5(void* context, MQTTAsync_successData5* response); - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * notification of the unsuccessful completion of an API call. The function is - * registered with the client library by passing it as an argument in - * ::MQTTAsync_responseOptions. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * ::MQTTAsync_responseOptions, which contains any application-specific context. - * @param response Failure data associated with the API completion. - */ -typedef void MQTTAsync_onFailure(void* context, MQTTAsync_failureData* response); - -/** - * This is a callback function, the MQTT V5 version of ::MQTTAsync_onFailure. - * The application must provide an implementation of this function to enable asynchronous - * notification of the unsuccessful completion of an API call. The function is - * registered with the client library by passing it as an argument in - * ::MQTTAsync_responseOptions. - * - * Note: Neither MQTTAsync_create() nor MQTTAsync_destroy() should be - * called within this callback. - * @param context A pointer to the context value originally passed to - * ::MQTTAsync_responseOptions, which contains any application-specific context. - * @param response Failure data associated with the API completion. - */ -typedef void MQTTAsync_onFailure5(void* context, MQTTAsync_failureData5* response); - -/** Structure to define call options. For MQTT 5.0 there is input data as well as that - * describing the response method. So there is now also a synonym ::MQTTAsync_callOptions - * to better reflect the use. This responseOptions name is kept for backward - * compatibility. - */ -typedef struct MQTTAsync_responseOptions -{ - /** The eyecatcher for this structure. Must be MQTR */ - char struct_id[4]; - /** The version number of this structure. Must be 0 or 1 - * if 0, no MQTTV5 options */ - int struct_version; - /** - * A pointer to a callback function to be called if the API call successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onSuccess* onSuccess; - /** - * A pointer to a callback function to be called if the API call fails. - * Can be set to NULL, in which case no indication of unsuccessful - * completion will be received. - */ - MQTTAsync_onFailure* onFailure; - /** - * A pointer to any application-specific context. The - * the context pointer is passed to success or failure callback functions to - * provide access to the context information in the callback. - */ - void* context; - /** - * A token is returned from the call. It can be used to track - * the state of this request, both in the callbacks and in future calls - * such as ::MQTTAsync_waitForCompletion. This is output only - any - * change by the application will be ignored. - */ - MQTTAsync_token token; - /** - * A pointer to a callback function to be called if the API call successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onSuccess5* onSuccess5; - /** - * A pointer to a callback function to be called if the API call successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onFailure5* onFailure5; - /** - * MQTT V5 input properties - */ - MQTTProperties properties; - /* - * MQTT V5 subscribe options, when used with subscribe only. - */ - MQTTSubscribe_options subscribeOptions; - /* - * MQTT V5 subscribe option count, when used with subscribeMany only. - * The number of entries in the subscribe_options_list array. - */ - int subscribeOptionsCount; - /* - * MQTT V5 subscribe option array, when used with subscribeMany only. - */ - MQTTSubscribe_options* subscribeOptionsList; -} MQTTAsync_responseOptions; - -#define MQTTAsync_responseOptions_initializer { {'M', 'Q', 'T', 'R'}, 1, NULL, NULL, 0, 0, NULL, NULL, MQTTProperties_initializer, MQTTSubscribe_options_initializer, 0, NULL} - -/** A synonym for responseOptions to better reflect its usage since MQTT 5.0 */ -typedef struct MQTTAsync_responseOptions MQTTAsync_callOptions; -#define MQTTAsync_callOptions_initializer MQTTAsync_responseOptions_initializer - -/** - * This function sets the global callback functions for a specific client. - * If your client application doesn't use a particular callback, set the - * relevant parameter to NULL. Any necessary message acknowledgements and - * status communications are handled in the background without any intervention - * from the client application. If you do not set a messageArrived callback - * function, you will not be notified of the receipt of any messages as a - * result of a subscription. - * - * Note: The MQTT client must be disconnected when this function is - * called. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to each of the callback functions to - * provide access to the context information in the callback. - * @param cl A pointer to an MQTTAsync_connectionLost() callback - * function. You can set this to NULL if your application doesn't handle - * disconnections. - * @param ma A pointer to an MQTTAsync_messageArrived() callback - * function. If this callback is not set, an error will be returned. - * You must set this callback because otherwise there would be - * no way to deliver any incoming messages. - * @param dc A pointer to an MQTTAsync_deliveryComplete() callback - * function. You can set this to NULL if you do not want to check - * for successful delivery. - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTAsync_setCallbacks(MQTTAsync handle, void* context, MQTTAsync_connectionLost* cl, - MQTTAsync_messageArrived* ma, MQTTAsync_deliveryComplete* dc); - -/** - * This function sets the callback function for a connection lost event for - * a specific client. Any necessary message acknowledgements and status - * communications are handled in the background without any intervention - * from the client application. - * - * Note: The MQTT client must be disconnected when this function is - * called. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed the callback functions to provide - * access to the context information in the callback. - * @param cl A pointer to an MQTTAsync_connectionLost() callback - * function. You can set this to NULL if your application doesn't handle - * disconnections. - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ - -LIBMQTT_API int MQTTAsync_setConnectionLostCallback(MQTTAsync handle, void* context, - MQTTAsync_connectionLost* cl); - -/** - * This function sets the callback function for a message arrived event for - * a specific client. Any necessary message acknowledgements and status - * communications are handled in the background without any intervention - * from the client application. If you do not set a messageArrived callback - * function, you will not be notified of the receipt of any messages as a - * result of a subscription. - * - * Note: The MQTT client must be disconnected when this function is - * called. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to the callback functions to provide - * access to the context information in the callback. - * @param ma A pointer to an MQTTAsync_messageArrived() callback - * function. You can set this to NULL if your application doesn't handle - * receipt of messages. - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTAsync_setMessageArrivedCallback(MQTTAsync handle, void* context, - MQTTAsync_messageArrived* ma); - -/** - * This function sets the callback function for a delivery complete event - * for a specific client. Any necessary message acknowledgements and status - * communications are handled in the background without any intervention - * from the client application. - * - * Note: The MQTT client must be disconnected when this function is - * called. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to the callback functions to provide - * access to the context information in the callback. - * @param dc A pointer to an MQTTAsync_deliveryComplete() callback - * function. You can set this to NULL if you do not want to check - * for successful delivery. - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTAsync_setDeliveryCompleteCallback(MQTTAsync handle, void* context, - MQTTAsync_deliveryComplete* dc); - -/** - * Sets the MQTTAsync_connected() callback function for a client. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to each of the callback functions to - * provide access to the context information in the callback. - * @param co A pointer to an MQTTAsync_connected() callback - * function. NULL removes the callback setting. - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTAsync_setConnected(MQTTAsync handle, void* context, MQTTAsync_connected* co); - - -/** - * Reconnects a client with the previously used connect options. Connect - * must have previously been called for this to work. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @return ::MQTTASYNC_SUCCESS if the callbacks were correctly set, - * ::MQTTASYNC_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTAsync_reconnect(MQTTAsync handle); - - -/** - * This function creates an MQTT client ready for connection to the - * specified server and using the specified persistent storage (see - * MQTTAsync_persistence). See also MQTTAsync_destroy(). - * @param handle A pointer to an ::MQTTAsync handle. The handle is - * populated with a valid client reference following a successful return from - * this function. - * @param serverURI A null-terminated string specifying the server to - * which the client will connect. It takes the form - * protocol://host:port where protocol must be: - *
- * @em tcp:// or @em mqtt:// - Insecure TCP - *
- * @em ssl:// or @em mqtts:// - Encrypted SSL/TLS - *
- * @em ws:// - Insecure websockets - *
- * @em wss:// - Secure web sockets - *
- * The TLS enabled prefixes (ssl, mqtts, wss) are only valid if a TLS - * version of the library is linked with. - * For host, you can specify either an IP address or a host name. For - * instance, to connect to a server running on the local machines with the - * default MQTT port, specify tcp://localhost:1883. - * @param clientId The client identifier passed to the server when the - * client connects to it. It is a null-terminated UTF-8 encoded string. - * @param persistence_type The type of persistence to be used by the client: - *
- * ::MQTTCLIENT_PERSISTENCE_NONE: Use in-memory persistence. If the device or - * system on which the client is running fails or is switched off, the current - * state of any in-flight messages is lost and some messages may not be - * delivered even at QoS1 and QoS2. - *
- * ::MQTTCLIENT_PERSISTENCE_DEFAULT: Use the default (file system-based) - * persistence mechanism. Status about in-flight messages is held in persistent - * storage and provides some protection against message loss in the case of - * unexpected failure. - *
- * ::MQTTCLIENT_PERSISTENCE_USER: Use an application-specific persistence - * implementation. Using this type of persistence gives control of the - * persistence mechanism to the application. The application has to implement - * the MQTTClient_persistence interface. - * @param persistence_context If the application uses - * ::MQTTCLIENT_PERSISTENCE_NONE persistence, this argument is unused and should - * be set to NULL. For ::MQTTCLIENT_PERSISTENCE_DEFAULT persistence, it - * should be set to the location of the persistence directory (if set - * to NULL, the persistence directory used is the working directory). - * Applications that use ::MQTTCLIENT_PERSISTENCE_USER persistence set this - * argument to point to a valid MQTTClient_persistence structure. - * @return ::MQTTASYNC_SUCCESS if the client is successfully created, otherwise - * an error code is returned. - */ -LIBMQTT_API int MQTTAsync_create(MQTTAsync* handle, const char* serverURI, const char* clientId, - int persistence_type, void* persistence_context); - -/** Options for the ::MQTTAsync_createWithOptions call */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQCO. */ - char struct_id[4]; - /** The version number of this structure. Must be 0, 1, 2 or 3 - * 0 means no MQTTVersion - * 1 means no allowDisconnectedSendAtAnyTime, deleteOldestMessages, restoreMessages - * 2 means no persistQoS0 - */ - int struct_version; - /** Whether to allow messages to be sent when the client library is not connected. */ - int sendWhileDisconnected; - /** The maximum number of messages allowed to be buffered. This is intended to be used to - * limit the number of messages queued while the client is not connected. It also applies - * when the client is connected, however, so has to be greater than 0. */ - int maxBufferedMessages; - /** Whether the MQTT version is 3.1, 3.1.1, or 5. To use V5, this must be set. - * MQTT V5 has to be chosen here, because during the create call the message persistence - * is initialized, and we want to know whether the format of any persisted messages - * is appropriate for the MQTT version we are going to connect with. Selecting 3.1 or - * 3.1.1 and attempting to read 5.0 persisted messages will result in an error on create. */ - int MQTTVersion; - /** - * Allow sending of messages while disconnected before a first successful connect. - */ - int allowDisconnectedSendAtAnyTime; - /* - * When the maximum number of buffered messages is reached, delete the oldest rather than the newest. - */ - int deleteOldestMessages; - /* - * Restore messages from persistence on create - or clear it. - */ - int restoreMessages; - /* - * Persist QoS0 publish commands - an option to not persist them. - */ - int persistQoS0; -} MQTTAsync_createOptions; - -#define MQTTAsync_createOptions_initializer { {'M', 'Q', 'C', 'O'}, 2, 0, 100, MQTTVERSION_DEFAULT, 0, 0, 1, 1} - -#define MQTTAsync_createOptions_initializer5 { {'M', 'Q', 'C', 'O'}, 2, 0, 100, MQTTVERSION_5, 0, 0, 1, 1} - - -LIBMQTT_API int MQTTAsync_createWithOptions(MQTTAsync* handle, const char* serverURI, const char* clientId, - int persistence_type, void* persistence_context, MQTTAsync_createOptions* options); - -/** - * MQTTAsync_willOptions defines the MQTT "Last Will and Testament" (LWT) settings for - * the client. In the event that a client unexpectedly loses its connection to - * the server, the server publishes the LWT message to the LWT topic on - * behalf of the client. This allows other clients (subscribed to the LWT topic) - * to be made aware that the client has disconnected. To enable the LWT - * function for a specific client, a valid pointer to an MQTTAsync_willOptions - * structure is passed in the MQTTAsync_connectOptions structure used in the - * MQTTAsync_connect() call that connects the client to the server. The pointer - * to MQTTAsync_willOptions can be set to NULL if the LWT function is not - * required. - */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQTW. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 or 1 - 0 indicates no binary will message support - */ - int struct_version; - /** The LWT topic to which the LWT message will be published. */ - const char* topicName; - /** The LWT payload. */ - const char* message; - /** - * The retained flag for the LWT message (see MQTTAsync_message.retained). - */ - int retained; - /** - * The quality of service setting for the LWT message (see - * MQTTAsync_message.qos and @ref qos). - */ - int qos; - /** The LWT payload in binary form. This is only checked and used if the message option is NULL */ - struct - { - int len; /**< binary payload length */ - const void* data; /**< binary payload data */ - } payload; -} MQTTAsync_willOptions; - -#define MQTTAsync_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 1, NULL, NULL, 0, 0, { 0, NULL } } - -#define MQTT_SSL_VERSION_DEFAULT 0 -#define MQTT_SSL_VERSION_TLS_1_0 1 -#define MQTT_SSL_VERSION_TLS_1_1 2 -#define MQTT_SSL_VERSION_TLS_1_2 3 - -/** -* MQTTAsync_sslProperties defines the settings to establish an SSL/TLS connection using the -* OpenSSL library. It covers the following scenarios: -* - Server authentication: The client needs the digital certificate of the server. It is included -* in a store containting trusted material (also known as "trust store"). -* - Mutual authentication: Both client and server are authenticated during the SSL handshake. In -* addition to the digital certificate of the server in a trust store, the client will need its own -* digital certificate and the private key used to sign its digital certificate stored in a "key store". -* - Anonymous connection: Both client and server do not get authenticated and no credentials are needed -* to establish an SSL connection. Note that this scenario is not fully secure since it is subject to -* man-in-the-middle attacks. -*/ -typedef struct -{ - /** The eyecatcher for this structure. Must be MQTS */ - char struct_id[4]; - - /** The version number of this structure. Must be 0, 1, 2, 3, 4 or 5. - * 0 means no sslVersion - * 1 means no verify, CApath - * 2 means no ssl_error_context, ssl_error_cb - * 3 means no ssl_psk_cb, ssl_psk_context, disableDefaultTrustStore - * 4 means no protos, protos_len - */ - int struct_version; - - /** The file in PEM format containing the public digital certificates trusted by the client. */ - const char* trustStore; - - /** The file in PEM format containing the public certificate chain of the client. It may also include - * the client's private key. - */ - const char* keyStore; - - /** If not included in the sslKeyStore, this setting points to the file in PEM format containing - * the client's private key. - */ - const char* privateKey; - - /** The password to load the client's privateKey if encrypted. */ - const char* privateKeyPassword; - - /** - * The list of cipher suites that the client will present to the server during the SSL handshake. For a - * full explanation of the cipher list format, please see the OpenSSL on-line documentation: - * http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT - * If this setting is ommitted, its default value will be "ALL", that is, all the cipher suites -excluding - * those offering no encryption- will be considered. - * This setting can be used to set an SSL anonymous connection ("aNULL" string value, for instance). - */ - const char* enabledCipherSuites; - - /** True/False option to enable verification of the server certificate **/ - int enableServerCertAuth; - - /** The SSL/TLS version to use. Specify one of MQTT_SSL_VERSION_DEFAULT (0), - * MQTT_SSL_VERSION_TLS_1_0 (1), MQTT_SSL_VERSION_TLS_1_1 (2) or MQTT_SSL_VERSION_TLS_1_2 (3). - * Only used if struct_version is >= 1. - */ - int sslVersion; - - /** - * Whether to carry out post-connect checks, including that a certificate - * matches the given host name. - * Exists only if struct_version >= 2 - */ - int verify; - - /** - * From the OpenSSL documentation: - * If CApath is not NULL, it points to a directory containing CA certificates in PEM format. - * Exists only if struct_version >= 2 - */ - const char* CApath; - - /** - * Callback function for OpenSSL error handler ERR_print_errors_cb - * Exists only if struct_version >= 3 - */ - int (*ssl_error_cb) (const char *str, size_t len, void *u); - - /** - * Application-specific contex for OpenSSL error handler ERR_print_errors_cb - * Exists only if struct_version >= 3 - */ - void* ssl_error_context; - - /** - * Callback function for setting TLS-PSK options. Parameters correspond to that of - * SSL_CTX_set_psk_client_callback, except for u which is the pointer ssl_psk_context. - * Exists only if struct_version >= 4 - */ - unsigned int (*ssl_psk_cb) (const char *hint, char *identity, unsigned int max_identity_len, unsigned char *psk, unsigned int max_psk_len, void *u); - - /** - * Application-specific contex for ssl_psk_cb - * Exists only if struct_version >= 4 - */ - void* ssl_psk_context; - - /** - * Don't load default SSL CA. Should be used together with PSK to make sure - * regular servers with certificate in place is not accepted. - * Exists only if struct_version >= 4 - */ - int disableDefaultTrustStore; - - /** - * The protocol-lists must be in wire-format, which is defined as a vector of non-empty, 8-bit length-prefixed, byte strings. - * The length-prefix byte is not included in the length. Each string is limited to 255 bytes. A byte-string length of 0 is invalid. - * A truncated byte-string is invalid. - * Check documentation for SSL_CTX_set_alpn_protos - * Exists only if struct_version >= 5 - */ - const unsigned char *protos; - - /** - * The length of the vector protos vector - * Exists only if struct_version >= 5 - */ - unsigned int protos_len; -} MQTTAsync_SSLOptions; - -#define MQTTAsync_SSLOptions_initializer { {'M', 'Q', 'T', 'S'}, 5, NULL, NULL, NULL, NULL, NULL, 1, MQTT_SSL_VERSION_DEFAULT, 0, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0 } - -/** Utility structure where name/value pairs are needed */ -typedef struct -{ - const char* name; /**< name string */ - const char* value; /**< value string */ -} MQTTAsync_nameValue; - -/** - * MQTTAsync_connectOptions defines several settings that control the way the - * client connects to an MQTT server. - * - * Suitable default values are set in the following initializers: - * - MQTTAsync_connectOptions_initializer: for MQTT 3.1.1 non-WebSockets - * - MQTTAsync_connectOptions_initializer5: for MQTT 5.0 non-WebSockets - * - MQTTAsync_connectOptions_initializer_ws: for MQTT 3.1.1 WebSockets - * - MQTTAsync_connectOptions_initializer5_ws: for MQTT 5.0 WebSockets - */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQTC. */ - char struct_id[4]; - /** The version number of this structure. Must be 0, 1, 2, 3 4 5 6, 7 or 8. - * 0 signifies no SSL options and no serverURIs - * 1 signifies no serverURIs - * 2 signifies no MQTTVersion - * 3 signifies no automatic reconnect options - * 4 signifies no binary password option (just string) - * 5 signifies no MQTTV5 properties - * 6 signifies no HTTP headers option - * 7 signifies no HTTP proxy and HTTPS proxy options - */ - int struct_version; - /** The "keep alive" interval, measured in seconds, defines the maximum time - * that should pass without communication between the client and the server - * The client will ensure that at least one message travels across the - * network within each keep alive period. In the absence of a data-related - * message during the time period, the client sends a very small MQTT - * "ping" message, which the server will acknowledge. The keep alive - * interval enables the client to detect when the server is no longer - * available without having to wait for the long TCP/IP timeout. - * Set to 0 if you do not want any keep alive processing. - */ - int keepAliveInterval; - /** - * This is a boolean value. The cleansession setting controls the behaviour - * of both the client and the server at connection and disconnection time. - * The client and server both maintain session state information. This - * information is used to ensure "at least once" and "exactly once" - * delivery, and "exactly once" receipt of messages. Session state also - * includes subscriptions created by an MQTT client. You can choose to - * maintain or discard state information between sessions. - * - * When cleansession is true, the state information is discarded at - * connect and disconnect. Setting cleansession to false keeps the state - * information. When you connect an MQTT client application with - * MQTTAsync_connect(), the client identifies the connection using the - * client identifier and the address of the server. The server checks - * whether session information for this client - * has been saved from a previous connection to the server. If a previous - * session still exists, and cleansession=true, then the previous session - * information at the client and server is cleared. If cleansession=false, - * the previous session is resumed. If no previous session exists, a new - * session is started. - */ - int cleansession; - /** - * This controls how many messages can be in-flight simultaneously. - */ - int maxInflight; - /** - * This is a pointer to an MQTTAsync_willOptions structure. If your - * application does not make use of the Last Will and Testament feature, - * set this pointer to NULL. - */ - MQTTAsync_willOptions* will; - /** - * MQTT servers that support the MQTT v3.1 protocol provide authentication - * and authorisation by user name and password. This is the user name - * parameter. - */ - const char* username; - /** - * MQTT servers that support the MQTT v3.1 protocol provide authentication - * and authorisation by user name and password. This is the password - * parameter. - */ - const char* password; - /** - * The time interval in seconds to allow a connect to complete. - */ - int connectTimeout; - /** - * The time interval in seconds after which unacknowledged publish requests are - * retried during a TCP session. With MQTT 3.1.1 and later, retries are - * not required except on reconnect. 0 turns off in-session retries, and is the - * recommended setting. Adding retries to an already overloaded network only - * exacerbates the problem. - */ - int retryInterval; - /** - * This is a pointer to an MQTTAsync_SSLOptions structure. If your - * application does not make use of SSL, set this pointer to NULL. - */ - MQTTAsync_SSLOptions* ssl; - /** - * A pointer to a callback function to be called if the connect successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onSuccess* onSuccess; - /** - * A pointer to a callback function to be called if the connect fails. - * Can be set to NULL, in which case no indication of unsuccessful - * completion will be received. - */ - MQTTAsync_onFailure* onFailure; - /** - * A pointer to any application-specific context. The - * the context pointer is passed to success or failure callback functions to - * provide access to the context information in the callback. - */ - void* context; - /** - * The number of entries in the serverURIs array. - */ - int serverURIcount; - /** - * An array of null-terminated strings specifying the servers to - * which the client will connect. Each string takes the form protocol://host:port. - * protocol must be tcp, ssl, ws or wss. - * The TLS enabled prefixes (ssl, wss) are only valid if a TLS version of the library - * is linked with. - * For host, you can - * specify either an IP address or a domain name. For instance, to connect to - * a server running on the local machines with the default MQTT port, specify - * tcp://localhost:1883. - */ - char* const* serverURIs; - /** - * Sets the version of MQTT to be used on the connect. - * MQTTVERSION_DEFAULT (0) = default: start with 3.1.1, and if that fails, fall back to 3.1 - * MQTTVERSION_3_1 (3) = only try version 3.1 - * MQTTVERSION_3_1_1 (4) = only try version 3.1.1 - */ - int MQTTVersion; - /** - * Reconnect automatically in the case of a connection being lost. 0=false, 1=true - */ - int automaticReconnect; - /** - * The minimum automatic reconnect retry interval in seconds. Doubled on each failed retry. - */ - int minRetryInterval; - /** - * The maximum automatic reconnect retry interval in seconds. The doubling stops here on failed retries. - */ - int maxRetryInterval; - /** - * Optional binary password. Only checked and used if the password option is NULL - */ - struct { - int len; /**< binary password length */ - const void* data; /**< binary password data */ - } binarypwd; - /* - * MQTT V5 clean start flag. Only clears state at the beginning of the session. - */ - int cleanstart; - /** - * MQTT V5 properties for connect - */ - MQTTProperties *connectProperties; - /** - * MQTT V5 properties for the will message in the connect - */ - MQTTProperties *willProperties; - /** - * A pointer to a callback function to be called if the connect successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onSuccess5* onSuccess5; - /** - * A pointer to a callback function to be called if the connect fails. - * Can be set to NULL, in which case no indication of unsuccessful - * completion will be received. - */ - MQTTAsync_onFailure5* onFailure5; - /** - * HTTP headers for websockets - */ - const MQTTAsync_nameValue* httpHeaders; - /** - * HTTP proxy - */ - const char* httpProxy; - /** - * HTTPS proxy - */ - const char* httpsProxy; -} MQTTAsync_connectOptions; - -/** Initializer for connect options for MQTT 3.1.1 non-WebSocket connections */ -#define MQTTAsync_connectOptions_initializer { {'M', 'Q', 'T', 'C'}, 8, 60, 1, 65535, NULL, NULL, NULL, 30, 0,\ -NULL, NULL, NULL, NULL, 0, NULL, MQTTVERSION_DEFAULT, 0, 1, 60, {0, NULL}, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL} - -/** Initializer for connect options for MQTT 5.0 non-WebSocket connections */ -#define MQTTAsync_connectOptions_initializer5 { {'M', 'Q', 'T', 'C'}, 8, 60, 0, 65535, NULL, NULL, NULL, 30, 0,\ -NULL, NULL, NULL, NULL, 0, NULL, MQTTVERSION_5, 0, 1, 60, {0, NULL}, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL} - -/** Initializer for connect options for MQTT 3.1.1 WebSockets connections. - * The keepalive interval is set to 45 seconds to avoid webserver 60 second inactivity timeouts. - */ -#define MQTTAsync_connectOptions_initializer_ws { {'M', 'Q', 'T', 'C'}, 8, 45, 1, 65535, NULL, NULL, NULL, 30, 0,\ -NULL, NULL, NULL, NULL, 0, NULL, MQTTVERSION_DEFAULT, 0, 1, 60, {0, NULL}, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL} - -/** Initializer for connect options for MQTT 5.0 WebSockets connections. - * The keepalive interval is set to 45 seconds to avoid webserver 60 second inactivity timeouts. - */ -#define MQTTAsync_connectOptions_initializer5_ws { {'M', 'Q', 'T', 'C'}, 8, 45, 0, 65535, NULL, NULL, NULL, 30, 0,\ -NULL, NULL, NULL, NULL, 0, NULL, MQTTVERSION_5, 0, 1, 60, {0, NULL}, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL} - - -/** - * This function attempts to connect a previously-created client (see - * MQTTAsync_create()) to an MQTT server using the specified options. If you - * want to enable asynchronous message and status notifications, you must call - * MQTTAsync_setCallbacks() prior to MQTTAsync_connect(). - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param options A pointer to a valid MQTTAsync_connectOptions - * structure. - * @return ::MQTTASYNC_SUCCESS if the client connect request was accepted. - * If the client was unable to connect to the server, an error code is - * returned via the onFailure callback, if set. - * Error codes greater than 0 are returned by the MQTT protocol:

- * 1: Connection refused: Unacceptable protocol version
- * 2: Connection refused: Identifier rejected
- * 3: Connection refused: Server unavailable
- * 4: Connection refused: Bad user name or password
- * 5: Connection refused: Not authorized
- * 6-255: Reserved for future use
- */ -LIBMQTT_API int MQTTAsync_connect(MQTTAsync handle, const MQTTAsync_connectOptions* options); - -/** Options for the ::MQTTAsync_disconnect call */ -typedef struct -{ - /** The eyecatcher for this structure. Must be MQTD. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 or 1. 0 signifies no V5 properties */ - int struct_version; - /** - * The client delays disconnection for up to this time (in - * milliseconds) in order to allow in-flight message transfers to complete. - */ - int timeout; - /** - * A pointer to a callback function to be called if the disconnect successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onSuccess* onSuccess; - /** - * A pointer to a callback function to be called if the disconnect fails. - * Can be set to NULL, in which case no indication of unsuccessful - * completion will be received. - */ - MQTTAsync_onFailure* onFailure; - /** - * A pointer to any application-specific context. The - * the context pointer is passed to success or failure callback functions to - * provide access to the context information in the callback. - */ - void* context; - /** - * MQTT V5 input properties - */ - MQTTProperties properties; - /** - * Reason code for MQTTV5 disconnect - */ - enum MQTTReasonCodes reasonCode; - /** - * A pointer to a callback function to be called if the disconnect successfully - * completes. Can be set to NULL, in which case no indication of successful - * completion will be received. - */ - MQTTAsync_onSuccess5* onSuccess5; - /** - * A pointer to a callback function to be called if the disconnect fails. - * Can be set to NULL, in which case no indication of unsuccessful - * completion will be received. - */ - MQTTAsync_onFailure5* onFailure5; -} MQTTAsync_disconnectOptions; - -#define MQTTAsync_disconnectOptions_initializer { {'M', 'Q', 'T', 'D'}, 0, 0, NULL, NULL, NULL,\ - MQTTProperties_initializer, MQTTREASONCODE_SUCCESS, NULL, NULL } - -#define MQTTAsync_disconnectOptions_initializer5 { {'M', 'Q', 'T', 'D'}, 1, 0, NULL, NULL, NULL,\ - MQTTProperties_initializer, MQTTREASONCODE_SUCCESS, NULL, NULL } - -/** - * This function attempts to disconnect the client from the MQTT - * server. In order to allow the client time to complete handling of messages - * that are in-flight when this function is called, a timeout period is - * specified. When the timeout period has expired, the client disconnects even - * if there are still outstanding message acknowledgements. - * The next time the client connects to the same server, any QoS 1 or 2 - * messages which have not completed will be retried depending on the - * cleansession settings for both the previous and the new connection (see - * MQTTAsync_connectOptions.cleansession and MQTTAsync_connect()). - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param options The client delays disconnection for up to this time (in - * milliseconds) in order to allow in-flight message transfers to complete. - * @return ::MQTTASYNC_SUCCESS if the client successfully disconnects from - * the server. An error code is returned if the client was unable to disconnect - * from the server - */ -LIBMQTT_API int MQTTAsync_disconnect(MQTTAsync handle, const MQTTAsync_disconnectOptions* options); - - -/** - * This function allows the client application to test whether or not a - * client is currently connected to the MQTT server. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @return Boolean true if the client is connected, otherwise false. - */ -LIBMQTT_API int MQTTAsync_isConnected(MQTTAsync handle); - - -/** - * This function attempts to subscribe a client to a single topic, which may - * contain wildcards (see @ref wildcard). This call also specifies the - * @ref qos requested for the subscription - * (see also MQTTAsync_subscribeMany()). - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param topic The subscription topic, which may include wildcards. - * @param qos The requested quality of service for the subscription. - * @param response A pointer to a response options structure. Used to set callback functions. - * @return ::MQTTASYNC_SUCCESS if the subscription request is successful. - * An error code is returned if there was a problem registering the - * subscription. - */ -LIBMQTT_API int MQTTAsync_subscribe(MQTTAsync handle, const char* topic, int qos, MQTTAsync_responseOptions* response); - - -/** - * This function attempts to subscribe a client to a list of topics, which may - * contain wildcards (see @ref wildcard). This call also specifies the - * @ref qos requested for each topic (see also MQTTAsync_subscribe()). - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param count The number of topics for which the client is requesting - * subscriptions. - * @param topic An array (of length count) of pointers to - * topics, each of which may include wildcards. - * @param qos An array (of length count) of @ref qos - * values. qos[n] is the requested QoS for topic[n]. - * @param response A pointer to a response options structure. Used to set callback functions. - * @return ::MQTTASYNC_SUCCESS if the subscription request is successful. - * An error code is returned if there was a problem registering the - * subscriptions. - */ -LIBMQTT_API int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char* const* topic, const int* qos, MQTTAsync_responseOptions* response); - -/** - * This function attempts to remove an existing subscription made by the - * specified client. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param topic The topic for the subscription to be removed, which may - * include wildcards (see @ref wildcard). - * @param response A pointer to a response options structure. Used to set callback functions. - * @return ::MQTTASYNC_SUCCESS if the subscription is removed. - * An error code is returned if there was a problem removing the - * subscription. - */ -LIBMQTT_API int MQTTAsync_unsubscribe(MQTTAsync handle, const char* topic, MQTTAsync_responseOptions* response); - -/** - * This function attempts to remove existing subscriptions to a list of topics - * made by the specified client. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param count The number subscriptions to be removed. - * @param topic An array (of length count) of pointers to the topics of - * the subscriptions to be removed, each of which may include wildcards. - * @param response A pointer to a response options structure. Used to set callback functions. - * @return ::MQTTASYNC_SUCCESS if the subscriptions are removed. - * An error code is returned if there was a problem removing the subscriptions. - */ -LIBMQTT_API int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char* const* topic, MQTTAsync_responseOptions* response); - - -/** - * This function attempts to publish a message to a given topic (see also - * ::MQTTAsync_sendMessage()). An ::MQTTAsync_token is issued when - * this function returns successfully if the QoS is greater than 0. - * If the client application needs to - * test for successful delivery of messages, a callback should be set - * (see ::MQTTAsync_onSuccess() and ::MQTTAsync_deliveryComplete()). - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param destinationName The topic associated with this message. - * @param payloadlen The length of the payload in bytes. - * @param payload A pointer to the byte array payload of the message. - * @param qos The @ref qos of the message. - * @param retained The retained flag for the message. - * @param response A pointer to an ::MQTTAsync_responseOptions structure. Used to set callback functions. - * This is optional and can be set to NULL. - * @return ::MQTTASYNC_SUCCESS if the message is accepted for publication. - * An error code is returned if there was a problem accepting the message. - */ -LIBMQTT_API int MQTTAsync_send(MQTTAsync handle, const char* destinationName, int payloadlen, const void* payload, int qos, - int retained, MQTTAsync_responseOptions* response); - -/** - * This function attempts to publish a message to a given topic (see also - * MQTTAsync_publish()). An ::MQTTAsync_token is issued when - * this function returns successfully if the QoS is greater than 0. - * If the client application needs to - * test for successful delivery of messages, a callback should be set - * (see ::MQTTAsync_onSuccess() and ::MQTTAsync_deliveryComplete()). - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param destinationName The topic associated with this message. - * @param msg A pointer to a valid MQTTAsync_message structure containing - * the payload and attributes of the message to be published. - * @param response A pointer to an ::MQTTAsync_responseOptions structure. Used to set callback functions. - * @return ::MQTTASYNC_SUCCESS if the message is accepted for publication. - * An error code is returned if there was a problem accepting the message. - */ -LIBMQTT_API int MQTTAsync_sendMessage(MQTTAsync handle, const char* destinationName, const MQTTAsync_message* msg, MQTTAsync_responseOptions* response); - - -/** - * This function sets a pointer to an array of tokens for - * messages that are currently in-flight (pending completion). - * - * Important note: The memory used to hold the array of tokens is - * malloc()'d in this function. The client application is responsible for - * freeing this memory when it is no longer required. - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param tokens The address of a pointer to an ::MQTTAsync_token. - * When the function returns successfully, the pointer is set to point to an - * array of tokens representing messages pending completion. The last member of - * the array is set to -1 to indicate there are no more tokens. If no tokens - * are pending, the pointer is set to NULL. - * @return ::MQTTASYNC_SUCCESS if the function returns successfully. - * An error code is returned if there was a problem obtaining the list of - * pending tokens. - */ -LIBMQTT_API int MQTTAsync_getPendingTokens(MQTTAsync handle, MQTTAsync_token **tokens); - -/** - * Tests whether a request corresponding to a token is complete. - * - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param token An ::MQTTAsync_token associated with a request. - * @return 1 if the request has been completed, 0 if not. - */ -#define MQTTASYNC_TRUE 1 -LIBMQTT_API int MQTTAsync_isComplete(MQTTAsync handle, MQTTAsync_token token); - - -/** - * Waits for a request corresponding to a token to complete. This only works for - * messages with QoS greater than 0. A QoS 0 message has no MQTT token. - * This function will always return ::MQTTASYNC_SUCCESS for a QoS 0 message. - * - * @param handle A valid client handle from a successful call to - * MQTTAsync_create(). - * @param token An ::MQTTAsync_token associated with a request. - * @param timeout the maximum time to wait for completion, in milliseconds - * @return ::MQTTASYNC_SUCCESS if the request has been completed in the time allocated, - * ::MQTTASYNC_FAILURE or ::MQTTASYNC_DISCONNECTED if not. - */ -LIBMQTT_API int MQTTAsync_waitForCompletion(MQTTAsync handle, MQTTAsync_token token, unsigned long timeout); - - -/** - * This function frees memory allocated to an MQTT message, including the - * additional memory allocated to the message payload. The client application - * calls this function when the message has been fully processed. Important - * note: This function does not free the memory allocated to a message - * topic string. It is the responsibility of the client application to free - * this memory using the MQTTAsync_free() library function. - * @param msg The address of a pointer to the ::MQTTAsync_message structure - * to be freed. - */ -LIBMQTT_API void MQTTAsync_freeMessage(MQTTAsync_message** msg); - -/** - * This function frees memory allocated by the MQTT C client library, especially the - * topic name. This is needed on Windows when the client library and application - * program have been compiled with different versions of the C compiler. It is - * thus good policy to always use this function when freeing any MQTT C client- - * allocated memory. - * @param ptr The pointer to the client library storage to be freed. - */ -LIBMQTT_API void MQTTAsync_free(void* ptr); - -/** - * This function is used to allocate memory to be used or freed by the MQTT C client library, - * especially the data in the ::MQTTPersistence_afterRead and ::MQTTPersistence_beforeWrite - * callbacks. This is needed on Windows when the client library and application - * program have been compiled with different versions of the C compiler. - * @param size The size of the memory to be allocated. - */ -LIBMQTT_API void* MQTTAsync_malloc(size_t size); - -/** - * This function frees the memory allocated to an MQTT client (see - * MQTTAsync_create()). It should be called when the client is no longer - * required. - * @param handle A pointer to the handle referring to the ::MQTTAsync - * structure to be freed. - */ -LIBMQTT_API void MQTTAsync_destroy(MQTTAsync* handle); - - - -enum MQTTASYNC_TRACE_LEVELS -{ - MQTTASYNC_TRACE_MAXIMUM = 1, - MQTTASYNC_TRACE_MEDIUM, - MQTTASYNC_TRACE_MINIMUM, - MQTTASYNC_TRACE_PROTOCOL, - MQTTASYNC_TRACE_ERROR, - MQTTASYNC_TRACE_SEVERE, - MQTTASYNC_TRACE_FATAL, -}; - - -/** - * This function sets the level of trace information which will be - * returned in the trace callback. - * @param level the trace level required - */ -LIBMQTT_API void MQTTAsync_setTraceLevel(enum MQTTASYNC_TRACE_LEVELS level); - - -/** - * This is a callback function prototype which must be implemented if you want - * to receive trace information. Do not invoke any other Paho API calls in this - * callback function - unpredictable behavior may result. - * @param level the trace level of the message returned - * @param message the trace message. This is a pointer to a static buffer which - * will be overwritten on each call. You must copy the data if you want to keep - * it for later. - */ -typedef void MQTTAsync_traceCallback(enum MQTTASYNC_TRACE_LEVELS level, char* message); - -/** - * This function sets the trace callback if needed. If set to NULL, - * no trace information will be returned. The default trace level is - * MQTTASYNC_TRACE_MINIMUM. - * @param callback a pointer to the function which will handle the trace information - */ -LIBMQTT_API void MQTTAsync_setTraceCallback(MQTTAsync_traceCallback* callback); - -/** - * This function returns version information about the library. - * no trace information will be returned. The default trace level is - * MQTTASYNC_TRACE_MINIMUM - * @return an array of strings describing the library. The last entry is a NULL pointer. - */ -LIBMQTT_API MQTTAsync_nameValue* MQTTAsync_getVersionInfo(void); - -/** - * Returns a pointer to a string representation of the error code, or NULL. - * Do not free after use. Returns NULL if the error code is unknown. - * @param code the MQTTASYNC_ return code. - * @return a static string representation of the error code. - */ -LIBMQTT_API const char* MQTTAsync_strerror(int code); - - -/*! - * @cond MQTTAsync_main - * @page async Threading - * The client application runs on several threads. - * Processing of handshaking and maintaining - * the network connection is performed in the background. - * This API is thread safe: functions may be called by multiple application - * threads. - * Notifications of status and message reception are provided to the client - * application using callbacks registered with the library by the call to - * MQTTAsync_setCallbacks() (see MQTTAsync_messageArrived(), - * MQTTAsync_connectionLost() and MQTTAsync_deliveryComplete()). - * In addition, some functions allow success and failure callbacks to be set - * for individual requests, in the ::MQTTAsync_responseOptions structure. Applications - * can be written as a chain of callback functions. - * - * @page callbacks Callbacks - * Any function from this API may be used within a callback. It is not advisable to - * use ::MQTTAsync_waitForCompletion within a callback, however, as it is the only - * API call that may take some time to complete, which may cause unpredictable - * behaviour. All the other API calls are intended to complete quickly, starting - * a request in the background, with success or failure notified by other callbacks. - * - * If no callbacks are assigned, this will include the message arrived callback. - * This could be done if the application is a pure publisher, and does - * not subscribe to any topics. If however messages are received, and no message - * arrived callback is set, then those messages will accumulate - * and take up memory, as there is no place for them to be delivered. - * A log message will be written to highlight the issue, but it is up - * to the application to protect against this situation. - * - * @page auto_reconnect Automatic Reconnect - * The ability for the client library to reconnect automatically in the event - * of a connection failure was added in 1.1. The connection lost callback - * allows a flexible response to the loss of a connection, so almost any - * behaviour can be implemented in that way. Automatic reconnect does have the - * advantage of being a little simpler to use. - * - * To switch on automatic reconnect, the connect options field - * automaticReconnect should be set to non-zero. The minimum and maximum times - * before the next connection attempt can also be set, the defaults being 1 and - * 60 seconds. At each failure to reconnect, the retry interval is doubled until - * the maximum value is reached, and there it stays until the connection is - * successfully re-established whereupon it is reset. - * - * When a reconnection attempt is successful, the ::MQTTAsync_connected callback - * function is invoked, if set by calling ::MQTTAsync_setConnected. This allows - * the application to take any actions needed, such as amending subscriptions. - * - * @page offline_publish Publish While Disconnected - * This feature was not originally available because with persistence enabled, - * messages could be stored locally without ever knowing if they could be sent. - * The client application could have created the client with an erroneous broker - * address or port for instance. - * - * To enable messages to be published when the application is disconnected - * ::MQTTAsync_createWithOptions must be used instead of ::MQTTAsync_create to - * create the client object. The ::MQTTAsync_createOptions field sendWhileDisconnected - * must be set to non-zero, and the maxBufferedMessages field set as required - - * the default being 100. - * - * ::MQTTAsync_getPendingTokens can be called to return the ids of the messages - * waiting to be sent, or for which the sending process has not completed. - * - * @page wildcard Subscription wildcards - * Every MQTT message includes a topic that classifies it. MQTT servers use - * topics to determine which subscribers should receive messages published to - * the server. - * - * Consider the server receiving messages from several environmental sensors. - * Each sensor publishes its measurement data as a message with an associated - * topic. Subscribing applications need to know which sensor originally - * published each received message. A unique topic is thus used to identify - * each sensor and measurement type. Topics such as SENSOR1TEMP, - * SENSOR1HUMIDITY, SENSOR2TEMP and so on achieve this but are not very - * flexible. If additional sensors are added to the system at a later date, - * subscribing applications must be modified to receive them. - * - * To provide more flexibility, MQTT supports a hierarchical topic namespace. - * This allows application designers to organize topics to simplify their - * management. Levels in the hierarchy are delimited by the '/' character, - * such as SENSOR/1/HUMIDITY. Publishers and subscribers use these - * hierarchical topics as already described. - * - * For subscriptions, two wildcard characters are supported: - *
    - *
  • A '#' character represents a complete sub-tree of the hierarchy and - * thus must be the last character in a subscription topic string, such as - * SENSOR/#. This will match any topic starting with SENSOR/, such as - * SENSOR/1/TEMP and SENSOR/2/HUMIDITY.
  • - *
  • A '+' character represents a single level of the hierarchy and is - * used between delimiters. For example, SENSOR/+/TEMP will match - * SENSOR/1/TEMP and SENSOR/2/TEMP.
  • - *
- * Publishers are not allowed to use the wildcard characters in their topic - * names. - * - * Deciding on your topic hierarchy is an important step in your system design. - * - * @page qos Quality of service - * The MQTT protocol provides three qualities of service for delivering - * messages between clients and servers: "at most once", "at least once" and - * "exactly once". - * - * Quality of service (QoS) is an attribute of an individual message being - * published. An application sets the QoS for a specific message by setting the - * MQTTAsync_message.qos field to the required value. - * - * A subscribing client can set the maximum quality of service a server uses - * to send messages that match the client subscriptions. The - * MQTTAsync_subscribe() and MQTTAsync_subscribeMany() functions set this - * maximum. The QoS of a message forwarded to a subscriber thus might be - * different to the QoS given to the message by the original publisher. - * The lower of the two values is used to forward a message. - * - * The three levels are: - * - * QoS0, At most once: The message is delivered at most once, or it - * may not be delivered at all. Its delivery across the network is not - * acknowledged. The message is not stored. The message could be lost if the - * client is disconnected, or if the server fails. QoS0 is the fastest mode of - * transfer. It is sometimes called "fire and forget". - * - * The MQTT protocol does not require servers to forward publications at QoS0 - * to a client. If the client is disconnected at the time the server receives - * the publication, the publication might be discarded, depending on the - * server implementation. - * - * QoS1, At least once: The message is always delivered at least once. - * It might be delivered multiple times if there is a failure before an - * acknowledgment is received by the sender. The message must be stored - * locally at the sender, until the sender receives confirmation that the - * message has been published by the receiver. The message is stored in case - * the message must be sent again. - * - * QoS2, Exactly once: The message is always delivered exactly once. - * The message must be stored locally at the sender, until the sender receives - * confirmation that the message has been published by the receiver. The - * message is stored in case the message must be sent again. QoS2 is the - * safest, but slowest mode of transfer. A more sophisticated handshaking - * and acknowledgement sequence is used than for QoS1 to ensure no duplication - * of messages occurs. - * @page publish Publication example -@code -#include -#include -#include -#include "MQTTAsync.h" - -#if !defined(_WIN32) -#include -#else -#include -#endif - -#if defined(_WRS_KERNEL) -#include -#endif - -#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883" -#define CLIENTID "ExampleClientPub" -#define TOPIC "MQTT Examples" -#define PAYLOAD "Hello World!" -#define QOS 1 -#define TIMEOUT 10000L - -int finished = 0; - -void connlost(void *context, char *cause) -{ - MQTTAsync client = (MQTTAsync)context; - MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; - int rc; - - printf("\nConnection lost\n"); - printf(" cause: %s\n", cause); - - printf("Reconnecting\n"); - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start connect, return code %d\n", rc); - finished = 1; - } -} - -void onDisconnectFailure(void* context, MQTTAsync_failureData* response) -{ - printf("Disconnect failed\n"); - finished = 1; -} - -void onDisconnect(void* context, MQTTAsync_successData* response) -{ - printf("Successful disconnection\n"); - finished = 1; -} - -void onSendFailure(void* context, MQTTAsync_failureData* response) -{ - MQTTAsync client = (MQTTAsync)context; - MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer; - int rc; - - printf("Message send failed token %d error code %d\n", response->token, response->code); - opts.onSuccess = onDisconnect; - opts.onFailure = onDisconnectFailure; - opts.context = client; - if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start disconnect, return code %d\n", rc); - exit(EXIT_FAILURE); - } -} - -void onSend(void* context, MQTTAsync_successData* response) -{ - MQTTAsync client = (MQTTAsync)context; - MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer; - int rc; - - printf("Message with token value %d delivery confirmed\n", response->token); - opts.onSuccess = onDisconnect; - opts.onFailure = onDisconnectFailure; - opts.context = client; - if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start disconnect, return code %d\n", rc); - exit(EXIT_FAILURE); - } -} - - -void onConnectFailure(void* context, MQTTAsync_failureData* response) -{ - printf("Connect failed, rc %d\n", response ? response->code : 0); - finished = 1; -} - - -void onConnect(void* context, MQTTAsync_successData* response) -{ - MQTTAsync client = (MQTTAsync)context; - MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer; - MQTTAsync_message pubmsg = MQTTAsync_message_initializer; - int rc; - - printf("Successful connection\n"); - opts.onSuccess = onSend; - opts.onFailure = onSendFailure; - opts.context = client; - pubmsg.payload = PAYLOAD; - pubmsg.payloadlen = (int)strlen(PAYLOAD); - pubmsg.qos = QOS; - pubmsg.retained = 0; - if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start sendMessage, return code %d\n", rc); - exit(EXIT_FAILURE); - } -} - -int messageArrived(void* context, char* topicName, int topicLen, MQTTAsync_message* m) -{ - // not expecting any messages - return 1; -} - -int main(int argc, char* argv[]) -{ - MQTTAsync client; - MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; - int rc; - - if ((rc = MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTASYNC_SUCCESS) - { - printf("Failed to create client object, return code %d\n", rc); - exit(EXIT_FAILURE); - } - - if ((rc = MQTTAsync_setCallbacks(client, NULL, connlost, messageArrived, NULL)) != MQTTASYNC_SUCCESS) - { - printf("Failed to set callback, return code %d\n", rc); - exit(EXIT_FAILURE); - } - - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - conn_opts.onSuccess = onConnect; - conn_opts.onFailure = onConnectFailure; - conn_opts.context = client; - if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start connect, return code %d\n", rc); - exit(EXIT_FAILURE); - } - - printf("Waiting for publication of %s\n" - "on topic %s for client with ClientID: %s\n", - PAYLOAD, TOPIC, CLIENTID); - while (!finished) - #if defined(_WIN32) - Sleep(100); - #else - usleep(10000L); - #endif - - MQTTAsync_destroy(&client); - return rc; -} - - * @endcode - * @page subscribe Subscription example -@code -#include -#include -#include -#include "MQTTAsync.h" - -#if !defined(_WIN32) -#include -#else -#include -#endif - -#if defined(_WRS_KERNEL) -#include -#endif - -#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883" -#define CLIENTID "ExampleClientSub" -#define TOPIC "MQTT Examples" -#define PAYLOAD "Hello World!" -#define QOS 1 -#define TIMEOUT 10000L - -int disc_finished = 0; -int subscribed = 0; -int finished = 0; - -void connlost(void *context, char *cause) -{ - MQTTAsync client = (MQTTAsync)context; - MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; - int rc; - - printf("\nConnection lost\n"); - if (cause) - printf(" cause: %s\n", cause); - - printf("Reconnecting\n"); - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start connect, return code %d\n", rc); - finished = 1; - } -} - - -int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message) -{ - printf("Message arrived\n"); - printf(" topic: %s\n", topicName); - printf(" message: %.*s\n", message->payloadlen, (char*)message->payload); - MQTTAsync_freeMessage(&message); - MQTTAsync_free(topicName); - return 1; -} - -void onDisconnectFailure(void* context, MQTTAsync_failureData* response) -{ - printf("Disconnect failed, rc %d\n", response->code); - disc_finished = 1; -} - -void onDisconnect(void* context, MQTTAsync_successData* response) -{ - printf("Successful disconnection\n"); - disc_finished = 1; -} - -void onSubscribe(void* context, MQTTAsync_successData* response) -{ - printf("Subscribe succeeded\n"); - subscribed = 1; -} - -void onSubscribeFailure(void* context, MQTTAsync_failureData* response) -{ - printf("Subscribe failed, rc %d\n", response->code); - finished = 1; -} - - -void onConnectFailure(void* context, MQTTAsync_failureData* response) -{ - printf("Connect failed, rc %d\n", response->code); - finished = 1; -} - - -void onConnect(void* context, MQTTAsync_successData* response) -{ - MQTTAsync client = (MQTTAsync)context; - MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer; - int rc; - - printf("Successful connection\n"); - - printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n" - "Press Q to quit\n\n", TOPIC, CLIENTID, QOS); - opts.onSuccess = onSubscribe; - opts.onFailure = onSubscribeFailure; - opts.context = client; - if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, &opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start subscribe, return code %d\n", rc); - finished = 1; - } -} - - -int main(int argc, char* argv[]) -{ - MQTTAsync client; - MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; - MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer; - int rc; - int ch; - - if ((rc = MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) - != MQTTASYNC_SUCCESS) - { - printf("Failed to create client, return code %d\n", rc); - rc = EXIT_FAILURE; - goto exit; - } - - if ((rc = MQTTAsync_setCallbacks(client, client, connlost, msgarrvd, NULL)) != MQTTASYNC_SUCCESS) - { - printf("Failed to set callbacks, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - conn_opts.onSuccess = onConnect; - conn_opts.onFailure = onConnectFailure; - conn_opts.context = client; - if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start connect, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - - while (!subscribed && !finished) - #if defined(_WIN32) - Sleep(100); - #else - usleep(10000L); - #endif - - if (finished) - goto exit; - - do - { - ch = getchar(); - } while (ch!='Q' && ch != 'q'); - - disc_opts.onSuccess = onDisconnect; - disc_opts.onFailure = onDisconnectFailure; - if ((rc = MQTTAsync_disconnect(client, &disc_opts)) != MQTTASYNC_SUCCESS) - { - printf("Failed to start disconnect, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - while (!disc_finished) - { - #if defined(_WIN32) - Sleep(100); - #else - usleep(10000L); - #endif - } - -destroy_exit: - MQTTAsync_destroy(&client); -exit: - return rc; -} - - * @endcode -* @page tracing Tracing - * - * Runtime tracing can be controlled by environment variables or API calls. - * - * #### Environment variables - * - * Tracing is switched on by setting the MQTT_C_CLIENT_TRACE environment variable. - * A value of ON, or stdout, prints to stdout, any other value is interpreted as a file name to use. - * - * The amount of trace detail is controlled with the MQTT_C_CLIENT_TRACE_LEVEL environment - * variable - valid values are ERROR, PROTOCOL, MINIMUM, MEDIUM and MAXIMUM - * (from least to most verbose). - * - * The variable MQTT_C_CLIENT_TRACE_MAX_LINES limits the number of lines of trace that are output - * to a file. Two files are used at most, when they are full, the last one is overwritten with the - * new trace entries. The default size is 1000 lines. - * - * #### Trace API calls - * - * MQTTAsync_traceCallback() is used to set a callback function which is called whenever trace - * information is available. This will be the same information as that printed if the - * environment variables were used to control the trace. - * - * The MQTTAsync_setTraceLevel() calls is used to set the maximum level of trace entries that will be - * passed to the callback function. The levels are: - * 1. ::MQTTASYNC_TRACE_MAXIMUM - * 2. ::MQTTASYNC_TRACE_MEDIUM - * 3. ::MQTTASYNC_TRACE_MINIMUM - * 4. ::MQTTASYNC_TRACE_PROTOCOL - * 5. ::MQTTASYNC_TRACE_ERROR - * 6. ::MQTTASYNC_TRACE_SEVERE - * 7. ::MQTTASYNC_TRACE_FATAL - * - * Selecting ::MQTTASYNC_TRACE_MAXIMUM will cause all trace entries at all levels to be returned. - * Choosing ::MQTTASYNC_TRACE_ERROR will cause ERROR, SEVERE and FATAL trace entries to be returned - * to the callback function. - * - * ### MQTT Packet Tracing - * - * A feature that can be very useful is printing the MQTT packets that are sent and received. To - * achieve this, use the following environment variable settings: - * @code - MQTT_C_CLIENT_TRACE=ON - MQTT_C_CLIENT_TRACE_LEVEL=PROTOCOL - * @endcode - * The output you should see looks like this: - * @code - 20130528 155936.813 3 stdout-subscriber -> CONNECT cleansession: 1 (0) - 20130528 155936.813 3 stdout-subscriber <- CONNACK rc: 0 - 20130528 155936.813 3 stdout-subscriber -> SUBSCRIBE msgid: 1 (0) - 20130528 155936.813 3 stdout-subscriber <- SUBACK msgid: 1 - 20130528 155941.818 3 stdout-subscriber -> DISCONNECT (0) - * @endcode - * where the fields are: - * 1. date - * 2. time - * 3. socket number - * 4. client id - * 5. direction (-> from client to server, <- from server to client) - * 6. packet details - * - * ### Default Level Tracing - * - * This is an extract of a default level trace of a call to connect: - * @code - 19700101 010000.000 (1152206656) (0)> MQTTClient_connect:893 - 19700101 010000.000 (1152206656) (1)> MQTTClient_connectURI:716 - 20130528 160447.479 Connecting to serverURI localhost:1883 - 20130528 160447.479 (1152206656) (2)> MQTTProtocol_connect:98 - 20130528 160447.479 (1152206656) (3)> MQTTProtocol_addressPort:48 - 20130528 160447.479 (1152206656) (3)< MQTTProtocol_addressPort:73 - 20130528 160447.479 (1152206656) (3)> Socket_new:599 - 20130528 160447.479 New socket 4 for localhost, port 1883 - 20130528 160447.479 (1152206656) (4)> Socket_addSocket:163 - 20130528 160447.479 (1152206656) (5)> Socket_setnonblocking:73 - 20130528 160447.479 (1152206656) (5)< Socket_setnonblocking:78 (0) - 20130528 160447.479 (1152206656) (4)< Socket_addSocket:176 (0) - 20130528 160447.479 (1152206656) (4)> Socket_error:95 - 20130528 160447.479 (1152206656) (4)< Socket_error:104 (115) - 20130528 160447.479 Connect pending - 20130528 160447.479 (1152206656) (3)< Socket_new:683 (115) - 20130528 160447.479 (1152206656) (2)< MQTTProtocol_connect:131 (115) - * @endcode - * where the fields are: - * 1. date - * 2. time - * 3. thread id - * 4. function nesting level - * 5. function entry (>) or exit (<) - * 6. function name : line of source code file - * 7. return value (if there is one) - * - * ### Memory Allocation Tracing - * - * Setting the trace level to maximum causes memory allocations and frees to be traced along with - * the default trace entries, with messages like the following: - * @code - 20130528 161819.657 Allocating 16 bytes in heap at file /home/icraggs/workspaces/mqrtc/mqttv3c/src/MQTTPacket.c line 177 ptr 0x179f930 - - 20130528 161819.657 Freeing 16 bytes in heap at file /home/icraggs/workspaces/mqrtc/mqttv3c/src/MQTTPacket.c line 201, heap use now 896 bytes - * @endcode - * When the last MQTT client object is destroyed, if the trace is being recorded - * and all memory allocated by the client library has not been freed, an error message will be - * written to the trace. This can help with fixing memory leaks. The message will look like this: - * @code - 20130528 163909.208 Some memory not freed at shutdown, possible memory leak - 20130528 163909.208 Heap scan start, total 880 bytes - 20130528 163909.208 Heap element size 32, line 354, file /home/icraggs/workspaces/mqrtc/mqttv3c/src/MQTTPacket.c, ptr 0x260cb00 - 20130528 163909.208 Content - 20130528 163909.209 Heap scan end - * @endcode - * @endcond - */ - -#if defined(__cplusplus) - } -#endif - -#endif diff --git a/include/paho-mqtt/MQTTClient.h b/include/paho-mqtt/MQTTClient.h deleted file mode 100644 index 8d6a32a..0000000 --- a/include/paho-mqtt/MQTTClient.h +++ /dev/null @@ -1,1972 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2022 IBM Corp., Ian Craggs and others - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial API and implementation and/or initial documentation - * Ian Craggs, Allan Stockdill-Mander - SSL updates - * Ian Craggs - multiple server connection support - * Ian Craggs - MQTT 3.1.1 support - * Ian Craggs - remove const from eyecatchers #168 - *******************************************************************************/ - -/** - * @cond MQTTClient_internal - * @mainpage MQTT Client Library Internals - * In the beginning there was one MQTT C client library, MQTTClient, as implemented in MQTTClient.c - * This library was designed to be easy to use for applications which didn't mind if some of the calls - * blocked for a while. For instance, the MQTTClient_connect call will block until a successful - * connection has completed, or a connection has failed, which could be as long as the "connection - * timeout" interval, whose default is 30 seconds. - * - * However in mobile devices and other windowing environments, blocking on the GUI thread is a bad - * thing as it causes the user interface to freeze. Hence a new API, MQTTAsync, implemented - * in MQTTAsync.c, was devised. There are no blocking calls in this library, so it is well suited - * to GUI and mobile environments, at the expense of some extra complexity. - * - * Both libraries are designed to be sparing in the use of threads. So multiple client objects are - * handled by one or two threads, with a select call in Socket_getReadySocket(), used to determine - * when a socket has incoming data. This API is thread safe: functions may be called by multiple application - * threads, with the exception of ::MQTTClient_yield and ::MQTTClient_receive, which are intended - * for single threaded environments only. - * - * @endcond - * @cond MQTTClient_main - * @mainpage MQTT Client library for C (MQTTClient) - * © Copyright 2009, 2022 IBM Corp., Ian Craggs and others - * - * @brief An MQTT client library in C. - * - * These pages describe the original more synchronous API which might be - * considered easier to use. Some of the calls will block. For the new - * totally asynchronous API where no calls block, which is especially suitable - * for use in windowed environments, see the - * MQTT C Client Asynchronous API Documentation. - * The MQTTClient API is not thread safe, whereas the MQTTAsync API is. - * - * An MQTT client application connects to MQTT-capable servers. - * A typical client is responsible for collecting information from a telemetry - * device and publishing the information to the server. It can also subscribe - * to topics, receive messages, and use this information to control the - * telemetry device. - * - * MQTT clients implement the published MQTT v3 protocol. You can write your own - * API to the MQTT protocol using the programming language and platform of your - * choice. This can be time-consuming and error-prone. - * - * To simplify writing MQTT client applications, this library encapsulates - * the MQTT v3 protocol for you. Using this library enables a fully functional - * MQTT client application to be written in a few lines of code. - * The information presented here documents the API provided - * by the MQTT Client library for C. - * - * Using the client
- * Applications that use the client library typically use a similar structure: - *
    - *
  • Create a client object
  • - *
  • Set the options to connect to an MQTT server
  • - *
  • Set up callback functions if multi-threaded (asynchronous mode) - * operation is being used (see @ref async).
  • - *
  • Subscribe to any topics the client needs to receive
  • - *
  • Repeat until finished:
  • - *
      - *
    • Publish any messages the client needs to
    • - *
    • Handle any incoming messages
    • - *
    - *
  • Disconnect the client
  • - *
  • Free any memory being used by the client
  • - *
- * Some simple examples are shown here: - *
    - *
  • @ref pubsync
  • - *
  • @ref pubasync
  • - *
  • @ref subasync
  • - *
- * Additional information about important concepts is provided here: - *
    - *
  • @ref async
  • - *
  • @ref callbacks
  • - *
  • @ref wildcard
  • - *
  • @ref qos
  • - *
  • @ref tracing
  • - *
- * @endcond - */ - -/* -/// @cond EXCLUDE -*/ -#if !defined(MQTTCLIENT_H) -#define MQTTCLIENT_H - -#if defined(__cplusplus) - extern "C" { -#endif - -#include -/* -/// @endcond -*/ - -#include "MQTTExportDeclarations.h" - -#include "MQTTProperties.h" -#include "MQTTReasonCodes.h" -#include "MQTTSubscribeOpts.h" -#if !defined(NO_PERSISTENCE) -#include "MQTTClientPersistence.h" -#endif - -/** - * Return code: No error. Indicates successful completion of an MQTT client - * operation. - */ -#define MQTTCLIENT_SUCCESS 0 -/** - * Return code: A generic error code indicating the failure of an MQTT client - * operation. - */ -#define MQTTCLIENT_FAILURE -1 - -/* error code -2 is MQTTCLIENT_PERSISTENCE_ERROR */ - -/** - * Return code: The client is disconnected. - */ -#define MQTTCLIENT_DISCONNECTED -3 -/** - * Return code: The maximum number of messages allowed to be simultaneously - * in-flight has been reached. - */ -#define MQTTCLIENT_MAX_MESSAGES_INFLIGHT -4 -/** - * Return code: An invalid UTF-8 string has been detected. - */ -#define MQTTCLIENT_BAD_UTF8_STRING -5 -/** - * Return code: A NULL parameter has been supplied when this is invalid. - */ -#define MQTTCLIENT_NULL_PARAMETER -6 -/** - * Return code: The topic has been truncated (the topic string includes - * embedded NULL characters). String functions will not access the full topic. - * Use the topic length value to access the full topic. - */ -#define MQTTCLIENT_TOPICNAME_TRUNCATED -7 -/** - * Return code: A structure parameter does not have the correct eyecatcher - * and version number. - */ -#define MQTTCLIENT_BAD_STRUCTURE -8 -/** - * Return code: A QoS value that falls outside of the acceptable range (0,1,2) - */ -#define MQTTCLIENT_BAD_QOS -9 -/** - * Return code: Attempting SSL connection using non-SSL version of library - */ -#define MQTTCLIENT_SSL_NOT_SUPPORTED -10 - /** - * Return code: unrecognized MQTT version - */ - #define MQTTCLIENT_BAD_MQTT_VERSION -11 -/** - * Return code: protocol prefix in serverURI should be: - * @li @em tcp:// or @em mqtt:// - Insecure TCP - * @li @em ssl:// or @em mqtts:// - Encrypted SSL/TLS - * @li @em ws:// - Insecure websockets - * @li @em wss:// - Secure web sockets - * The TLS enabled prefixes (ssl, mqtts, wss) are only valid if a TLS - * version of the library is linked with. - */ -#define MQTTCLIENT_BAD_PROTOCOL -14 - /** - * Return code: option not applicable to the requested version of MQTT - */ - #define MQTTCLIENT_BAD_MQTT_OPTION -15 - /** - * Return code: call not applicable to the requested version of MQTT - */ - #define MQTTCLIENT_WRONG_MQTT_VERSION -16 - /** - * Return code: 0 length will topic on connect - */ - #define MQTTCLIENT_0_LEN_WILL_TOPIC -17 - - -/** - * Default MQTT version to connect with. Use 3.1.1 then fall back to 3.1 - */ -#define MQTTVERSION_DEFAULT 0 -/** - * MQTT version to connect with: 3.1 - */ -#define MQTTVERSION_3_1 3 -/** - * MQTT version to connect with: 3.1.1 - */ -#define MQTTVERSION_3_1_1 4 - /** - * MQTT version to connect with: 5 - */ - #define MQTTVERSION_5 5 -/** - * Bad return code from subscribe, as defined in the 3.1.1 specification - */ -#define MQTT_BAD_SUBSCRIBE 0x80 - -/** - * Initialization options - */ -typedef struct -{ - /** The eyecatcher for this structure. Must be MQTG. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 */ - int struct_version; - /** 1 = we do openssl init, 0 = leave it to the application */ - int do_openssl_init; -} MQTTClient_init_options; - -#define MQTTClient_init_options_initializer { {'M', 'Q', 'T', 'G'}, 0, 0 } - -/** - * Global init of mqtt library. Call once on program start to set global behaviour. - * do_openssl_init - if mqtt library should initialize OpenSSL (1) or rely on the caller to do it before using the library (0) - */ -LIBMQTT_API void MQTTClient_global_init(MQTTClient_init_options* inits); - -/** - * A handle representing an MQTT client. A valid client handle is available - * following a successful call to MQTTClient_create(). - */ -typedef void* MQTTClient; -/** - * A value representing an MQTT message. A delivery token is returned to the - * client application when a message is published. The token can then be used to - * check that the message was successfully delivered to its destination (see - * MQTTClient_publish(), - * MQTTClient_publishMessage(), - * MQTTClient_deliveryComplete(), - * MQTTClient_waitForCompletion() and - * MQTTClient_getPendingDeliveryTokens()). - */ -typedef int MQTTClient_deliveryToken; -typedef int MQTTClient_token; - -/** - * A structure representing the payload and attributes of an MQTT message. The - * message topic is not part of this structure (see MQTTClient_publishMessage(), - * MQTTClient_publish(), MQTTClient_receive(), MQTTClient_freeMessage() - * and MQTTClient_messageArrived()). - */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQTM. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 or 1 - * 0 indicates no message properties */ - int struct_version; - /** The length of the MQTT message payload in bytes. */ - int payloadlen; - /** A pointer to the payload of the MQTT message. */ - void* payload; - /** - * The quality of service (QoS) assigned to the message. - * There are three levels of QoS: - *
- *
QoS0
- *
Fire and forget - the message may not be delivered
- *
QoS1
- *
At least once - the message will be delivered, but may be - * delivered more than once in some circumstances.
- *
QoS2
- *
Once and one only - the message will be delivered exactly once.
- *
- */ - int qos; - /** - * The retained flag serves two purposes depending on whether the message - * it is associated with is being published or received. - * - * retained = true
- * For messages being published, a true setting indicates that the MQTT - * server should retain a copy of the message. The message will then be - * transmitted to new subscribers to a topic that matches the message topic. - * For subscribers registering a new subscription, the flag being true - * indicates that the received message is not a new one, but one that has - * been retained by the MQTT server. - * - * retained = false
- * For publishers, this indicates that this message should not be retained - * by the MQTT server. For subscribers, a false setting indicates this is - * a normal message, received as a result of it being published to the - * server. - */ - int retained; - /** - * The dup flag indicates whether or not this message is a duplicate. - * It is only meaningful when receiving QoS1 messages. When true, the - * client application should take appropriate action to deal with the - * duplicate message. - */ - int dup; - /** The message identifier is normally reserved for internal use by the - * MQTT client and server. - */ - int msgid; - /** - * The MQTT V5 properties associated with the message. - */ - MQTTProperties properties; -} MQTTClient_message; - -#define MQTTClient_message_initializer { {'M', 'Q', 'T', 'M'}, 1, 0, NULL, 0, 0, 0, 0, MQTTProperties_initializer } - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * receipt of messages. The function is registered with the client library by - * passing it as an argument to MQTTClient_setCallbacks(). It is - * called by the client library when a new message that matches a client - * subscription has been received from the server. This function is executed on - * a separate thread to the one on which the client application is running. - * @param context A pointer to the context value originally passed to - * MQTTClient_setCallbacks(), which contains any application-specific context. - * @param topicName The topic associated with the received message. - * @param topicLen The length of the topic if there are one - * more NULL characters embedded in topicName, otherwise topicLen - * is 0. If topicLen is 0, the value returned by strlen(topicName) - * can be trusted. If topicLen is greater than 0, the full topic name - * can be retrieved by accessing topicName as a byte array of length - * topicLen. - * @param message The MQTTClient_message structure for the received message. - * This structure contains the message payload and attributes. - * @return This function must return 0 or 1 indicating whether or not - * the message has been safely received by the client application.
- * Returning 1 indicates that the message has been successfully handled. - * To free the message storage, ::MQTTClient_freeMessage must be called. - * To free the topic name storage, ::MQTTClient_free must be called.
- * Returning 0 indicates that there was a problem. In this - * case, the client library will reinvoke MQTTClient_messageArrived() to - * attempt to deliver the message to the application again. - * Do not free the message and topic storage when returning 0, otherwise - * the redelivery will fail. - */ -typedef int MQTTClient_messageArrived(void* context, char* topicName, int topicLen, MQTTClient_message* message); - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * notification of delivery of messages. The function is registered with the - * client library by passing it as an argument to MQTTClient_setCallbacks(). - * It is called by the client library after the client application has - * published a message to the server. It indicates that the necessary - * handshaking and acknowledgements for the requested quality of service (see - * MQTTClient_message.qos) have been completed. This function is executed on a - * separate thread to the one on which the client application is running. - * Note:MQTTClient_deliveryComplete() is not called when messages are - * published at QoS0. - * @param context A pointer to the context value originally passed to - * MQTTClient_setCallbacks(), which contains any application-specific context. - * @param dt The ::MQTTClient_deliveryToken associated with - * the published message. Applications can check that all messages have been - * correctly published by matching the delivery tokens returned from calls to - * MQTTClient_publish() and MQTTClient_publishMessage() with the tokens passed - * to this callback. - */ -typedef void MQTTClient_deliveryComplete(void* context, MQTTClient_deliveryToken dt); - -/** - * This is a callback function. The client application - * must provide an implementation of this function to enable asynchronous - * notification of the loss of connection to the server. The function is - * registered with the client library by passing it as an argument to - * MQTTClient_setCallbacks(). It is called by the client library if the client - * loses its connection to the server. The client application must take - * appropriate action, such as trying to reconnect or reporting the problem. - * This function is executed on a separate thread to the one on which the - * client application is running. - * @param context A pointer to the context value originally passed to - * MQTTClient_setCallbacks(), which contains any application-specific context. - * @param cause The reason for the disconnection. - * Currently, cause is always set to NULL. - */ -typedef void MQTTClient_connectionLost(void* context, char* cause); - -/** - * This function sets the callback functions for a specific client. - * If your client application doesn't use a particular callback, set the - * relevant parameter to NULL. Calling MQTTClient_setCallbacks() puts the - * client into multi-threaded mode. Any necessary message acknowledgements and - * status communications are handled in the background without any intervention - * from the client application. See @ref async for more information. - * - * Note: The MQTT client must be disconnected when this function is - * called. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to each of the callback functions to - * provide access to the context information in the callback. - * @param cl A pointer to an MQTTClient_connectionLost() callback - * function. You can set this to NULL if your application doesn't handle - * disconnections. - * @param ma A pointer to an MQTTClient_messageArrived() callback - * function. This callback function must be set when you call - * MQTTClient_setCallbacks(), as otherwise there would be nowhere to deliver - * any incoming messages. - * @param dc A pointer to an MQTTClient_deliveryComplete() callback - * function. You can set this to NULL if your application publishes - * synchronously or if you do not want to check for successful delivery. - * @return ::MQTTCLIENT_SUCCESS if the callbacks were correctly set, - * ::MQTTCLIENT_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClient_connectionLost* cl, - MQTTClient_messageArrived* ma, MQTTClient_deliveryComplete* dc); - - -/** - * This is a callback function, which will be called when the a disconnect - * packet is received from the server. This applies to MQTT V5 and above only. - * @param context A pointer to the context value originally passed to - * ::MQTTClient_setDisconnected(), which contains any application-specific context. - * @param properties The MQTT V5 properties received with the disconnect, if any. - * @param reasonCode The MQTT V5 reason code received with the disconnect. - * Currently, cause is always set to NULL. - */ -typedef void MQTTClient_disconnected(void* context, MQTTProperties* properties, - enum MQTTReasonCodes reasonCode); - -/** - * Sets the MQTTClient_disconnected() callback function for a client. This will be called - * if a disconnect packet is received from the server. Only valid for MQTT V5 and above. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param context A pointer to any application-specific context. The - * the context pointer is passed to each of the callback functions to - * provide access to the context information in the callback. - * @param co A pointer to an MQTTClient_disconnected() callback - * function. NULL removes the callback setting. - * @return ::MQTTCLIENT_SUCCESS if the callbacks were correctly set, - * ::MQTTCLIENT_FAILURE if an error occurred. - */ -LIBMQTT_API int MQTTClient_setDisconnected(MQTTClient handle, void* context, MQTTClient_disconnected* co); - -/** - * This is a callback function, the MQTT V5 version of MQTTClient_deliveryComplete(). - * The client application - * must provide an implementation of this function to enable asynchronous - * notification of the completed delivery of messages. - * It is called by the client library after the client application has - * published a message to the server. It indicates that the necessary - * handshaking and acknowledgements for the requested quality of service (see - * MQTTClient_message.qos) have been completed. This function is executed on a - * separate thread to the one on which the client application is running. - * Note: It is not called when messages are published at QoS0. - * @param context A pointer to the context value originally passed to - * MQTTClient_setCallbacks(), which contains any application-specific context. - * @param dt The ::MQTTClient_deliveryToken associated with - * the published message. Applications can check that all messages have been - * correctly published by matching the delivery tokens returned from calls to - * MQTTClient_publish() and MQTTClient_publishMessage() with the tokens passed - * to this callback. - * @param packet_type the last received packet type for this completion. For QoS 1 - * always PUBACK. For QoS 2 could be PUBREC or PUBCOMP. - * @param properties the MQTT V5 properties returned with the last packet from the server - * @param reasonCode the reason code returned from the server - */ -typedef void MQTTClient_published(void* context, int dt, int packet_type, MQTTProperties* properties, - enum MQTTReasonCodes reasonCode); - -LIBMQTT_API int MQTTClient_setPublished(MQTTClient handle, void* context, MQTTClient_published* co); - -/** - * This function creates an MQTT client ready for connection to the - * specified server and using the specified persistent storage (see - * MQTTClient_persistence). See also MQTTClient_destroy(). - * @param handle A pointer to an ::MQTTClient handle. The handle is - * populated with a valid client reference following a successful return from - * this function. - * @param serverURI A null-terminated string specifying the server to - * which the client will connect. It takes the form protocol://host:port. - * Currently, protocol must be: - *
- * @em tcp:// or @em mqtt:// - Insecure TCP - *
- * @em ssl:// or @em mqtts:// - Encrypted SSL/TLS - *
- * @em ws:// - Insecure websockets - *
- * @em wss:// - Secure web sockets - *
- * The TLS enabled prefixes (ssl, mqtts, wss) are only valid if a TLS - * version of the library is linked with. - * For host, you can specify either an IP address or a host name. For - * instance, to connect to a server running on the local machines with the - * default MQTT port, specify tcp://localhost:1883. - * @param clientId The client identifier passed to the server when the - * client connects to it. It is a null-terminated UTF-8 encoded string. - * @param persistence_type The type of persistence to be used by the client: - *
- * ::MQTTCLIENT_PERSISTENCE_NONE: Use in-memory persistence. If the device or - * system on which the client is running fails or is switched off, the current - * state of any in-flight messages is lost and some messages may not be - * delivered even at QoS1 and QoS2. - *
- * ::MQTTCLIENT_PERSISTENCE_DEFAULT: Use the default (file system-based) - * persistence mechanism. Status about in-flight messages is held in persistent - * storage and provides some protection against message loss in the case of - * unexpected failure. - *
- * ::MQTTCLIENT_PERSISTENCE_USER: Use an application-specific persistence - * implementation. Using this type of persistence gives control of the - * persistence mechanism to the application. The application has to implement - * the MQTTClient_persistence interface. - * @param persistence_context If the application uses - * ::MQTTCLIENT_PERSISTENCE_NONE persistence, this argument is unused and should - * be set to NULL. For ::MQTTCLIENT_PERSISTENCE_DEFAULT persistence, it - * should be set to the location of the persistence directory (if set - * to NULL, the persistence directory used is the working directory). - * Applications that use ::MQTTCLIENT_PERSISTENCE_USER persistence set this - * argument to point to a valid MQTTClient_persistence structure. - * @return ::MQTTCLIENT_SUCCESS if the client is successfully created, otherwise - * an error code is returned. - */ -LIBMQTT_API int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId, - int persistence_type, void* persistence_context); - -/** Options for the ::MQTTClient_createWithOptions call */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQCO. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 */ - int struct_version; - /** Whether the MQTT version is 3.1, 3.1.1, or 5. To use V5, this must be set. - * MQTT V5 has to be chosen here, because during the create call the message persistence - * is initialized, and we want to know whether the format of any persisted messages - * is appropriate for the MQTT version we are going to connect with. Selecting 3.1 or - * 3.1.1 and attempting to read 5.0 persisted messages will result in an error on create. */ - int MQTTVersion; -} MQTTClient_createOptions; - -#define MQTTClient_createOptions_initializer { {'M', 'Q', 'C', 'O'}, 0, MQTTVERSION_DEFAULT } - -/** - * A version of :MQTTClient_create() with additional options. - * This function creates an MQTT client ready for connection to the - * specified server and using the specified persistent storage (see - * MQTTClient_persistence). See also MQTTClient_destroy(). - * @param handle A pointer to an ::MQTTClient handle. The handle is - * populated with a valid client reference following a successful return from - * this function. - * @param serverURI A null-terminated string specifying the server to - * which the client will connect. It takes the form protocol://host:port. - * Currently, protocol must be tcp or ssl. - * For host, you can - * specify either an IP address or a host name. For instance, to connect to - * a server running on the local machines with the default MQTT port, specify - * tcp://localhost:1883. - * @param clientId The client identifier passed to the server when the - * client connects to it. It is a null-terminated UTF-8 encoded string. - * @param persistence_type The type of persistence to be used by the client: - *
- * ::MQTTCLIENT_PERSISTENCE_NONE: Use in-memory persistence. If the device or - * system on which the client is running fails or is switched off, the current - * state of any in-flight messages is lost and some messages may not be - * delivered even at QoS1 and QoS2. - *
- * ::MQTTCLIENT_PERSISTENCE_DEFAULT: Use the default (file system-based) - * persistence mechanism. Status about in-flight messages is held in persistent - * storage and provides some protection against message loss in the case of - * unexpected failure. - *
- * ::MQTTCLIENT_PERSISTENCE_USER: Use an application-specific persistence - * implementation. Using this type of persistence gives control of the - * persistence mechanism to the application. The application has to implement - * the MQTTClient_persistence interface. - * @param persistence_context If the application uses - * ::MQTTCLIENT_PERSISTENCE_NONE persistence, this argument is unused and should - * be set to NULL. For ::MQTTCLIENT_PERSISTENCE_DEFAULT persistence, it - * should be set to the location of the persistence directory (if set - * to NULL, the persistence directory used is the working directory). - * Applications that use ::MQTTCLIENT_PERSISTENCE_USER persistence set this - * argument to point to a valid MQTTClient_persistence structure. - * @param options additional options for the create. - * @return ::MQTTCLIENT_SUCCESS if the client is successfully created, otherwise - * an error code is returned. - */ -LIBMQTT_API int MQTTClient_createWithOptions(MQTTClient* handle, const char* serverURI, const char* clientId, - int persistence_type, void* persistence_context, MQTTClient_createOptions* options); - -/** - * MQTTClient_willOptions defines the MQTT "Last Will and Testament" (LWT) settings for - * the client. In the event that a client unexpectedly loses its connection to - * the server, the server publishes the LWT message to the LWT topic on - * behalf of the client. This allows other clients (subscribed to the LWT topic) - * to be made aware that the client has disconnected. To enable the LWT - * function for a specific client, a valid pointer to an MQTTClient_willOptions - * structure is passed in the MQTTClient_connectOptions structure used in the - * MQTTClient_connect() call that connects the client to the server. The pointer - * to MQTTClient_willOptions can be set to NULL if the LWT function is not - * required. - */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQTW. */ - char struct_id[4]; - /** The version number of this structure. Must be 0 or 1 - 0 means there is no binary payload option - */ - int struct_version; - /** The LWT topic to which the LWT message will be published. */ - const char* topicName; - /** The LWT payload in string form. */ - const char* message; - /** - * The retained flag for the LWT message (see MQTTClient_message.retained). - */ - int retained; - /** - * The quality of service setting for the LWT message (see - * MQTTClient_message.qos and @ref qos). - */ - int qos; - /** The LWT payload in binary form. This is only checked and used if the message option is NULL */ - struct - { - int len; /**< binary payload length */ - const void* data; /**< binary payload data */ - } payload; -} MQTTClient_willOptions; - -#define MQTTClient_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 1, NULL, NULL, 0, 0, {0, NULL} } - -#define MQTT_SSL_VERSION_DEFAULT 0 -#define MQTT_SSL_VERSION_TLS_1_0 1 -#define MQTT_SSL_VERSION_TLS_1_1 2 -#define MQTT_SSL_VERSION_TLS_1_2 3 - -/** -* MQTTClient_sslProperties defines the settings to establish an SSL/TLS connection using the -* OpenSSL library. It covers the following scenarios: -* - Server authentication: The client needs the digital certificate of the server. It is included -* in a store containting trusted material (also known as "trust store"). -* - Mutual authentication: Both client and server are authenticated during the SSL handshake. In -* addition to the digital certificate of the server in a trust store, the client will need its own -* digital certificate and the private key used to sign its digital certificate stored in a "key store". -* - Anonymous connection: Both client and server do not get authenticated and no credentials are needed -* to establish an SSL connection. Note that this scenario is not fully secure since it is subject to -* man-in-the-middle attacks. -*/ -typedef struct -{ - /** The eyecatcher for this structure. Must be MQTS */ - char struct_id[4]; - - /** The version number of this structure. Must be 0, 1, 2, 3, 4 or 5. - * 0 means no sslVersion - * 1 means no verify, CApath - * 2 means no ssl_error_context, ssl_error_cb - * 3 means no ssl_psk_cb, ssl_psk_context, disableDefaultTrustStore - * 4 means no protos, protos_len - */ - int struct_version; - - /** The file in PEM format containing the public digital certificates trusted by the client. */ - const char* trustStore; - - /** The file in PEM format containing the public certificate chain of the client. It may also include - * the client's private key. - */ - const char* keyStore; - - /** If not included in the sslKeyStore, this setting points to the file in PEM format containing - * the client's private key. - */ - const char* privateKey; - - /** The password to load the client's privateKey if encrypted. */ - const char* privateKeyPassword; - - /** - * The list of cipher suites that the client will present to the server during the SSL handshake. For a - * full explanation of the cipher list format, please see the OpenSSL on-line documentation: - * http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT - * If this setting is ommitted, its default value will be "ALL", that is, all the cipher suites -excluding - * those offering no encryption- will be considered. - * This setting can be used to set an SSL anonymous connection ("aNULL" string value, for instance). - */ - const char* enabledCipherSuites; - - /** True/False option to enable verification of the server certificate **/ - int enableServerCertAuth; - - /** The SSL/TLS version to use. Specify one of MQTT_SSL_VERSION_DEFAULT (0), - * MQTT_SSL_VERSION_TLS_1_0 (1), MQTT_SSL_VERSION_TLS_1_1 (2) or MQTT_SSL_VERSION_TLS_1_2 (3). - * Only used if struct_version is >= 1. - */ - int sslVersion; - - /** - * Whether to carry out post-connect checks, including that a certificate - * matches the given host name. - * Exists only if struct_version >= 2 - */ - int verify; - - /** - * From the OpenSSL documentation: - * If CApath is not NULL, it points to a directory containing CA certificates in PEM format. - * Exists only if struct_version >= 2 - */ - const char* CApath; - - /** - * Callback function for OpenSSL error handler ERR_print_errors_cb - * Exists only if struct_version >= 3 - */ - int (*ssl_error_cb) (const char *str, size_t len, void *u); - - /** - * Application-specific contex for OpenSSL error handler ERR_print_errors_cb - * Exists only if struct_version >= 3 - */ - void* ssl_error_context; - - /** - * Callback function for setting TLS-PSK options. Parameters correspond to that of - * SSL_CTX_set_psk_client_callback, except for u which is the pointer ssl_psk_context. - * Exists only if struct_version >= 4 - */ - unsigned int (*ssl_psk_cb) (const char *hint, char *identity, unsigned int max_identity_len, unsigned char *psk, unsigned int max_psk_len, void *u); - - /** - * Application-specific contex for ssl_psk_cb - * Exists only if struct_version >= 4 - */ - void* ssl_psk_context; - - /** - * Don't load default SSL CA. Should be used together with PSK to make sure - * regular servers with certificate in place is not accepted. - * Exists only if struct_version >= 4 - */ - int disableDefaultTrustStore; - - /** - * The protocol-lists must be in wire-format, which is defined as a vector of non-empty, 8-bit length-prefixed, byte strings. - * The length-prefix byte is not included in the length. Each string is limited to 255 bytes. A byte-string length of 0 is invalid. - * A truncated byte-string is invalid. - * Check documentation for SSL_CTX_set_alpn_protos - * Exists only if struct_version >= 5 - */ - const unsigned char *protos; - - /** - * The length of the vector protos vector - * Exists only if struct_version >= 5 - */ - unsigned int protos_len; -} MQTTClient_SSLOptions; - -#define MQTTClient_SSLOptions_initializer { {'M', 'Q', 'T', 'S'}, 5, NULL, NULL, NULL, NULL, NULL, 1, MQTT_SSL_VERSION_DEFAULT, 0, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0 } - -/** - * MQTTClient_libraryInfo is used to store details relating to the currently used - * library such as the version in use, the time it was built and relevant openSSL - * options. - * There is one static instance of this struct in MQTTClient.c - */ - -typedef struct -{ - const char* name; - const char* value; -} MQTTClient_nameValue; - -/** - * This function returns version information about the library. - * no trace information will be returned. - * @return an array of strings describing the library. The last entry is a NULL pointer. - */ -LIBMQTT_API MQTTClient_nameValue* MQTTClient_getVersionInfo(void); - -/** - * MQTTClient_connectOptions defines several settings that control the way the - * client connects to an MQTT server. - * - * Note: Default values are not defined for members of - * MQTTClient_connectOptions so it is good practice to specify all settings. - * If the MQTTClient_connectOptions structure is defined as an automatic - * variable, all members are set to random values and thus must be set by the - * client application. If the MQTTClient_connectOptions structure is defined - * as a static variable, initialization (in compliant compilers) sets all - * values to 0 (NULL for pointers). A #keepAliveInterval setting of 0 prevents - * correct operation of the client and so you must at least set a value - * for #keepAliveInterval. - * - * Suitable default values are set in the following initializers: - * - MQTTClient_connectOptions_initializer: for MQTT 3.1.1 non-WebSockets - * - MQTTClient_connectOptions_initializer5: for MQTT 5.0 non-WebSockets - * - MQTTClient_connectOptions_initializer_ws: for MQTT 3.1.1 WebSockets - * - MQTTClient_connectOptions_initializer5_ws: for MQTT 5.0 WebSockets - */ -typedef struct -{ - /** The eyecatcher for this structure. must be MQTC. */ - char struct_id[4]; - /** The version number of this structure. Must be 0, 1, 2, 3, 4, 5, 6, 7 or 8. - * 0 signifies no SSL options and no serverURIs - * 1 signifies no serverURIs - * 2 signifies no MQTTVersion - * 3 signifies no returned values - * 4 signifies no binary password option - * 5 signifies no maxInflightMessages and cleanstart - * 6 signifies no HTTP headers option - * 7 signifies no HTTP proxy and HTTPS proxy options - */ - int struct_version; - /** The "keep alive" interval, measured in seconds, defines the maximum time - * that should pass without communication between the client and the server - * The client will ensure that at least one message travels across the - * network within each keep alive period. In the absence of a data-related - * message during the time period, the client sends a very small MQTT - * "ping" message, which the server will acknowledge. The keep alive - * interval enables the client to detect when the server is no longer - * available without having to wait for the long TCP/IP timeout. - */ - int keepAliveInterval; - /** - * This is a boolean value. The cleansession setting controls the behaviour - * of both the client and the server at connection and disconnection time. - * The client and server both maintain session state information. This - * information is used to ensure "at least once" and "exactly once" - * delivery, and "exactly once" receipt of messages. Session state also - * includes subscriptions created by an MQTT client. You can choose to - * maintain or discard state information between sessions. - * - * When cleansession is true, the state information is discarded at - * connect and disconnect. Setting cleansession to false keeps the state - * information. When you connect an MQTT client application with - * MQTTClient_connect(), the client identifies the connection using the - * client identifier and the address of the server. The server checks - * whether session information for this client - * has been saved from a previous connection to the server. If a previous - * session still exists, and cleansession=true, then the previous session - * information at the client and server is cleared. If cleansession=false, - * the previous session is resumed. If no previous session exists, a new - * session is started. - */ - int cleansession; - /** - * This is a boolean value that controls how many messages can be in-flight - * simultaneously. Setting reliable to true means that a published - * message must be completed (acknowledgements received) before another - * can be sent. Attempts to publish additional messages receive an - * ::MQTTCLIENT_MAX_MESSAGES_INFLIGHT return code. Setting this flag to - * false allows up to 10 messages to be in-flight. This can increase - * overall throughput in some circumstances. - */ - int reliable; - /** - * This is a pointer to an MQTTClient_willOptions structure. If your - * application does not make use of the Last Will and Testament feature, - * set this pointer to NULL. - */ - MQTTClient_willOptions* will; - /** - * MQTT servers that support the MQTT v3.1.1 protocol provide authentication - * and authorisation by user name and password. This is the user name - * parameter. - */ - const char* username; - /** - * MQTT servers that support the MQTT v3.1.1 protocol provide authentication - * and authorisation by user name and password. This is the password - * parameter. - */ - const char* password; - /** - * The time interval in seconds to allow a connect to complete. - */ - int connectTimeout; - /** - * The time interval in seconds after which unacknowledged publish requests are - * retried during a TCP session. With MQTT 3.1.1 and later, retries are - * not required except on reconnect. 0 turns off in-session retries, and is the - * recommended setting. Adding retries to an already overloaded network only - * exacerbates the problem. - */ - int retryInterval; - /** - * This is a pointer to an MQTTClient_SSLOptions structure. If your - * application does not make use of SSL, set this pointer to NULL. - */ - MQTTClient_SSLOptions* ssl; - /** - * The number of entries in the optional serverURIs array. Defaults to 0. - */ - int serverURIcount; - /** - * An optional array of null-terminated strings specifying the servers to - * which the client will connect. Each string takes the form protocol://host:port. - * protocol must be tcp, ssl, ws or wss. - * The TLS enabled prefixes (ssl, wss) are only valid if a TLS version of the library - * is linked with. - * For host, you can - * specify either an IP address or a host name. For instance, to connect to - * a server running on the local machines with the default MQTT port, specify - * tcp://localhost:1883. - * If this list is empty (the default), the server URI specified on MQTTClient_create() - * is used. - */ - char* const* serverURIs; - /** - * Sets the version of MQTT to be used on the connect. - * MQTTVERSION_DEFAULT (0) = default: start with 3.1.1, and if that fails, fall back to 3.1 - * MQTTVERSION_3_1 (3) = only try version 3.1 - * MQTTVERSION_3_1_1 (4) = only try version 3.1.1 - * MQTTVERSION_5 (5) = only try version 5.0 - */ - int MQTTVersion; - /** - * Returned from the connect when the MQTT version used to connect is 3.1.1 - */ - struct - { - const char* serverURI; /**< the serverURI connected to */ - int MQTTVersion; /**< the MQTT version used to connect with */ - int sessionPresent; /**< if the MQTT version is 3.1.1, the value of sessionPresent returned in the connack */ - } returned; - /** - * Optional binary password. Only checked and used if the password option is NULL - */ - struct - { - int len; /**< binary password length */ - const void* data; /**< binary password data */ - } binarypwd; - /** - * The maximum number of messages in flight - */ - int maxInflightMessages; - /* - * MQTT V5 clean start flag. Only clears state at the beginning of the session. - */ - int cleanstart; - /** - * HTTP headers for websockets - */ - const MQTTClient_nameValue* httpHeaders; - /** - * HTTP proxy - */ - const char* httpProxy; - /** - * HTTPS proxy - */ - const char* httpsProxy; -} MQTTClient_connectOptions; - -/** Initializer for connect options for MQTT 3.1.1 non-WebSocket connections */ -#define MQTTClient_connectOptions_initializer { {'M', 'Q', 'T', 'C'}, 8, 60, 1, 1, NULL, NULL, NULL, 30, 0, NULL,\ -0, NULL, MQTTVERSION_DEFAULT, {NULL, 0, 0}, {0, NULL}, -1, 0, NULL, NULL, NULL} - -/** Initializer for connect options for MQTT 5.0 non-WebSocket connections */ -#define MQTTClient_connectOptions_initializer5 { {'M', 'Q', 'T', 'C'}, 8, 60, 0, 1, NULL, NULL, NULL, 30, 0, NULL,\ -0, NULL, MQTTVERSION_5, {NULL, 0, 0}, {0, NULL}, -1, 1, NULL, NULL, NULL} - -/** Initializer for connect options for MQTT 3.1.1 WebSockets connections. - * The keepalive interval is set to 45 seconds to avoid webserver 60 second inactivity timeouts. - */ -#define MQTTClient_connectOptions_initializer_ws { {'M', 'Q', 'T', 'C'}, 8, 45, 1, 1, NULL, NULL, NULL, 30, 0, NULL,\ -0, NULL, MQTTVERSION_DEFAULT, {NULL, 0, 0}, {0, NULL}, -1, 0, NULL, NULL, NULL} - -/** Initializer for connect options for MQTT 5.0 WebSockets connections. - * The keepalive interval is set to 45 seconds to avoid webserver 60 second inactivity timeouts. - */ -#define MQTTClient_connectOptions_initializer5_ws { {'M', 'Q', 'T', 'C'}, 8, 45, 0, 1, NULL, NULL, NULL, 30, 0, NULL,\ -0, NULL, MQTTVERSION_5, {NULL, 0, 0}, {0, NULL}, -1, 1, NULL, NULL, NULL} - -/** - * This function attempts to connect a previously-created client (see - * MQTTClient_create()) to an MQTT server using the specified options. If you - * want to enable asynchronous message and status notifications, you must call - * MQTTClient_setCallbacks() prior to MQTTClient_connect(). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param options A pointer to a valid MQTTClient_connectOptions - * structure. - * @return ::MQTTCLIENT_SUCCESS if the client successfully connects to the - * server. An error code is returned if the client was unable to connect to - * the server. - * Error codes greater than 0 are returned by the MQTT protocol:

- * 1: Connection refused: Unacceptable protocol version
- * 2: Connection refused: Identifier rejected
- * 3: Connection refused: Server unavailable
- * 4: Connection refused: Bad user name or password
- * 5: Connection refused: Not authorized
- * 6-255: Reserved for future use
- */ -LIBMQTT_API int MQTTClient_connect(MQTTClient handle, MQTTClient_connectOptions* options); - -/** MQTT version 5.0 response information */ -typedef struct MQTTResponse -{ - int version; /* the version number of this structure */ - enum MQTTReasonCodes reasonCode; /* the MQTT 5.0 reason code returned */ - int reasonCodeCount; /* the number of reason codes. Used for subscribeMany5 and unsubscribeMany5 */ - enum MQTTReasonCodes* reasonCodes; /* a list of reason codes. Used for subscribeMany5 and unsubscribeMany5 */ - MQTTProperties* properties; /* optionally, the MQTT 5.0 properties returned */ -} MQTTResponse; - -#define MQTTResponse_initializer {1, MQTTREASONCODE_SUCCESS, 0, NULL, NULL} - -/** - * Frees the storage associated with the MQTT response. - * @param response the response structure to be freed - */ -LIBMQTT_API void MQTTResponse_free(MQTTResponse response); - -/** - * Attempts to connect a previously-created client (see - * MQTTClient_create()) to an MQTT server using MQTT version 5.0 and the specified options. If you - * want to enable asynchronous message and status notifications, you must call - * MQTTClient_setCallbacks() prior to MQTTClient_connect(). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param options A pointer to a valid MQTTClient_connectOptions - * structure. - * @param connectProperties the MQTT 5.0 connect properties to use - * @param willProperties the MQTT 5.0 properties to set on the will message - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_connect5(MQTTClient handle, MQTTClient_connectOptions* options, - MQTTProperties* connectProperties, MQTTProperties* willProperties); - -/** - * This function attempts to disconnect the client from the MQTT - * server. In order to allow the client time to complete handling of messages - * that are in-flight when this function is called, a timeout period is - * specified. When the timeout period has expired, the client disconnects even - * if there are still outstanding message acknowledgements. - * The next time the client connects to the same server, any QoS 1 or 2 - * messages which have not completed will be retried depending on the - * cleansession settings for both the previous and the new connection (see - * MQTTClient_connectOptions.cleansession and MQTTClient_connect()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param timeout The client delays disconnection for up to this time (in - * milliseconds) in order to allow in-flight message transfers to complete. - * @return ::MQTTCLIENT_SUCCESS if the client successfully disconnects from - * the server. An error code is returned if the client was unable to disconnect - * from the server - */ -LIBMQTT_API int MQTTClient_disconnect(MQTTClient handle, int timeout); - -LIBMQTT_API int MQTTClient_disconnect5(MQTTClient handle, int timeout, enum MQTTReasonCodes reason, MQTTProperties* props); - -/** - * This function allows the client application to test whether or not a - * client is currently connected to the MQTT server. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @return Boolean true if the client is connected, otherwise false. - */ -LIBMQTT_API int MQTTClient_isConnected(MQTTClient handle); - - -/* Subscribe is synchronous. QoS list parameter is changed on return to granted QoSs. - Returns return code, MQTTCLIENT_SUCCESS == success, non-zero some sort of error (TBD) */ - -/** - * This function attempts to subscribe a client to a single topic, which may - * contain wildcards (see @ref wildcard). This call also specifies the - * @ref qos requested for the subscription - * (see also MQTTClient_subscribeMany()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topic The subscription topic, which may include wildcards. - * @param qos The requested quality of service for the subscription. - * @return ::MQTTCLIENT_SUCCESS if the subscription request is successful. - * An error code is returned if there was a problem registering the - * subscription. - */ -LIBMQTT_API int MQTTClient_subscribe(MQTTClient handle, const char* topic, int qos); - -/** - * This function attempts to subscribe an MQTT version 5.0 client to a single topic, which may - * contain wildcards (see @ref wildcard). This call also specifies the - * @ref qos requested for the subscription - * (see also MQTTClient_subscribeMany()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topic The subscription topic, which may include wildcards. - * @param qos The requested quality of service for the subscription. - * @param opts the MQTT 5.0 subscribe options to be used - * @param props the MQTT 5.0 properties to be used - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_subscribe5(MQTTClient handle, const char* topic, int qos, - MQTTSubscribe_options* opts, MQTTProperties* props); - -/** - * This function attempts to subscribe a client to a list of topics, which may - * contain wildcards (see @ref wildcard). This call also specifies the - * @ref qos requested for each topic (see also MQTTClient_subscribe()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param count The number of topics for which the client is requesting - * subscriptions. - * @param topic An array (of length count) of pointers to - * topics, each of which may include wildcards. - * @param qos An array (of length count) of @ref qos - * values. qos[n] is the requested QoS for topic[n]. - * @return ::MQTTCLIENT_SUCCESS if the subscription request is successful. - * An error code is returned if there was a problem registering the - * subscriptions. - */ -LIBMQTT_API int MQTTClient_subscribeMany(MQTTClient handle, int count, char* const* topic, int* qos); - -/** - * This function attempts to subscribe an MQTT version 5.0 client to a list of topics, which may - * contain wildcards (see @ref wildcard). This call also specifies the - * @ref qos requested for each topic (see also MQTTClient_subscribe()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param count The number of topics for which the client is requesting - * subscriptions. - * @param topic An array (of length count) of pointers to - * topics, each of which may include wildcards. - * @param qos An array (of length count) of @ref qos - * values. qos[n] is the requested QoS for topic[n]. - * @param opts the MQTT 5.0 subscribe options to be used - * @param props the MQTT 5.0 properties to be used - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_subscribeMany5(MQTTClient handle, int count, char* const* topic, - int* qos, MQTTSubscribe_options* opts, MQTTProperties* props); - -/** - * This function attempts to remove an existing subscription made by the - * specified client. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topic The topic for the subscription to be removed, which may - * include wildcards (see @ref wildcard). - * @return ::MQTTCLIENT_SUCCESS if the subscription is removed. - * An error code is returned if there was a problem removing the - * subscription. - */ -LIBMQTT_API int MQTTClient_unsubscribe(MQTTClient handle, const char* topic); - -/** - * This function attempts to remove an existing subscription made by the - * specified client using MQTT 5.0. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topic The topic for the subscription to be removed, which may - * include wildcards (see @ref wildcard). - * @param props the MQTT 5.0 properties to be used - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_unsubscribe5(MQTTClient handle, const char* topic, MQTTProperties* props); - -/** - * This function attempts to remove existing subscriptions to a list of topics - * made by the specified client. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param count The number subscriptions to be removed. - * @param topic An array (of length count) of pointers to the topics of - * the subscriptions to be removed, each of which may include wildcards. - * @return ::MQTTCLIENT_SUCCESS if the subscriptions are removed. - * An error code is returned if there was a problem removing the subscriptions. - */ -LIBMQTT_API int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char* const* topic); - -/** - * This function attempts to remove existing subscriptions to a list of topics - * made by the specified client using MQTT version 5.0. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param count The number subscriptions to be removed. - * @param topic An array (of length count) of pointers to the topics of - * the subscriptions to be removed, each of which may include wildcards. - * @param props the MQTT 5.0 properties to be used - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_unsubscribeMany5(MQTTClient handle, int count, char* const* topic, MQTTProperties* props); - -/** - * This function attempts to publish a message to a given topic (see also - * MQTTClient_publishMessage()). An ::MQTTClient_deliveryToken is issued when - * this function returns successfully. If the client application needs to - * test for succesful delivery of QoS1 and QoS2 messages, this can be done - * either asynchronously or synchronously (see @ref async, - * ::MQTTClient_waitForCompletion and MQTTClient_deliveryComplete()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topicName The topic associated with this message. - * @param payloadlen The length of the payload in bytes. - * @param payload A pointer to the byte array payload of the message. - * @param qos The @ref qos of the message. - * @param retained The retained flag for the message. - * @param dt A pointer to an ::MQTTClient_deliveryToken. This is populated - * with a token representing the message when the function returns - * successfully. If your application does not use delivery tokens, set this - * argument to NULL. - * @return ::MQTTCLIENT_SUCCESS if the message is accepted for publication. - * An error code is returned if there was a problem accepting the message. - */ -LIBMQTT_API int MQTTClient_publish(MQTTClient handle, const char* topicName, int payloadlen, const void* payload, int qos, int retained, - MQTTClient_deliveryToken* dt); - -/** - * Attempts to publish a message to a given topic using MQTT version 5.0 (see also - * MQTTClient_publishMessage5()). An ::MQTTClient_deliveryToken is issued when - * this function returns successfully. If the client application needs to - * test for succesful delivery of QoS1 and QoS2 messages, this can be done - * either asynchronously or synchronously (see @ref async, - * ::MQTTClient_waitForCompletion and MQTTClient_deliveryComplete()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topicName The topic associated with this message. - * @param payloadlen The length of the payload in bytes. - * @param payload A pointer to the byte array payload of the message. - * @param qos The @ref qos of the message. - * @param retained The retained flag for the message. - * @param properties the MQTT 5.0 properties to be used - * @param dt A pointer to an ::MQTTClient_deliveryToken. This is populated - * with a token representing the message when the function returns - * successfully. If your application does not use delivery tokens, set this - * argument to NULL. - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_publish5(MQTTClient handle, const char* topicName, int payloadlen, const void* payload, - int qos, int retained, MQTTProperties* properties, MQTTClient_deliveryToken* dt); -/** - * This function attempts to publish a message to a given topic (see also - * MQTTClient_publish()). An ::MQTTClient_deliveryToken is issued when - * this function returns successfully. If the client application needs to - * test for succesful delivery of QoS1 and QoS2 messages, this can be done - * either asynchronously or synchronously (see @ref async, - * ::MQTTClient_waitForCompletion and MQTTClient_deliveryComplete()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topicName The topic associated with this message. - * @param msg A pointer to a valid MQTTClient_message structure containing - * the payload and attributes of the message to be published. - * @param dt A pointer to an ::MQTTClient_deliveryToken. This is populated - * with a token representing the message when the function returns - * successfully. If your application does not use delivery tokens, set this - * argument to NULL. - * @return ::MQTTCLIENT_SUCCESS if the message is accepted for publication. - * An error code is returned if there was a problem accepting the message. - */ -LIBMQTT_API int MQTTClient_publishMessage(MQTTClient handle, const char* topicName, MQTTClient_message* msg, MQTTClient_deliveryToken* dt); - - -/** - * Attempts to publish a message to the given topic using MQTT version 5.0 - * (see also - * MQTTClient_publish5()). An ::MQTTClient_deliveryToken is issued when - * this function returns successfully. If the client application needs to - * test for succesful delivery of QoS1 and QoS2 messages, this can be done - * either asynchronously or synchronously (see @ref async, - * ::MQTTClient_waitForCompletion and MQTTClient_deliveryComplete()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topicName The topic associated with this message. - * @param msg A pointer to a valid MQTTClient_message structure containing - * the payload and attributes of the message to be published. - * @param dt A pointer to an ::MQTTClient_deliveryToken. This is populated - * with a token representing the message when the function returns - * successfully. If your application does not use delivery tokens, set this - * argument to NULL. - * @return the MQTT 5.0 response information: error codes and properties. - */ -LIBMQTT_API MQTTResponse MQTTClient_publishMessage5(MQTTClient handle, const char* topicName, MQTTClient_message* msg, - MQTTClient_deliveryToken* dt); - -/** - * This function is called by the client application to synchronize execution - * of the main thread with completed publication of a message. When called, - * MQTTClient_waitForCompletion() blocks execution until the message has been - * successful delivered or the specified timeout has expired. See @ref async. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param dt The ::MQTTClient_deliveryToken that represents the message being - * tested for successful delivery. Delivery tokens are issued by the - * publishing functions MQTTClient_publish() and MQTTClient_publishMessage(). - * @param timeout The maximum time to wait in milliseconds. - * @return ::MQTTCLIENT_SUCCESS if the message was successfully delivered. - * An error code is returned if the timeout expires or there was a problem - * checking the token. - */ -LIBMQTT_API int MQTTClient_waitForCompletion(MQTTClient handle, MQTTClient_deliveryToken dt, unsigned long timeout); - - -/** - * This function sets a pointer to an array of delivery tokens for - * messages that are currently in-flight (pending completion). - * - * Important note: The memory used to hold the array of tokens is - * malloc()'d in this function. The client application is responsible for - * freeing this memory when it is no longer required. - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param tokens The address of a pointer to an ::MQTTClient_deliveryToken. - * When the function returns successfully, the pointer is set to point to an - * array of tokens representing messages pending completion. The last member of - * the array is set to -1 to indicate there are no more tokens. If no tokens - * are pending, the pointer is set to NULL. - * @return ::MQTTCLIENT_SUCCESS if the function returns successfully. - * An error code is returned if there was a problem obtaining the list of - * pending tokens. - */ -LIBMQTT_API int MQTTClient_getPendingDeliveryTokens(MQTTClient handle, MQTTClient_deliveryToken **tokens); - -/** - * When implementing a single-threaded client, call this function periodically - * to allow processing of message retries and to send MQTT keepalive pings. - * If the application is calling MQTTClient_receive() regularly, then it is - * not necessary to call this function. - */ -LIBMQTT_API void MQTTClient_yield(void); - -/** - * This function performs a synchronous receive of incoming messages. It should - * be used only when the client application has not set callback methods to - * support asynchronous receipt of messages (see @ref async and - * MQTTClient_setCallbacks()). Using this function allows a single-threaded - * client subscriber application to be written. When called, this function - * blocks until the next message arrives or the specified timeout expires - *(see also MQTTClient_yield()). - * - * Important note: The application must free() the memory allocated - * to the topic and the message when processing is complete (see - * MQTTClient_freeMessage()). - * @param handle A valid client handle from a successful call to - * MQTTClient_create(). - * @param topicName The address of a pointer to a topic. This function - * allocates the memory for the topic and returns it to the application - * by setting topicName to point to the topic. - * @param topicLen The length of the topic. If the return code from this - * function is ::MQTTCLIENT_TOPICNAME_TRUNCATED, the topic contains embedded - * NULL characters and the full topic should be retrieved by using - * topicLen. - * @param message The address of a pointer to the received message. This - * function allocates the memory for the message and returns it to the - * application by setting message to point to the received message. - * The pointer is set to NULL if the timeout expires. - * @param timeout The length of time to wait for a message in milliseconds. - * @return ::MQTTCLIENT_SUCCESS or ::MQTTCLIENT_TOPICNAME_TRUNCATED if a - * message is received. ::MQTTCLIENT_SUCCESS can also indicate that the - * timeout expired, in which case message is NULL. An error code is - * returned if there was a problem trying to receive a message. - */ -LIBMQTT_API int MQTTClient_receive(MQTTClient handle, char** topicName, int* topicLen, MQTTClient_message** message, - unsigned long timeout); - -/** - * This function frees memory allocated to an MQTT message, including the - * additional memory allocated to the message payload. The client application - * calls this function when the message has been fully processed. Important - * note: This function does not free the memory allocated to a message - * topic string. It is the responsibility of the client application to free - * this memory using the MQTTClient_free() library function. - * @param msg The address of a pointer to the ::MQTTClient_message structure - * to be freed. - */ -LIBMQTT_API void MQTTClient_freeMessage(MQTTClient_message** msg); - -/** - * This function frees memory allocated by the MQTT C client library, especially the - * topic name. This is needed on Windows when the client libary and application - * program have been compiled with different versions of the C compiler. It is - * thus good policy to always use this function when freeing any MQTT C client- - * allocated memory. - * @param ptr The pointer to the client library storage to be freed. - */ -LIBMQTT_API void MQTTClient_free(void* ptr); - -/** - * This function frees the memory allocated to an MQTT client (see - * MQTTClient_create()). It should be called when the client is no longer - * required. - * @param handle A pointer to the handle referring to the ::MQTTClient - * structure to be freed. - */ -LIBMQTT_API void MQTTClient_destroy(MQTTClient* handle); - - -enum MQTTCLIENT_TRACE_LEVELS -{ - MQTTCLIENT_TRACE_MAXIMUM = 1, - MQTTCLIENT_TRACE_MEDIUM, - MQTTCLIENT_TRACE_MINIMUM, - MQTTCLIENT_TRACE_PROTOCOL, - MQTTCLIENT_TRACE_ERROR, - MQTTCLIENT_TRACE_SEVERE, - MQTTCLIENT_TRACE_FATAL, -}; - - -/** - * This function sets the level of trace information which will be - * returned in the trace callback. - * @param level the trace level required - */ -LIBMQTT_API void MQTTClient_setTraceLevel(enum MQTTCLIENT_TRACE_LEVELS level); - - -/** - * This is a callback function prototype which must be implemented if you want - * to receive trace information. Do not invoke any other Paho API calls in this - * callback function - unpredictable behavior may result. - * @param level the trace level of the message returned - * @param message the trace message. This is a pointer to a static buffer which - * will be overwritten on each call. You must copy the data if you want to keep - * it for later. - */ -typedef void MQTTClient_traceCallback(enum MQTTCLIENT_TRACE_LEVELS level, char* message); - -/** - * This function sets the trace callback if needed. If set to NULL, - * no trace information will be returned. The default trace level is - * MQTTASYNC_TRACE_MINIMUM. - * @param callback a pointer to the function which will handle the trace information - */ -LIBMQTT_API void MQTTClient_setTraceCallback(MQTTClient_traceCallback* callback); - -/** - * Sets the timeout value for un/subscribe commands when waiting for the un/suback response from - * the server. Values less than 5000 are not allowed. - * @param handle A valid client handle from a successful call to MQTTClient_create(). - * @param milliSeconds the maximum number of milliseconds to wait - * @return MQTTCLIENT_SUCCESS or MQTTCLIENT_FAILURE - */ -LIBMQTT_API int MQTTClient_setCommandTimeout(MQTTClient handle, unsigned long milliSeconds); - -/** - * Returns a pointer to the string representation of the error or NULL. - * - * Do not free after use. Returns NULL if the error code is unknown. - */ -LIBMQTT_API const char* MQTTClient_strerror(int code); - -#if defined(__cplusplus) - } -#endif - -#endif - -/*! - * @cond MQTTClient_main - * @page async Asynchronous vs synchronous client applications - * This client library supports two modes of operation. These are referred to - * as synchronous and asynchronous modes. If your application - * calls MQTTClient_setCallbacks(), this puts the client into asynchronous - * mode, otherwise it operates in synchronous mode. - * - * In synchronous mode, the client application runs on a single thread. - * Messages are published using the MQTTClient_publish() and - * MQTTClient_publishMessage() functions. To determine that a QoS1 or QoS2 - * (see @ref qos) message has been successfully delivered, the application - * must call the MQTTClient_waitForCompletion() function. An example showing - * synchronous publication is shown in @ref pubsync. Receiving messages in - * synchronous mode uses the MQTTClient_receive() function. Client applications - * must call either MQTTClient_receive() or MQTTClient_yield() relatively - * frequently in order to allow processing of acknowledgements and the MQTT - * "pings" that keep the network connection to the server alive. - * - * In asynchronous mode, the client application runs on several threads. The - * main program calls functions in the client library to publish and subscribe, - * just as for the synchronous mode. Processing of handshaking and maintaining - * the network connection is performed in the background, however. - * Notifications of status and message reception are provided to the client - * application using callbacks registered with the library by the call to - * MQTTClient_setCallbacks() (see MQTTClient_messageArrived(), - * MQTTClient_connectionLost() and MQTTClient_deliveryComplete()). - * This API is not thread safe however - it is not possible to call it from multiple - * threads without synchronization. You can use the MQTTAsync API for that. - * - * @page callbacks Callbacks - * You must not call a function from this API from within a callback otherwise - * a deadlock might result. The only exception to this is the ability to call - * connect within the connection lost callback, to allow a reconnect. - * - * When using MQTT 5.0, you can also call connect from within the disconnected - * callback, which is invoked when the MQTT server sends a disconnect packet. - * This server behaviour is allowed in MQTT 5.0, but not in MQTT 3.1.1, so the - * disconnected callback will never be invoked if you use MQTT 3.1.1. - * - * In particular, you must make a publish call within the message arrived callback. - * These restrictions are all lifted in the - * MQTTAsync API. - * - * If no callbacks are assigned, this will include the message arrived callback. - * This could be done if the application is a pure publisher, and does - * not subscribe to any topics. If however messages are received, and no message - * arrived callback is set, or receive not called, then those messages will accumulate - * and take up memory, as there is no place for them to be delivered. - * It is up to the application to protect against this situation. - * - * @page wildcard Subscription wildcards - * Every MQTT message includes a topic that classifies it. MQTT servers use - * topics to determine which subscribers should receive messages published to - * the server. - * - * Consider the server receiving messages from several environmental sensors. - * Each sensor publishes its measurement data as a message with an associated - * topic. Subscribing applications need to know which sensor originally - * published each received message. A unique topic is thus used to identify - * each sensor and measurement type. Topics such as SENSOR1TEMP, - * SENSOR1HUMIDITY, SENSOR2TEMP and so on achieve this but are not very - * flexible. If additional sensors are added to the system at a later date, - * subscribing applications must be modified to receive them. - * - * To provide more flexibility, MQTT supports a hierarchical topic namespace. - * This allows application designers to organize topics to simplify their - * management. Levels in the hierarchy are delimited by the '/' character, - * such as SENSOR/1/HUMIDITY. Publishers and subscribers use these - * hierarchical topics as already described. - * - * For subscriptions, two wildcard characters are supported: - *
    - *
  • A '#' character represents a complete sub-tree of the hierarchy and - * thus must be the last character in a subscription topic string, such as - * SENSOR/#. This will match any topic starting with SENSOR/, such as - * SENSOR/1/TEMP and SENSOR/2/HUMIDITY.
  • - *
  • A '+' character represents a single level of the hierarchy and is - * used between delimiters. For example, SENSOR/+/TEMP will match - * SENSOR/1/TEMP and SENSOR/2/TEMP.
  • - *
- * Publishers are not allowed to use the wildcard characters in their topic - * names. - * - * Deciding on your topic hierarchy is an important step in your system design. - * - * @page qos Quality of service - * The MQTT protocol provides three qualities of service for delivering - * messages between clients and servers: "at most once", "at least once" and - * "exactly once". - * - * Quality of service (QoS) is an attribute of an individual message being - * published. An application sets the QoS for a specific message by setting the - * MQTTClient_message.qos field to the required value. - * - * A subscribing client can set the maximum quality of service a server uses - * to send messages that match the client subscriptions. The - * MQTTClient_subscribe() and MQTTClient_subscribeMany() functions set this - * maximum. The QoS of a message forwarded to a subscriber thus might be - * different to the QoS given to the message by the original publisher. - * The lower of the two values is used to forward a message. - * - * The three levels are: - * - * QoS0, At most once: The message is delivered at most once, or it - * may not be delivered at all. Its delivery across the network is not - * acknowledged. The message is not stored. The message could be lost if the - * client is disconnected, or if the server fails. QoS0 is the fastest mode of - * transfer. It is sometimes called "fire and forget". - * - * The MQTT protocol does not require servers to forward publications at QoS0 - * to a client. If the client is disconnected at the time the server receives - * the publication, the publication might be discarded, depending on the - * server implementation. - * - * QoS1, At least once: The message is always delivered at least once. - * It might be delivered multiple times if there is a failure before an - * acknowledgment is received by the sender. The message must be stored - * locally at the sender, until the sender receives confirmation that the - * message has been published by the receiver. The message is stored in case - * the message must be sent again. - * - * QoS2, Exactly once: The message is always delivered exactly once. - * The message must be stored locally at the sender, until the sender receives - * confirmation that the message has been published by the receiver. The - * message is stored in case the message must be sent again. QoS2 is the - * safest, but slowest mode of transfer. A more sophisticated handshaking - * and acknowledgement sequence is used than for QoS1 to ensure no duplication - * of messages occurs. - * @page pubsync Synchronous publication example -@code -#include -#include -#include -#include "MQTTClient.h" - -#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883" -#define CLIENTID "ExampleClientPub" -#define TOPIC "MQTT Examples" -#define PAYLOAD "Hello World!" -#define QOS 1 -#define TIMEOUT 10000L - -int main(int argc, char* argv[]) -{ - MQTTClient client; - MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; - MQTTClient_message pubmsg = MQTTClient_message_initializer; - MQTTClient_deliveryToken token; - int rc; - - if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID, - MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to create client, return code %d\n", rc); - exit(EXIT_FAILURE); - } - - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to connect, return code %d\n", rc); - exit(EXIT_FAILURE); - } - - pubmsg.payload = PAYLOAD; - pubmsg.payloadlen = (int)strlen(PAYLOAD); - pubmsg.qos = QOS; - pubmsg.retained = 0; - if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to publish message, return code %d\n", rc); - exit(EXIT_FAILURE); - } - - printf("Waiting for up to %d seconds for publication of %s\n" - "on topic %s for client with ClientID: %s\n", - (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID); - rc = MQTTClient_waitForCompletion(client, token, TIMEOUT); - printf("Message with delivery token %d delivered\n", token); - - if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS) - printf("Failed to disconnect, return code %d\n", rc); - MQTTClient_destroy(&client); - return rc; -} - - * @endcode - * - * @page pubasync Asynchronous publication example -@code{.c} -#include -#include -#include -#include "MQTTClient.h" - -#if !defined(_WIN32) -#include -#else -#include -#endif - -#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883" -#define CLIENTID "ExampleClientPub" -#define TOPIC "MQTT Examples" -#define PAYLOAD "Hello World!" -#define QOS 1 -#define TIMEOUT 10000L - -MQTTClient_deliveryToken deliveredtoken; - -void delivered(void *context, MQTTClient_deliveryToken dt) -{ - printf("Message with token value %d delivery confirmed\n", dt); - deliveredtoken = dt; -} - -int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) -{ - printf("Message arrived\n"); - printf(" topic: %s\n", topicName); - printf(" message: %.*s\n", message->payloadlen, (char*)message->payload); - MQTTClient_freeMessage(&message); - MQTTClient_free(topicName); - return 1; -} - -void connlost(void *context, char *cause) -{ - printf("\nConnection lost\n"); - printf(" cause: %s\n", cause); -} - -int main(int argc, char* argv[]) -{ - MQTTClient client; - MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; - MQTTClient_message pubmsg = MQTTClient_message_initializer; - MQTTClient_deliveryToken token; - int rc; - - if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID, - MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to create client, return code %d\n", rc); - rc = EXIT_FAILURE; - goto exit; - } - - if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to set callbacks, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to connect, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - - pubmsg.payload = PAYLOAD; - pubmsg.payloadlen = (int)strlen(PAYLOAD); - pubmsg.qos = QOS; - pubmsg.retained = 0; - deliveredtoken = 0; - if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to publish message, return code %d\n", rc); - rc = EXIT_FAILURE; - } - else - { - printf("Waiting for publication of %s\n" - "on topic %s for client with ClientID: %s\n", - PAYLOAD, TOPIC, CLIENTID); - while (deliveredtoken != token) - { - #if defined(_WIN32) - Sleep(100); - #else - usleep(10000L); - #endif - } - } - - if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to disconnect, return code %d\n", rc); - rc = EXIT_FAILURE; - } - -destroy_exit: - MQTTClient_destroy(&client); - -exit: - return rc; -} - - * @endcode - * @page subasync Asynchronous subscription example -@code -#include -#include -#include -#include "MQTTClient.h" - -#define ADDRESS "tcp://mqtt.eclipseprojects.io:1883" -#define CLIENTID "ExampleClientSub" -#define TOPIC "MQTT Examples" -#define PAYLOAD "Hello World!" -#define QOS 1 -#define TIMEOUT 10000L - -volatile MQTTClient_deliveryToken deliveredtoken; - -void delivered(void *context, MQTTClient_deliveryToken dt) -{ - printf("Message with token value %d delivery confirmed\n", dt); - deliveredtoken = dt; -} - -int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message) -{ - printf("Message arrived\n"); - printf(" topic: %s\n", topicName); - printf(" message: %.*s\n", message->payloadlen, (char*)message->payload); - MQTTClient_freeMessage(&message); - MQTTClient_free(topicName); - return 1; -} - -void connlost(void *context, char *cause) -{ - printf("\nConnection lost\n"); - printf(" cause: %s\n", cause); -} - -int main(int argc, char* argv[]) -{ - MQTTClient client; - MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer; - int rc; - - if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID, - MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to create client, return code %d\n", rc); - rc = EXIT_FAILURE; - goto exit; - } - - if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to set callbacks, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - - conn_opts.keepAliveInterval = 20; - conn_opts.cleansession = 1; - if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to connect, return code %d\n", rc); - rc = EXIT_FAILURE; - goto destroy_exit; - } - - printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n" - "Press Q to quit\n\n", TOPIC, CLIENTID, QOS); - if ((rc = MQTTClient_subscribe(client, TOPIC, QOS)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to subscribe, return code %d\n", rc); - rc = EXIT_FAILURE; - } - else - { - int ch; - do - { - ch = getchar(); - } while (ch!='Q' && ch != 'q'); - - if ((rc = MQTTClient_unsubscribe(client, TOPIC)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to unsubscribe, return code %d\n", rc); - rc = EXIT_FAILURE; - } - } - - if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS) - { - printf("Failed to disconnect, return code %d\n", rc); - rc = EXIT_FAILURE; - } -destroy_exit: - MQTTClient_destroy(&client); -exit: - return rc; -} - - * @endcode - * @page tracing Tracing - * - * Runtime tracing is controlled by environment variables. - * - * Tracing is switched on by setting MQTT_C_CLIENT_TRACE. A value of ON, or stdout, prints to - * stdout, any other value is interpreted as a file name to use. - * - * The amount of trace detail is controlled with the MQTT_C_CLIENT_TRACE_LEVEL environment - * variable - valid values are ERROR, PROTOCOL, MINIMUM, MEDIUM and MAXIMUM - * (from least to most verbose). - * - * The variable MQTT_C_CLIENT_TRACE_MAX_LINES limits the number of lines of trace that are output - * to a file. Two files are used at most, when they are full, the last one is overwritten with the - * new trace entries. The default size is 1000 lines. - * - * ### MQTT Packet Tracing - * - * A feature that can be very useful is printing the MQTT packets that are sent and received. To - * achieve this, use the following environment variable settings: - * @code - MQTT_C_CLIENT_TRACE=ON - MQTT_C_CLIENT_TRACE_LEVEL=PROTOCOL - * @endcode - * The output you should see looks like this: - * @code - 20130528 155936.813 3 stdout-subscriber -> CONNECT cleansession: 1 (0) - 20130528 155936.813 3 stdout-subscriber <- CONNACK rc: 0 - 20130528 155936.813 3 stdout-subscriber -> SUBSCRIBE msgid: 1 (0) - 20130528 155936.813 3 stdout-subscriber <- SUBACK msgid: 1 - 20130528 155941.818 3 stdout-subscriber -> DISCONNECT (0) - * @endcode - * where the fields are: - * 1. date - * 2. time - * 3. socket number - * 4. client id - * 5. direction (-> from client to server, <- from server to client) - * 6. packet details - * - * ### Default Level Tracing - * - * This is an extract of a default level trace of a call to connect: - * @code - 19700101 010000.000 (1152206656) (0)> MQTTClient_connect:893 - 19700101 010000.000 (1152206656) (1)> MQTTClient_connectURI:716 - 20130528 160447.479 Connecting to serverURI localhost:1883 - 20130528 160447.479 (1152206656) (2)> MQTTProtocol_connect:98 - 20130528 160447.479 (1152206656) (3)> MQTTProtocol_addressPort:48 - 20130528 160447.479 (1152206656) (3)< MQTTProtocol_addressPort:73 - 20130528 160447.479 (1152206656) (3)> Socket_new:599 - 20130528 160447.479 New socket 4 for localhost, port 1883 - 20130528 160447.479 (1152206656) (4)> Socket_addSocket:163 - 20130528 160447.479 (1152206656) (5)> Socket_setnonblocking:73 - 20130528 160447.479 (1152206656) (5)< Socket_setnonblocking:78 (0) - 20130528 160447.479 (1152206656) (4)< Socket_addSocket:176 (0) - 20130528 160447.479 (1152206656) (4)> Socket_error:95 - 20130528 160447.479 (1152206656) (4)< Socket_error:104 (115) - 20130528 160447.479 Connect pending - 20130528 160447.479 (1152206656) (3)< Socket_new:683 (115) - 20130528 160447.479 (1152206656) (2)< MQTTProtocol_connect:131 (115) - * @endcode - * where the fields are: - * 1. date - * 2. time - * 3. thread id - * 4. function nesting level - * 5. function entry (>) or exit (<) - * 6. function name : line of source code file - * 7. return value (if there is one) - * - * ### Memory Allocation Tracing - * - * Setting the trace level to maximum causes memory allocations and frees to be traced along with - * the default trace entries, with messages like the following: - * @code - 20130528 161819.657 Allocating 16 bytes in heap at file /home/icraggs/workspaces/mqrtc/mqttv3c/src/MQTTPacket.c line 177 ptr 0x179f930 - - 20130528 161819.657 Freeing 16 bytes in heap at file /home/icraggs/workspaces/mqrtc/mqttv3c/src/MQTTPacket.c line 201, heap use now 896 bytes - * @endcode - * When the last MQTT client object is destroyed, if the trace is being recorded - * and all memory allocated by the client library has not been freed, an error message will be - * written to the trace. This can help with fixing memory leaks. The message will look like this: - * @code - 20130528 163909.208 Some memory not freed at shutdown, possible memory leak - 20130528 163909.208 Heap scan start, total 880 bytes - 20130528 163909.208 Heap element size 32, line 354, file /home/icraggs/workspaces/mqrtc/mqttv3c/src/MQTTPacket.c, ptr 0x260cb00 - 20130528 163909.208 Content - 20130528 163909.209 Heap scan end - * @endcode - * @endcond - */ diff --git a/include/paho-mqtt/MQTTClientPersistence.h b/include/paho-mqtt/MQTTClientPersistence.h deleted file mode 100644 index d3caae4..0000000 --- a/include/paho-mqtt/MQTTClientPersistence.h +++ /dev/null @@ -1,277 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2020 IBM Corp. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial API and implementation and/or initial documentation - *******************************************************************************/ - -/** - * @file - * \brief This structure represents a persistent data store, used to store - * outbound and inbound messages, in order to achieve reliable messaging. - * - * The MQTT Client persists QoS1 and QoS2 messages in order to meet the - * assurances of delivery associated with these @ref qos levels. The messages - * are saved in persistent storage - * The type and context of the persistence implementation are specified when - * the MQTT client is created (see MQTTClient_create()). The default - * persistence type (::MQTTCLIENT_PERSISTENCE_DEFAULT) uses a file system-based - * persistence mechanism. The persistence_context argument passed to - * MQTTClient_create() when using the default peristence is a string - * representing the location of the persistence directory. If the context - * argument is NULL, the working directory will be used. - * - * To use memory-based persistence, an application passes - * ::MQTTCLIENT_PERSISTENCE_NONE as the persistence_type to - * MQTTClient_create(). This can lead to message loss in certain situations, - * but can be appropriate in some cases (see @ref qos). - * - * Client applications can provide their own persistence mechanism by passing - * ::MQTTCLIENT_PERSISTENCE_USER as the persistence_type. To implement a - * custom persistence mechanism, the application must pass an initialized - * ::MQTTClient_persistence structure as the persistence_context - * argument to MQTTClient_create(). - * - * If the functions defined return an ::MQTTCLIENT_PERSISTENCE_ERROR then the - * state of the persisted data should remain as it was prior to the function - * being called. For example, if Persistence_put() returns - * ::MQTTCLIENT_PERSISTENCE_ERROR, then it is assumed tha tthe persistent store - * does not contain the data that was passed to the function. Similarly, if - * Persistence_remove() returns ::MQTTCLIENT_PERSISTENCE_ERROR then it is - * assumed that the data to be removed is still held in the persistent store. - * - * It is up to the persistence implementation to log any error information that - * may be required to diagnose a persistence mechanism failure. - */ - -/* -/// @cond EXCLUDE -*/ -#if !defined(MQTTCLIENTPERSISTENCE_H) -#define MQTTCLIENTPERSISTENCE_H -/* -/// @endcond -*/ - -/** - * This persistence_type value specifies the default file system-based - * persistence mechanism (see MQTTClient_create()). - */ -#define MQTTCLIENT_PERSISTENCE_DEFAULT 0 -/** - * This persistence_type value specifies a memory-based - * persistence mechanism (see MQTTClient_create()). - */ -#define MQTTCLIENT_PERSISTENCE_NONE 1 -/** - * This persistence_type value specifies an application-specific - * persistence mechanism (see MQTTClient_create()). - */ -#define MQTTCLIENT_PERSISTENCE_USER 2 - -/** - * Application-specific persistence functions must return this error code if - * there is a problem executing the function. - */ -#define MQTTCLIENT_PERSISTENCE_ERROR -2 - -/** - * @brief Initialize the persistent store. - * - * Either open the existing persistent store for this client ID or create a new - * one if one doesn't exist. If the persistent store is already open, return - * without taking any action. - * - * An application can use the same client identifier to connect to many - * different servers. The clientid in conjunction with the - * serverURI uniquely identifies the persistence store required. - * - * @param handle The address of a pointer to a handle for this persistence - * implementation. This function must set handle to a valid reference to the - * persistence following a successful return. - * The handle pointer is passed as an argument to all the other - * persistence functions. It may include the context parameter and/or any other - * data for use by the persistence functions. - * @param clientID The client identifier for which the persistent store should - * be opened. - * @param serverURI The connection string specified when the MQTT client was - * created (see MQTTClient_create()). - * @param context A pointer to any data required to initialize the persistent - * store (see ::MQTTClient_persistence). - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_open)(void** handle, const char* clientID, const char* serverURI, void* context); - -/** - * @brief Close the persistent store referred to by the handle. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_close)(void* handle); - -/** - * @brief Put the specified data into the persistent store. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @param key A string used as the key for the data to be put in the store. The - * key is later used to retrieve data from the store with Persistence_get(). - * @param bufcount The number of buffers to write to the persistence store. - * @param buffers An array of pointers to the data buffers associated with - * this key. - * @param buflens An array of lengths of the data buffers. buflen[n] - * gives the length of buffer[n]. - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_put)(void* handle, char* key, int bufcount, char* buffers[], int buflens[]); - -/** - * @brief Retrieve the specified data from the persistent store. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @param key A string that is the key for the data to be retrieved. This is - * the same key used to save the data to the store with Persistence_put(). - * @param buffer The address of a pointer to a buffer. This function sets the - * pointer to point at the retrieved data, if successful. - * @param buflen The address of an int that is set to the length of - * buffer by this function if successful. - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_get)(void* handle, char* key, char** buffer, int* buflen); - -/** - * @brief Remove the data for the specified key from the store. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @param key A string that is the key for the data to be removed from the - * store. This is the same key used to save the data to the store with - * Persistence_put(). - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_remove)(void* handle, char* key); - -/** - * @brief Returns the keys in this persistent data store. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @param keys The address of a pointer to pointers to strings. Assuming - * successful execution, this function allocates memory to hold the returned - * keys (strings used to store the data with Persistence_put()). It also - * allocates memory to hold an array of pointers to these strings. keys - * is set to point to the array of pointers to strings. - * @param nkeys A pointer to the number of keys in this persistent data store. - * This function sets the number of keys, if successful. - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_keys)(void* handle, char*** keys, int* nkeys); - -/** - * @brief Clears the persistence store, so that it no longer contains any - * persisted data. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @return Return 0 if the function completes successfully, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_clear)(void* handle); - -/** - * @brief Returns whether any data has been persisted using the specified key. - * - * @param handle The handle pointer from a successful call to - * Persistence_open(). - * @param key The string to be tested for existence in the store. - * @return Return 0 if the key was found in the store, otherwise return - * ::MQTTCLIENT_PERSISTENCE_ERROR. - */ -typedef int (*Persistence_containskey)(void* handle, char* key); - -/** - * @brief A structure containing the function pointers to a persistence - * implementation and the context or state that will be shared across all - * the persistence functions. - */ -typedef struct { - /** - * A pointer to any data required to initialize the persistent store. - */ - void* context; - /** - * A function pointer to an implementation of Persistence_open(). - */ - Persistence_open popen; - /** - * A function pointer to an implementation of Persistence_close(). - */ - Persistence_close pclose; - /** - * A function pointer to an implementation of Persistence_put(). - */ - Persistence_put pput; - /** - * A function pointer to an implementation of Persistence_get(). - */ - Persistence_get pget; - /** - * A function pointer to an implementation of Persistence_remove(). - */ - Persistence_remove premove; - /** - * A function pointer to an implementation of Persistence_keys(). - */ - Persistence_keys pkeys; - /** - * A function pointer to an implementation of Persistence_clear(). - */ - Persistence_clear pclear; - /** - * A function pointer to an implementation of Persistence_containskey(). - */ - Persistence_containskey pcontainskey; -} MQTTClient_persistence; - - -/** - * A callback which is invoked just before a write to persistence. This can be - * used to transform the data, for instance to encrypt it. - * @param context The context as set in ::MQTTAsync_setBeforePersistenceWrite - * @param bufcount The number of buffers to write to the persistence store. - * @param buffers An array of pointers to the data buffers. - * @param buflens An array of lengths of the data buffers. - * @return Return 0 if the function completes successfully, otherwise non 0. - */ -typedef int MQTTPersistence_beforeWrite(void* context, int bufcount, char* buffers[], int buflens[]); - - -/** - * A callback which is invoked just after a read from persistence. This can be - * used to transform the data, for instance to decrypt it. - * @param context The context as set in ::MQTTAsync_setAfterPersistenceRead - * @param buffer The address of a pointer to a buffer. - * @param buflen The address of an int that is the length of the buffer. - * @return Return 0 if the function completes successfully, otherwise non 0. - */ -typedef int MQTTPersistence_afterRead(void* context, char** buffer, int* buflen); - -#endif diff --git a/include/paho-mqtt/MQTTExportDeclarations.h b/include/paho-mqtt/MQTTExportDeclarations.h deleted file mode 100644 index d492ef1..0000000 --- a/include/paho-mqtt/MQTTExportDeclarations.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2020, 2020 Andreas Walter - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Andreas Walter - initially moved export declarations into separate fle - *******************************************************************************/ - -#if !defined(EXPORTDECLARATIONS_H) -#define EXPORTDECLARATIONS_H - -#if defined(_WIN32) || defined(_WIN64) -# if defined(PAHO_MQTT_EXPORTS) -# define LIBMQTT_API __declspec(dllexport) -# elif defined(PAHO_MQTT_IMPORTS) -# define LIBMQTT_API __declspec(dllimport) -# else -# define LIBMQTT_API -# endif -#else -# if defined(PAHO_MQTT_EXPORTS) -# define LIBMQTT_API __attribute__ ((visibility ("default"))) -# else -# define LIBMQTT_API extern -# endif -#endif - -#endif diff --git a/include/paho-mqtt/MQTTProperties.h b/include/paho-mqtt/MQTTProperties.h deleted file mode 100644 index 81b8e3a..0000000 --- a/include/paho-mqtt/MQTTProperties.h +++ /dev/null @@ -1,219 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017, 2020 IBM Corp. and others - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial API and implementation and/or initial documentation - *******************************************************************************/ - -#if !defined(MQTTPROPERTIES_H) -#define MQTTPROPERTIES_H - -#include "MQTTExportDeclarations.h" - -#define MQTT_INVALID_PROPERTY_ID -2 - -/** The one byte MQTT V5 property indicator */ -enum MQTTPropertyCodes { - MQTTPROPERTY_CODE_PAYLOAD_FORMAT_INDICATOR = 1, /**< The value is 1 */ - MQTTPROPERTY_CODE_MESSAGE_EXPIRY_INTERVAL = 2, /**< The value is 2 */ - MQTTPROPERTY_CODE_CONTENT_TYPE = 3, /**< The value is 3 */ - MQTTPROPERTY_CODE_RESPONSE_TOPIC = 8, /**< The value is 8 */ - MQTTPROPERTY_CODE_CORRELATION_DATA = 9, /**< The value is 9 */ - MQTTPROPERTY_CODE_SUBSCRIPTION_IDENTIFIER = 11, /**< The value is 11 */ - MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL = 17, /**< The value is 17 */ - MQTTPROPERTY_CODE_ASSIGNED_CLIENT_IDENTIFER = 18,/**< The value is 18 */ - MQTTPROPERTY_CODE_SERVER_KEEP_ALIVE = 19, /**< The value is 19 */ - MQTTPROPERTY_CODE_AUTHENTICATION_METHOD = 21, /**< The value is 21 */ - MQTTPROPERTY_CODE_AUTHENTICATION_DATA = 22, /**< The value is 22 */ - MQTTPROPERTY_CODE_REQUEST_PROBLEM_INFORMATION = 23,/**< The value is 23 */ - MQTTPROPERTY_CODE_WILL_DELAY_INTERVAL = 24, /**< The value is 24 */ - MQTTPROPERTY_CODE_REQUEST_RESPONSE_INFORMATION = 25,/**< The value is 25 */ - MQTTPROPERTY_CODE_RESPONSE_INFORMATION = 26, /**< The value is 26 */ - MQTTPROPERTY_CODE_SERVER_REFERENCE = 28, /**< The value is 28 */ - MQTTPROPERTY_CODE_REASON_STRING = 31, /**< The value is 31 */ - MQTTPROPERTY_CODE_RECEIVE_MAXIMUM = 33, /**< The value is 33*/ - MQTTPROPERTY_CODE_TOPIC_ALIAS_MAXIMUM = 34, /**< The value is 34 */ - MQTTPROPERTY_CODE_TOPIC_ALIAS = 35, /**< The value is 35 */ - MQTTPROPERTY_CODE_MAXIMUM_QOS = 36, /**< The value is 36 */ - MQTTPROPERTY_CODE_RETAIN_AVAILABLE = 37, /**< The value is 37 */ - MQTTPROPERTY_CODE_USER_PROPERTY = 38, /**< The value is 38 */ - MQTTPROPERTY_CODE_MAXIMUM_PACKET_SIZE = 39, /**< The value is 39 */ - MQTTPROPERTY_CODE_WILDCARD_SUBSCRIPTION_AVAILABLE = 40,/**< The value is 40 */ - MQTTPROPERTY_CODE_SUBSCRIPTION_IDENTIFIERS_AVAILABLE = 41,/**< The value is 41 */ - MQTTPROPERTY_CODE_SHARED_SUBSCRIPTION_AVAILABLE = 42/**< The value is 241 */ -}; - -/** - * Returns a printable string description of an MQTT V5 property code. - * @param value an MQTT V5 property code. - * @return the printable string description of the input property code. - * NULL if the code was not found. - */ -LIBMQTT_API const char* MQTTPropertyName(enum MQTTPropertyCodes value); - -/** The one byte MQTT V5 property type */ -enum MQTTPropertyTypes { - MQTTPROPERTY_TYPE_BYTE, - MQTTPROPERTY_TYPE_TWO_BYTE_INTEGER, - MQTTPROPERTY_TYPE_FOUR_BYTE_INTEGER, - MQTTPROPERTY_TYPE_VARIABLE_BYTE_INTEGER, - MQTTPROPERTY_TYPE_BINARY_DATA, - MQTTPROPERTY_TYPE_UTF_8_ENCODED_STRING, - MQTTPROPERTY_TYPE_UTF_8_STRING_PAIR -}; - -/** - * Returns the MQTT V5 type code of an MQTT V5 property. - * @param value an MQTT V5 property code. - * @return the MQTT V5 type code of the input property. -1 if the code was not found. - */ -LIBMQTT_API int MQTTProperty_getType(enum MQTTPropertyCodes value); - -/** - * The data for a length delimited string - */ -typedef struct -{ - int len; /**< the length of the string */ - char* data; /**< pointer to the string data */ -} MQTTLenString; - - -/** - * Structure to hold an MQTT version 5 property of any type - */ -typedef struct -{ - enum MQTTPropertyCodes identifier; /**< The MQTT V5 property id. A multi-byte integer. */ - /** The value of the property, as a union of the different possible types. */ - union { - unsigned char byte; /**< holds the value of a byte property type */ - unsigned short integer2; /**< holds the value of a 2 byte integer property type */ - unsigned int integer4; /**< holds the value of a 4 byte integer property type */ - struct { - MQTTLenString data; /**< The value of a string property, or the name of a user property. */ - MQTTLenString value; /**< The value of a user property. */ - }; - } value; -} MQTTProperty; - -/** - * MQTT version 5 property list - */ -typedef struct MQTTProperties -{ - int count; /**< number of property entries in the array */ - int max_count; /**< max number of properties that the currently allocated array can store */ - int length; /**< mbi: byte length of all properties */ - MQTTProperty *array; /**< array of properties */ -} MQTTProperties; - -#define MQTTProperties_initializer {0, 0, 0, NULL} - -/** - * Returns the length of the properties structure when serialized ready for network transmission. - * @param props an MQTT V5 property structure. - * @return the length in bytes of the properties when serialized. - */ -int MQTTProperties_len(MQTTProperties* props); - -/** - * Add a property pointer to the property array. There is no memory allocation. - * @param props The property list to add the property to. - * @param prop The property to add to the list. - * @return 0 on success, -1 on failure. - */ -LIBMQTT_API int MQTTProperties_add(MQTTProperties* props, const MQTTProperty* prop); - -/** - * Serialize the given property list to a character buffer, e.g. for writing to the network. - * @param pptr pointer to the buffer - move the pointer as we add data - * @param properties pointer to the property list, can be NULL - * @return whether the write succeeded or not: number of bytes written, or < 0 on failure. - */ -int MQTTProperties_write(char** pptr, const MQTTProperties* properties); - -/** - * Reads a property list from a character buffer into an array. - * @param properties pointer to the property list to be filled. Should be initalized but empty. - * @param pptr pointer to the character buffer. - * @param enddata pointer to the end of the character buffer so we don't read beyond. - * @return 1 if the properties were read successfully. - */ -int MQTTProperties_read(MQTTProperties* properties, char** pptr, char* enddata); - -/** - * Free all memory allocated to the property list, including any to individual properties. - * @param properties pointer to the property list. - */ -LIBMQTT_API void MQTTProperties_free(MQTTProperties* properties); - -/** - * Copy the contents of a property list, allocating additional memory if needed. - * @param props pointer to the property list. - * @return the duplicated property list. - */ -LIBMQTT_API MQTTProperties MQTTProperties_copy(const MQTTProperties* props); - -/** - * Checks if property list contains a specific property. - * @param props pointer to the property list. - * @param propid the property id to check for. - * @return 1 if found, 0 if not. - */ -LIBMQTT_API int MQTTProperties_hasProperty(MQTTProperties *props, enum MQTTPropertyCodes propid); - -/** - * Returns the number of instances of a property id. Most properties can exist only once. - * User properties and subscription ids can exist more than once. - * @param props pointer to the property list. - * @param propid the property id to check for. - * @return the number of times found. Can be 0. - */ -LIBMQTT_API int MQTTProperties_propertyCount(MQTTProperties *props, enum MQTTPropertyCodes propid); - -/** - * Returns the integer value of a specific property. The property given must be a numeric type. - * @param props pointer to the property list. - * @param propid the property id to check for. - * @return the integer value of the property. -9999999 on failure. - */ -LIBMQTT_API int MQTTProperties_getNumericValue(MQTTProperties *props, enum MQTTPropertyCodes propid); - -/** - * Returns the integer value of a specific property when it's not the only instance. - * The property given must be a numeric type. - * @param props pointer to the property list. - * @param propid the property id to check for. - * @param index the instance number, starting at 0. - * @return the integer value of the property. -9999999 on failure. - */ -LIBMQTT_API int MQTTProperties_getNumericValueAt(MQTTProperties *props, enum MQTTPropertyCodes propid, int index); - -/** - * Returns a pointer to the property structure for a specific property. - * @param props pointer to the property list. - * @param propid the property id to check for. - * @return the pointer to the property structure if found. NULL if not found. - */ -LIBMQTT_API MQTTProperty* MQTTProperties_getProperty(MQTTProperties *props, enum MQTTPropertyCodes propid); - -/** - * Returns a pointer to the property structure for a specific property when it's not the only instance. - * @param props pointer to the property list. - * @param propid the property id to check for. - * @param index the instance number, starting at 0. - * @return the pointer to the property structure if found. NULL if not found. - */ -LIBMQTT_API MQTTProperty* MQTTProperties_getPropertyAt(MQTTProperties *props, enum MQTTPropertyCodes propid, int index); - -#endif /* MQTTPROPERTIES_H */ diff --git a/include/paho-mqtt/MQTTReasonCodes.h b/include/paho-mqtt/MQTTReasonCodes.h deleted file mode 100644 index 2dc08ea..0000000 --- a/include/paho-mqtt/MQTTReasonCodes.h +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017, 2020 IBM Corp. and others - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial API and implementation and/or initial documentation - *******************************************************************************/ - -#if !defined(MQTTREASONCODES_H) -#define MQTTREASONCODES_H - -#include "MQTTExportDeclarations.h" - -/** The MQTT V5 one byte reason code */ -enum MQTTReasonCodes { - MQTTREASONCODE_SUCCESS = 0, - MQTTREASONCODE_NORMAL_DISCONNECTION = 0, - MQTTREASONCODE_GRANTED_QOS_0 = 0, - MQTTREASONCODE_GRANTED_QOS_1 = 1, - MQTTREASONCODE_GRANTED_QOS_2 = 2, - MQTTREASONCODE_DISCONNECT_WITH_WILL_MESSAGE = 4, - MQTTREASONCODE_NO_MATCHING_SUBSCRIBERS = 16, - MQTTREASONCODE_NO_SUBSCRIPTION_FOUND = 17, - MQTTREASONCODE_CONTINUE_AUTHENTICATION = 24, - MQTTREASONCODE_RE_AUTHENTICATE = 25, - MQTTREASONCODE_UNSPECIFIED_ERROR = 128, - MQTTREASONCODE_MALFORMED_PACKET = 129, - MQTTREASONCODE_PROTOCOL_ERROR = 130, - MQTTREASONCODE_IMPLEMENTATION_SPECIFIC_ERROR = 131, - MQTTREASONCODE_UNSUPPORTED_PROTOCOL_VERSION = 132, - MQTTREASONCODE_CLIENT_IDENTIFIER_NOT_VALID = 133, - MQTTREASONCODE_BAD_USER_NAME_OR_PASSWORD = 134, - MQTTREASONCODE_NOT_AUTHORIZED = 135, - MQTTREASONCODE_SERVER_UNAVAILABLE = 136, - MQTTREASONCODE_SERVER_BUSY = 137, - MQTTREASONCODE_BANNED = 138, - MQTTREASONCODE_SERVER_SHUTTING_DOWN = 139, - MQTTREASONCODE_BAD_AUTHENTICATION_METHOD = 140, - MQTTREASONCODE_KEEP_ALIVE_TIMEOUT = 141, - MQTTREASONCODE_SESSION_TAKEN_OVER = 142, - MQTTREASONCODE_TOPIC_FILTER_INVALID = 143, - MQTTREASONCODE_TOPIC_NAME_INVALID = 144, - MQTTREASONCODE_PACKET_IDENTIFIER_IN_USE = 145, - MQTTREASONCODE_PACKET_IDENTIFIER_NOT_FOUND = 146, - MQTTREASONCODE_RECEIVE_MAXIMUM_EXCEEDED = 147, - MQTTREASONCODE_TOPIC_ALIAS_INVALID = 148, - MQTTREASONCODE_PACKET_TOO_LARGE = 149, - MQTTREASONCODE_MESSAGE_RATE_TOO_HIGH = 150, - MQTTREASONCODE_QUOTA_EXCEEDED = 151, - MQTTREASONCODE_ADMINISTRATIVE_ACTION = 152, - MQTTREASONCODE_PAYLOAD_FORMAT_INVALID = 153, - MQTTREASONCODE_RETAIN_NOT_SUPPORTED = 154, - MQTTREASONCODE_QOS_NOT_SUPPORTED = 155, - MQTTREASONCODE_USE_ANOTHER_SERVER = 156, - MQTTREASONCODE_SERVER_MOVED = 157, - MQTTREASONCODE_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED = 158, - MQTTREASONCODE_CONNECTION_RATE_EXCEEDED = 159, - MQTTREASONCODE_MAXIMUM_CONNECT_TIME = 160, - MQTTREASONCODE_SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED = 161, - MQTTREASONCODE_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED = 162 -}; - -/** - * Returns a printable string description of an MQTT V5 reason code. - * @param value an MQTT V5 reason code. - * @return the printable string description of the input reason code. - * NULL if the code was not found. - */ -LIBMQTT_API const char* MQTTReasonCode_toString(enum MQTTReasonCodes value); - -#endif diff --git a/include/paho-mqtt/MQTTSubscribeOpts.h b/include/paho-mqtt/MQTTSubscribeOpts.h deleted file mode 100644 index 264e4d0..0000000 --- a/include/paho-mqtt/MQTTSubscribeOpts.h +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2018 IBM Corp. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * https://www.eclipse.org/legal/epl-2.0/ - * and the Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Ian Craggs - initial API and implementation and/or initial documentation - *******************************************************************************/ - -#if !defined(SUBOPTS_H) -#define SUBOPTS_H - -/** The MQTT V5 subscribe options, apart from QoS which existed before V5. */ -typedef struct MQTTSubscribe_options -{ - /** The eyecatcher for this structure. Must be MQSO. */ - char struct_id[4]; - /** The version number of this structure. Must be 0. - */ - int struct_version; - /** To not receive our own publications, set to 1. - * 0 is the original MQTT behaviour - all messages matching the subscription are received. - */ - unsigned char noLocal; - /** To keep the retain flag as on the original publish message, set to 1. - * If 0, defaults to the original MQTT behaviour where the retain flag is only set on - * publications sent by a broker if in response to a subscribe request. - */ - unsigned char retainAsPublished; - /** 0 - send retained messages at the time of the subscribe (original MQTT behaviour) - * 1 - send retained messages on subscribe only if the subscription is new - * 2 - do not send retained messages at all - */ - unsigned char retainHandling; -} MQTTSubscribe_options; - -#define MQTTSubscribe_options_initializer { {'M', 'Q', 'S', 'O'}, 0, 0, 0, 0 } - -#endif diff --git a/mqttClient b/mqttClient deleted file mode 100755 index bd6b0e181c260a7394085a9e3f53a2052925dc72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45880 zcmeIb3w&HvwLgB&nK_f0JSVR<>2vy|1)4r+p%e;9)1eb=n~(>zf=tt7(!}OPW>Q*| zQV8`nhDggp>%A35rIPOW+RSjds`oAxYC5WmbR&vxMA7Lm ztn{fvtxxKN|C+Bi^oVVE>DrYX-f%T|^3oy8;MMSQs`Yrj_> z73ip!w|nVku2+OHHx_nwY`$>m!p_zOogLl%+ZSwKe&K=(msTWuDwYTl zC|3mkw5c`gn+!C|VZwBCTDxRg^J89#$|wFuKDBb$@9vI%qxPBie0^5k!I?+DJ+g#2 zl$$if;YEI`$({5x#E3(E?5TW!(I8i^gm8L{?c9VeIfD9t{>d6L3bgU>AAlX z=^_t|$*+zBzhWGC7*dSIhr&hh@4e0)2mi8h;G4&RUoj5+Arv^4JTu3^p9=hlS4gDS zjf4NLao|0m8LM1t9Q<3y!CyEI{!iSavc8I9cVK%QAO$rh41BK#A_PY#ak17i7g$; zRHCnOU3F(qccQU*b7#Vc$G3F#bjOpa=Dt)sE>XusTz6GtV^wlTcS}6kzd6~`*ReTa zq+zWc$(Ek(?nFz<4NN3ceLXu|kYplN-Q3x^xw&O)(gi-7w52c6oN^b?)|c=m*Cmq4 z<}DIh-Pw`oPQ`osH+Oa<+fl2Q?alGFj_&5pj++uj7s~8uG5V98i9|0l;Sf;`QRS}Y zj&5U1BGuB~+-LOmr;IM{{>eqSHWmz0K`C3%YJdr7mcu=Uto$YjI#AcA*hZv^J-j z!FY2rDJ2D{yVY2;wq{jzd`ZRPrA{;*yC5B1Qn3s+VZz^<@Vg8xjHyiV-*#d?#Q0~5 zKc*N<-)UGTC?68GCCtpYXWs|mu5IJ%3Rcq5k;f7H`zrl8k?%8prqcbBIzsgPr;z5Q z=MQ?^uH;~X>x7ygXt)?;01qnr*KnOaUMtAN*un8eUng8}F;7w%BQAKZMn?FW3tr}e zpK-w>E_hhMvj9_761inAxO<$7xZrwBCBZxwoa3Lq7P;UoLto2XaIFjGRl49%v~$H= z@N5Ta7xNy9-|6g7>=MoCD}9|jyta8$H*r!h}cG4WkPM@6N zr0KX%pDc9Jbl9g)nohbvq<`~gU0*tA)Za`A}qN&kl@{S8n0tDf{zp7f)h^dV3B0wWLw(b5KBzR^}uF#UEU(E*27?f@h< zZ1*v^_)Mx4UGqZ5(KSP(Ckm$TBHou(2>cp>zibtQ`G1ZLz7~7>*O$khKI4m-&&FQ( zbE*UkY{eirdZJCVlcs0?-L;b0M*n$Dv4NF8zXZ|P;LEAp*wD&XkQn*!pGHSVTG1Jv zwO>Tqd>3e)@=1U4Mr1P51UfjA$l%SVVuSrBP>GLECbJ_W_kzclDEG(;bk^8l^h|8v z<}*fW^OqtIWEqc%9QGF(TZ0ZJV=p3hB>Dy&%&Qe6_k+ux=<5YvjJ`f_=BkuEaOQ^o zGGvoHHUyr7MU9prk&yyfzDZsKj1TVKB+IAFg#PLex`bf?8j=W7nuz2sNF?{zQ0eo_ z*&N@%eemhn;8D>ECWAn1IM<2|3n?BiW7S|gknx8oV#q!Kf`P;4pnW$Y1)mpcEcoIv z2urDnI&9Cw#2P|923lhz39=*6z1U5tKN7u%9VB)nx}RAH532A%hDV~0sHC7o_F)M= zDub`f;1~mB9+$}z>#l03Jrex|Q_n_6@P88j{|RoV2m<13A{@3K6D=3r4+*~`qX$(r zVE_-pgdVvF_(N#Qb$f^I74|>8?A|iKpy1B`MyJ@l7IhqWigzP5Wk@7NjkifGA@|6w zK;6r3-Woek_M4PFavgvf9Wso=YfsxPpbRcOh<7Y6@8k`QfT;49%w$B$OKq!UAxK~eD&Zlpa#8jhYIuS;FBS0erxTRyFT1_)h-+N{L(dTeOdab(7Z zH(VlJ?=JGW_{;CT8382#^6&Mgd=#Aj@&zP4BPkU`m-do|5EgO(Y&BFjtKY2*vS^y3*7x2jG(l@K&_J=ii`%>VyIYp5k3NC`N=a?#5IdSkk&r0Chm9 z+8nx&}Sw4Xzy5$M91gCS80J>X%_6iW}pQ*tkqu)Nu(Ivq=ZD$R! zTTh)Km%*okD9CLOBa07ziLQC%v!I9#+Dk+M_IZ+Xl@Rp{V!Rl(vxNB1z!-xf_Uy>{ zqPkPSbKoi7jnuNC-HeFp{;pJrC#(CL*F~May;#6T?m|*zoIHy49%}XlW(?g+`C@~* zf*%7gZJ4p4sdob)d+N`~PxsVi?-A5?N(6=!J2qVUemdX57Z4j1W6hC~AA)R9h^QrA z?UFdrSjTqOQM|RIcj4trV?(-3& z7LV*+gcuZsAyG_q0AsXLz(h2rqDRE^icji}>~2hFvtKJBP9;>dJsqWC5_&|;3S@qC zmw-g~$lwkc>=hD4?-3$q&IXP|#bf~EHr)xwZ_!u?539784j@hM$o%6fJR!m%`{Y7^ zhlZ(^*w9C)iP&HaPGSQ_u3;(x(B%?Z251CODgjU`0J!r2T?A;IgtFd%E(f#{P}Uu| ztT&)BKPv_0#CbHT`E~k6=fb7xmhOjRq~tvrMkeYSt#$!0v6IV zg85d7Sf^mVbqW~J%i9<*Z*mv=RY7KdLU2SCG2fRZ-$MwJjX)TG9Bq`mM%GI<@idz! zC1jmqlXn)IUbk<=Dhrcibn4Ydq8~%EVK&P)r?rpSD~?3j)W8~Nj;v@$RQQ?*hwTf6 zwMHL7JARLje=zzO)cMKtWt$B*9aQt1+FzsHq6Y?UK47HI8;TwfE&u*Pp%KwLM}~m` z(r!h{@kl^2C&AYMmL40#3}z^b!J3A&)y?iQ$?hVuOD{9`5IShj0Q87G3wOE9EJtj} zo{0O!&-A5+>^#KAUSh5h46q)yPo6i<`tmEtkW(MAkbC)8qFxUZ%FO^V8@KP5NM~pe z)dHjR4uG&O#{I12lzB`pqlWuY)gvQ!fndmP1*TX>U5iMjK}9^4pr+JP(f@>g%L)Hz z|7)ZDBcuH%Mh>y%2EG!3Z^_j5$x|8Hb~Jr)n3Yjo_Panr-zgK^F`U0Ez11+(6d41G zY3GsXn>3(TFTw=vo^w&}=$o;#XJk$##Qq#TI8X%02LIb^qh5bgEk z-ptBpFu&++GOzJ64~)$`!Zp`m{~NKvrV(fh|CP%6ny_{1=;ZLL8GYQXlVSUi=rhlJ zQTWecyIK;CJPOltBM#nt97erB%j?>-JOPSAJ72C=%wR8|-m zCa^=%)RGfp3SWaJe{4#;#uko*@SAF*?hB-d(n@~qVBl_TsiQ%GB6M_pT1VW}Mvwa|bad;f!$O9qK`dTe1!PfzE< zmd?j}TDC3(e@va5_QR_l1S!4igDM=;%Od}%%0H&U<0?F%!V!jg%VFqVA<8gI5$nV( zp+Pa_8d{Dm6N)(0>sPVWLztyV;Oe1DY-`H=%J6WEJ4XV!t|T@rW@p!29UETOm?xAj zwfp!IfTC&S`-0xUgTjKh(y-2o{&IVeu*8XZY$x=sd^03LUop zkSiPhTHs?FhHOtB#7$Z<#rUXGp} z#)a*HOL)jWJV(g)?y-+o7#?rY#+v@2PfPcUKu7SU6;O`pvy9WM$(E!h_@ml$o zS2l7ZJcuWc3`RW2%zle28~m&5YZ_~+tJbcF@bKWg`70tk^OuUGdLrr|Bcm)rh+{PL zx3u7>Vq1S_#5p?IimYgTeQo`UNP|93DcB@h&yV!AMCP<+8*(CI7&Ys!s9h1^S01+` zUuVY)H)rjyC1+GAe*-Upy6r?N81q4@G?ux#I(hTLkrnw`9 zVj@WbTa%Ig?o>x7WIzh%M=P8df|a3l}e{SW>a5;(`^6moLA-NOO`$d?PL5@bFko zBovp%$MI!oM4ewA7hkF5Y^#aPo0CMhbn)X6WUaz+`4M0ATY1Pj1$9T-`g*!VBY{eK zi}VR>w1t!HwpVYtX^OFnR_)i*+TWQ-#;aOe*$mCCt&uJPikveic@AwQ)t-pp)OAX9 zdT1<@u7P!|?G_d)T8?^gamY4SM^`niSrOUXpGx&~Co5#Qn1%H=@96AlZjG#jlQ9%r zg-N`}Bk5Xjw0mns1H93^`Cb@`22fode31tO7AMV72_E_um}BF$!aE5!B+4`9ELz&S zV9uf?^47@M3g>1>Ure!`>Pa!L>FL{==z~ns`5Dq>8SOp&(x>dYeOi?{*>?%|US~j> z4L`s-1MxFI93AaN82k|qCLrAZ9^|6~gnXYUpL;+E zeb||5M_7ivj6Dc%K=>fSk0LyZ@G*oV2urbE4En(b;XH(&LKs8%d4%lDC;;$m5M;Qt3G@ACvi^TY46s`CQYAxI?iKMimX+DOQw^WP=11^w5N-;aFC z=g@CW=br+25cyrurIYV#^$~;R=c3-<`|0TDcEp{0tH&w-eB@W0z&=Yx{w|Rp0cF-9)hWtOigzXKqx04@(3^(~59&Z3=GuGNoKyh%awN8Escz+1_Yux!eMYfP}De}LF z{NK9sty2ztBl7RYu1G1$arpakg%YUe6!Q0AOJ-vReVs#p5AvTzKAyX!>D$xge-8QI zMm`=%rt{aO^S_JyqsV`kJKt(__`iXC8+~xR{1Vv5D&*r3Q<{Hon*UPdUyJ-4cmAq$ zek1a)K)!I2+Dy%lxjy9fCw=76-HFJNQIRutW)78 z751udmkRf)@SqAGQK97i_V4=rur<}yD!6upn4E zUxAJD!ChLDZ1fssQ(|}@qhyJ{5Israk1G7H<3Yt(m&AX3rpAAMmc;5&ChVn=_#eln zvgE%)%p(lr2`{2bOZ;c&Yy96Te7fhcuJa(dZJ2`j6bnL6ou|;os(EM@y0rDeM4YQN zg2Akhfoag6^+^O%gF!R+2AJht$vi9TJp~BN!0)IT%f1R-dz#<8Kf7oLfRN#S6z+Qt@fp4k;$Hem zlv{;}T~4oP#UQY04Wk2E)_E8reAeqA4_fWW3|SjdR*rQA{6e8M4DVEAeGQn!)~|3c zwN8L`g0%(=CtCL)US?enc)7(Pe3ErN3Z7zp6!Ga6UK}uHSYH5#nN|t#XIbUIoNav^ zCC;&iP}W>)Idadj=74IRRSJhR-}*GlJ=X|_8$%xlMj>A=wXY6r1ur9T0D1N`L7@{P zbS3cZ4L;T=9BH$^i%?>0DJ7{9;0)Ss7m2VjGh%P{`C(8+w9A%awn))@^wHLms~KH_ zXribJ(OI7*b$H(Op>u#9_-!t@Y?^coFvarSqO711DhHyyRd6ky1l%&aH{4H}cc7wn zUzU`*onj+LZMH@G-0( zA!=C9;AU7q#m%(dWYjth-T1BNVGCjFS%_R{{T@Y?S)vlkftlN-#hjkY;IBfL- z{{t46C3jl;5#MV)fmYsUeI4BHvZjIa-PSFT?H=o=kl|iyDX2bZT?zaTS)WHO_FJC= zk+7Ay5+kT zGMUCcKt{TnL#AJJ}WE(VRL$&8y6W@n|bA@yjmXIzi3S1;<=9w&Ti7arD zc`fR?ROT!Wr?k!wtdU2c60`1#a#wIw=6!Goys6;_ZgG#~G*8*43l0&ogm zg)KB#Hf1pEx)oOFC`)3ES1LtjH+QCtM$1nTpt~gqnk*j+u)_(xHvMF0ZKTPetmQ5K9yLY1%%7Rvf zSzPNji|gEGalP9t;%>9pq|8F7?`F$SNnyc%f;x6uJ_?mJAMrb_{OKqrXCZF>7)tgt zX870)S=XbJ-EZYr5~0pPV9fAQxUAEt`NLLzGZAiZ5EwIj>=9Xyqll-h{M(3dmxI8V z;iJ|2iV^iS@wSw=ZMfOtBER)5M6x+jl=y{>874=HQh&i$K^ipdMQ{2-OHsPeGU zZG3*!=K}QDe%a?l!)M7vSoHlIiB=}OLRcoI2!Aob@Bb9aiWpg&VYCzdKFVV6I^Q2! z3XY<{g??9o%XNYO2wT2H7s$DAr7rMXNE(%iGV>?UNlYdp=1O$6dYPDKE`bF!`9the zi_D#%xmG5YnrD!+Stgd7*T6tKBu%ARi>}h+&sm4!V&=c&-tW(efkB;#ce9N5`U`IX zY=b!p2DkZzBiv-p1jTp@xI9N`}cn z{sEalhrboI{ixq}FVOOcYlm0b)~^u}=5d)V{EIY?%WZ8QM<4cwZU9fwTAy{d)|0xm z!sr4=WFlxTgETM7M6S6V&Hgi)2%Eo$Fu(MdlUbR$3-@11$s#5yW4taC^UMM$?)Q>r zk+~OWqcX8HJDKb>{C3$kz?Pew1Z3M2KZK^KG~Yy_VS6GCJ7#hRZ-OlvsLou4>P@nR z9d9r%LSn96@E$POB;4)-nbU4w3(#Vj=rmV>+cKHxHA|qhi)A8Z?uA`e+WzOjXS?|U zsDHK0*<+TYaxuH;Y6N@D0gNnbWn#a{rDVNbMjJY4a-VdAUG@ni9yG5*#jmrcQWcMw z0Vr{kE&AAF<|(jgm5IZ!5y;~kM47(#(*VATSXLWi3ERikE4~W1a4Edu3i2Di5&%QLM8UzZkFu47 z01lR{0XWx~-GHL9gH|pHN@k+=p>VUvDM59NP~xs)xJOWAU{G&h(nmrI3L0xw%Gm$Kz@DO)a=&XLQd?6a3kehO5` z_5lT#ON9i?4BQEpag_;uKN zfD59mGC3^?a6yzcSwxILim~_e#wom55r$kV!jM`L2Dv1h4>u`>`oD5Xm^bc{Fz>Hf z5{9rQd15+%n%ltdqEWBBC`^MmC(^!E;7mYe`}E$!YcEdES{^( z8(6$rWwP#`Rc4T@%#RZ1ZLTt>W0m%VHL5$OjpraVFtrkVeTf* z+gxD=xx)OUF4()mlm$=63iIbcDN!rTT*g^-tS~9Fs5(}dl&w^)Fe!r(j*Fb9j5N{p49pa5d zS*%0I^!dI8NRVsfuYe$L{55irYh;|hk@fvs*2uz5de_JYQF=tKkwaJ{Q*X2 z2o3+Aw@BvjH1;C-X5_q$Me=Px^DL6ZdNzaw?S;^EkPBL_%Kp-VHiQ-JMZha0a*!)p zE?z`qj=iD{az$H$Ij~Ue|Hg`z%>G9!+B~(QEe8W@X+_%w zosGSs4sN*H z4n2*CXrm9>u05jta>ea8uR|yPh)e{_$q z&|?4h-)*t~TPa-6Q?_tDG2wc?Yzx;@XJoxZZ}An|w+!+WQm7)a;Lgs@{yh@KEk?Fl za2KbHY`x$v5)1C^EF2qB3-0V--ae>LF1WKpQ$#(*f;&6U{th_F1$TCS_EjK}3-0WK z?5#+Q7`cS0Ss*#)5}e-US2Llj0Tc`F?68lr75yjtVVRj5{wy*AF?dQdPdp$piaFMs z`B_{62F2RmEC`Wj*a-bMh|I9>y+}={N4%)u+vMvjs{=AFe=l>okyBF0_r^lLh|Xa- z6aE=fvC@3bL_@xLDrdsIK%bz1=PO`NIe?*`*o9kxdr<)@LB6&Mug94v(LH~ukwc(Z%WRXuw$}bR0uzsGD;zm)V zo^#f73c6QH_a9Cnj2Zq#kgj4X7@9YT8U86i%Z$k9v82ygTkx+yv7iMXZ-$@AiI=nB z{ehxMgi}&u;xyLc1A(Fi1o3A0Iit;a6w%-@zo^|7=J~0Xw0K_yrknr^X^CR^!_>=5 zh=%@KihLI-g+kMmgc<(3(N}X0Ae#Fjv!DWyhlxroV`2@&%sbD@dzv62W@H$8$UQHg ziJxhxPsl)8Bd3BScoIy6GenT!mDu>mZ#BjKP8cYnfHGqSH-S!mZzf3%L!7NbXdbu{ zDEWOY#(xGxrS{!%O97>QbsBq|Z{OZqjBqXV_0pY+a*d!TL14VNLJ>AOgj~T1!WScM!WSz!AtK>S?lwIl%>Oe}C7C#IhNyX<6w=uI zeSk-1iO#w2%*~YlU$y)@7jiG?-$b&2n`}oXv&*9@JB{!iAinFv>a>hFE3D6)D%#Jaws<=RuKHT4T9Z_n)AKoKhb zJy;Ed6rnivhaB_3bm&J^Xke-)WZMj^)GD5_41Bg8QRj$ODM8HxgCJyGJ4IcwXE!xV zoh7oSm^mj0yYp z3mciGY~;zEqS2QXW;FV`DZ0_8KC8+b054wOfzSmXfzTDjbnZUbT*1FWuth3)bf+=3 zkLMY1?UaFWhBWtp=8}+<@c2%n{Io*4P9X_|YK3qNq~T*=J9UmKf2l$<4>Yj8>;zM% z>$afHOuby&%%UeiXqE-^2I^dgRFIXGxyj0wYd2v05=#jxfA|;@b`Gr14yF(_>?&jgLf=O;XfH)POT@!QDM5b2M}q9h z$gqOG`w$PzCQ{Cy5Dobj)gi#;`!Q~TAES|iY8YOwasr04Ylq@jwQzc4h?=aH1O!T0&{2xU}$Iq=0So#jELXJ zdIRh(eQ^#FxWutlgyw-C0ws7-f!B#lj7S~EWu&+Eb)vF-ez0`cS(GJc@!%b2Q(ov$ z<~@Nj7rtAeD3e8*mxD6&Ip$5L3aot?2J)v690)@NSJdKcZ2y(0ay<6SF1G zMhEp?pq9Hd3p1NE0$>uehZYw|sWe32bCI;Cyz`GMQ)x zXev0<)Q>_h`NGt=1KV2aaQrZ~N2iql&rtzwcXPH&kXMSQxs689OVIK5?x(_5xEy=98i zTc$X@Ws1{VrZ~N2iql)BJiQgf;|PA-yS7B5X{I_%{2d&XNg(IsIX-lCGqzDDXGo<`8T zEgs(TZJP87V2b6tMOhGlhqruN$ux%#BYeH@Cjn1x`TDY?#O;(JDH48*C%1elkqBBm zx#jCGBuUr^u&6A-WZRX9mRI_*&CK6B@~e|ayIHhxtJ6sft?C_zJopEeC8Ack}3z1i_1JPa}9H{1G+C??Brx~)>6XSU>cmwNy{us zh)0##oU>H2cGfdOw*&zCN1x5vw{~vAnOIx)E`nN_Z$=1%H*~%k)up*HAWP? z`N6v8S{4&|A`!OonaCH366U%Dve`$gw9+t_ElVr!mXz_atK%caiW+A1TYZ*OnAtE9i({~!b1iy6+njckO9mEkO&)P3<8FqG&VhCAm|hR zV<`&B7N#BYRjR=~cpL~h3b(7(UI6oRFGX(&`RWwVUyVYt2`lH*d9&F^ zz4J(Y0AnTyvTiT#MvDJt5;w#DPrQ8)w-A@eS!)Z}&>vtvZ-#g}HHp*c;KaaZ2xfid zjl7NgOHqwbo5{rUPCnZNMIHjn?0fS`@=8XYk|CjmrHIl(Id<% z=AFaX`Mjk7H~e?9mdy4q#%(f4tAWgJ{2-dz>77rN2#He8HYs{(zbxnxcLbv6?Q=_oE=SE{) zK9!4sf4Zv$0?3VA&*GK@%I6`0>w3z7%RIn`hhd%$T2e|)`Sv}wb4CiNbIHlK?~$EZ zT&gV1A|986S@gRXWvvp)!#kzemO(mv8ipn2XQ071WJrq^krLSyfwYAJ-z8CzBoGK> zSX^xS@=*zaLW+_K^YU^CO~8!6r9y&IKaeh)k(D#UUsJ4dh&y4TQ~wzj0TU^6O);Zo ziq8!5k{P8J&+ye0OJ3!+Pzj*9)RKkDO9J zj2CLAq7~2>)08SP;7m77S!QGgl(Z0;GdRZ06w)~r!)^&HJiEeB^+N+w*h|ZClEzhO z1!NuOdcl;Tvh2N}I0rHZrPgF6wBdxtG8}0xe#d@ntpumWE@(eoKvniptn0%C(hD@>u<3$<{IQDQUBuDrqS7v~jF@y0mHv zC9OK*NB{*%lOg?#OqIA5GSi(UNZh%z+_~&hG{M<038==^2y@Q1{khWi&q>?M+@v{&PI57j+R@ouRxR(3&J%UbWs-DuM<)}~(~6)lIWoE$W`^w2{4qA-^l zCT4b#GTBASg)0$mmsFFKm5Ip!#wG1Ur)26~I;E)&FvIgsbHKvCO8dS^46M_IxhbLO z>>|$S1YF${=xX$!<$!O3&(Lm0Fvx6u*^F=5_D&PqnO!NsuA7za2&&%%Ga%A8hul?5 z8*27N!iaKYJLT$j%G2$X?~tM8bJKKcHskp1u(l2AidhkFJeH_;3+WVoy+!ya@2($e&pBe2~}((@t5v^c*pzJh-n2dH}JOHA{R zn0X@L^dJ9-@Z}W4xB&kb;eQkU2k`%C{C^SumO0%j$T=S|Q{0{>>`S2ZeHStRi@4dp z=8fF!T(T_YZ3=Dydj{T&)Mu`JIi_s|7uw|`w*R>8+xGJPcGf{V*l*`AvO^ne|4O^? z2X>&}F7fRM7TG>u-fedF%Xa8S+uUg3$0JQHs8|n5_dl#h!90p4ZsXR2zbtEWh32YJ z9V>GUZ<~0Nb*n<%^pghPMAq#x+kDxMU5407+YCN&xizcEE*Y`yls)&IcHw>Ygnk_N zx9!L6#O?OtPusrWA-mXGTx=J9-}Zgq&K|MDPuMvR+xC6-qTB6~UjSjDy(suK+xH8* z_)6RNX*(}C!=C(mW=%#GzAp{57`BW z>=}pbtdwnAGfQ!l0+Kx(?0}40?DK>7+t%auxUT~%Dzt7IyXqSU+o1NNd`%}T!?Y3YEBZq8j#9sWeJwIhn zzfzPOEVg}Hf@thl>`5uR>^`=7Y0941W}Ex$E4EQ#sEB#LeXdlV{W9zW&<6;+^fK1& zWfG(GoCj>{K6~Cf?V{jmyFU1&?MvBHQQIO}+wdWK#UVT&u@_!y&rC5A2(GpL`|Nqx zS+;!1;HT{(#LSeP>njXiYTMtlbKeP}p_N5;Ww0aIW>1FE-DgL(OPwu%==)G5m?Fd} z0n6`G4CqJJBx{>JJ0(%)5f#E5f=mM>nEZepwC=Qu1)24JMCO9B-<~1v({Mjz%lnj+ zZ5^@~qpcmK`C&vE?9dS?d4J#+c1_?B>dcpN%K65u-KQ_%WVd_DncD!zdHFw%QI4&Wp3v{NqiT*D76MKh`{lv#E z;)B2;OFzF5-Tw(YADTmlD1WD&bDv$X^2Y`ORZ63PZ_CWy%a-fTpJq>Rfi9&$1n7w z_iBCFrd@?jY25}}+;TZ9XwF!S07k(`{*&y=`G@S#At2mu1t4D(Tqs{Zn2+fax$`6B z+k}vglX5z3nD;Tzo8m@~ZqcLrK8={~F(xUupRP~1bw5S6*|;`;MA~Ls+oA?~@5NUH zCx{k&nGNiFCwvw9fcY@0@`MAlt%G(BY}7($F@pn_d#lxf2G3%CcX9Aq+i%S;v8@AE z#UwZnR65vknw}tlzPQcy$6+2D?c6pyr=2}4tIf9Yauq;%=-uu11oW>qJFwO+0jK~H zZN<>i5!^u6Qu2hI{f1qP>^3U|)%7+flQ;JCwHoWxm&t0nJLIoU*VWh7Me7?k#;a>r zN8|O;hPvAI4beEiM^?YCsWkdC{t)HCIRD>#8=?tZQ0l^!D|n@JOGC^5?GA z=iF+0Q}{NX%&3o6HPo&br8L&o)l|o;*49)tprES}Sv_VUB#1XO*4M0GBl2A=*3?(6 zZ;Y;vUsc->U-VX)i{C19i7d9Sr#I1;+F{`1Zv1`k)rq#|{?1fmUw<-%Po(v^e?vRf zvlUOTaC|YI=LfJ(2;OAVNbXE2B(+ts;bp-A@cgFbr4PWv;1NySlonel_&vQfAfFRW)m?R;`U1)m6RCsrE4l(W0m%y3-ZW`sn)Vs6dg` z=x**xT;1H+@3JZbKP|r{B5wWN$&M}E_!=R<|KZV2)#`OM>ub;-U<&AbRn<=Kbg6JX zyY1Te>Y9e?+V$(B5=VZ3v#GvDu#BfaVrZz2T9;`7+8Cu%0Ha2jPrPwsovetfxT~6K z8>`~c4b{=;YFHC=8W&$6^~%1g3c{>5pk`HZ7mtRf>S`E>AjvGbKH6ASvp$|yxJM(> zUaqKF+X!WAi(!9EqC(qu7&ms{E1(`4Xos#1zN4YDvCl&o_B`Qws2Qo4t%*c$RVO}6n>KzmFo;i2RzYq2uZP_pk=`5wBibLrYWc3T}e@GI8C5haP`C zrOJklH`dn1*H+c9Im>A4(RtG986!JmbW2=oF1scq1{Q^d`4*JQ<^uSXDigGmaCIUt-0_F_UzLb$y9s;%wiM_6PB6Y8qp> ztz8>mhhA3&^>j8TQ*rs(T@2;gml`ddiRNy_mLJ{B^p;x^sh0NUJ~V#I)YE z`7ydLd?6X%dd8QJFL%)3LgZ%XzG?#Vn+;I)*udR?sRaRxtLA z8}bXI>*0Tmt%)7!kv-GCw1K0;LZ|$2G5lsS9hL5lDwE$Fj*m6!*GI2viZ(R9-T9Pi z2v}OC8M)>eJs737k2PgeL(My)(K=44t{$_0rLCRLU|qB^Ry)>|E5pLvbB0V0yf)F@ zkm|!XY2lsvns;RAT1^_3(Q$3Vj6i(_+uP8bM7a8(M=DqQjyVK-Z9>flFrkoN<>t8W zEs@TbCDzu%Wy#9Bipg|5m?sHmEvKf5Zq5o@t2=tz6MYT+9r#?fk! z>2B-n*wTJ>SC>@5s*V4Xn`|=AHT(~r{U`u2{TXS+pcT0O;Pj^p$azTIhjUC;s3sUR| zNo3-q)Gb>V^kUhE4{P`IEkFn46jo=nz&*C>Y}hR_TH0J`V>1l8Z%6Nqtp;ZD?p2mc zCF%KVTI-<$Wj+y zS65snz%H?r&sc}G-C1r&<*jOJ*a*j$?8S~if@|#-*-c?PELnZzUhWtOS=hYQ;xqGc zypD{orOTC;tYm9~)7L&IsjIg$p}MQgg4UBQeI1(<=>@4;Il3y-g6^I{8Mb5gLIy@Kb@1*wxR&(S*hfu2JkBN8y?~t^)Au1fjB!KoWOf|a3xmFQ~e-C=YmZfxYwk1!&usyFAP`N{A7J3Ds#SU-Lez?GK25#RvWi8KfN z@PHF1As2KqFTP6rWPna#@+ua7v<v0$_)fK<774ttV zI9eM!TDB4(zREAZ*sobv^T!65cN2aN!045~8h`>D<)J1$GHgS?oLZ{ z$^a0S<>0q8cef-u$p%Xi2KY4qv2s}_lO4%c7#H9>C=%!AG5$b6932ZgDuNE1WSEsE z1yX`b7bS}F1v=TBO7%fJvS>gVNi2!FQ*D9+Subqw=}Ii@LQm;VbT3@p)6(CCc}8;K zmX6fIzC>s94(%HHS{Bm1SAYf1^eya9_ATt}*t~E{OUptGwDAj-S4$N%+GRi`($1nwwJQwyhxA!a%zpmpZg{E6u6Kxgkq7TPY zh_I)q@dv|^0@SC+SOpQC197rsAWR1lFzo1I$htF6?p-)N7`;q0m0AKWTUn5DMIm`W zO`3`1EL6Bq7L!~k%`hnytD&+?X~Xy>LjJx5sN_arstfE?^9seJlZX}Lu>hYk@bW)t z|2W`(DR7T?Xe>Zu-tce$FYf$i)SHP@=y(X?H}1g0TwW1z$LU3cW8qH&+`=*Dy+m+b z5yS~U?15jP;LZoU6-^C7)0kw0)lp^2$EykdrZK@du~sCV+j|is|4JM$bzggsF!42U z{atgN_b-TyCI7?Yz#kn4&Sx`Y@i{sUd_27!1HK6*8}pe!9*LL$O6V;R@#nc-Z;28IM=-T09OuU-&FUd+FEC#6w8n^KsNz z{9DI?-wJqy1$nMd<7{)p!0`xW4?6oJf=}4+zShg{-cufZ)Lr%l9QVKzz#`a*eg>w` zAM^8GW6Al9;-e4O>v}y0co_0%`_%HhAozsOdS~RPiq9e?zn15h3g7$EDSz{#$SO4S z_xUydKL~uCN{4yS59{T90e7N;dtU{PD7g34WqxmLEIo9g;$y*ADL&q}=^7N=dw_hC zf_q=7>(cnMWS#Web2}8=`!?+!1^2$Gj1Mi3Dd$6gv%S3b^Y4m}_wCi^#^J*+l~T{% zHvnD+Jd$n>C&u6ID74D)i6sXlA}0LlSo$mmypTDIB)+z{dE@AxuQgB}?`s0*jl+MX z!uP(nziu3SzB9#s6!F+?w}R_$NoafS2Rsb?4W9ZwqV&f1?0IQ_a??2Fwu$R-Zb#!;c#m09W^ZvdaMq3|tcH^!6U0pjs;!4GVnaV&_ z>j5=2R@3Gd{qt;)R8L&v@hj^2cs;s)bv$mwS8v2a@tSI|$39*>8dJHk)%8Yv&Dz>k zc;Z`o#T5-vJfy9{K2+SbM0M?JxR=sg=~u2a%$Dr+n-80^emstEiUEa z3GqNoij%ool}}on{R`0&oZ@5Uo53o*apP=p$OSs8Aa*X}E$v(5+|F{yu+OFHFCKuV z7us>u1FKh^E6>d+RI$p=-1Tra0?yu+P^(Os9rm)N7RTDhP|wvI$*3E(o{nRo+|#WZ z09FxiP4>jwxvh{;n+guqVzx*vP+L2?g4uA1_!y@j1&quhSTKuT|ka2G^v2xMTSmFnI?%Y>rA&@FVAW`EIMDYLgY zhA20D^tOcD0C7rXpNqF_Z)PvR7RODQy;-;(*X|9ra?--+T`NM=&ZOR8b!$_djBrY% zy0m7w*<@5CcXZ*A0K!zC4BK^#`^bI0MnyNC5L94;qeAU*?{I-O_v1G@7vQ0t#Hw0V zg9i*-41wN`2M9(*>yB;|A;VOk%)zFwIP@dXR3eT%ZoQB|#dY)%5}H5f}2iB9@2*!f(TM%&71oY+jI*1KnWd(26dER^a>~4*S&?m8Jg5%-ro@NgGE>x zVGlrF{2~A^9Zr!+=T2PrH46!Dk!bqmie86mI_{9@`K|_Vx$UNJSM)lZtr1n|jPokZ z{SG(1-fz)iMB(YcOMeYAeuv)})AH-zVbkGKMJNuKBJP#H88E!A;nZLMPMZ!Fsrpbx z>Q2-1jTK%U_$P`kU;pl#4$pWL?nxRqfR?|Zrs?(Xrs;4s@_A|bHJ%Q4B9FhxrqlX& z*>tFvBVPFhQ{0B}Pn~Ld{X20wJd8YEx_oc_KZHEeuObpI{kwBI)W1_ldg{ze{{Udr ziRSOjPt`n?_U*pB?a!0XZu*F#)8Rpn!d13Y%)fZ(596(PUOLqH5}KYqYxpC`aF>5f z(d%&UUnu_z9(uh_)Zu)*qvO7Gxf=E*MBL@;eG?t#X+#xz_4idpuiIa*zjes(@3=4B zej4@-L|DG2*ZXfe*0~hbMi#|v?z2A9U?I(Ki zby|nN0ZoC6Uhl7-c$@V6Vi8rO+=R0)Iil#pN-^wzymYy`9X|ya>#ync?>wHljM%{U z=ugw@Fo1kFy|d3#Daai=m#K95I?Y4=(y|j#E5A`73y*|xKNe9NCQ-;>Cf}P zDJw4>PEzy|n!aCBDdVrDK_aHDnbvv=JU>R=r5pS#>IVE_ob6Me7B-^ z<1p_3u!MNr&slXPAKmvQg}g@;y&gwq13Ur$+J5x-$>%KE_9UgeAN{BdQ`jePUs`Sr Uqq`l8{?Z2}#!VgqPty4R0N7n5od5s; diff --git a/src/conf.h b/src/conf.h deleted file mode 100644 index 02f55f8..0000000 --- a/src/conf.h +++ /dev/null @@ -1,19 +0,0 @@ -#if !defined(CONF_H) -#define CONF_H - -#define ADDRESS "tcp://10.2.0.3:1883" -#define CLIENTID "mqttClient" -#define MQTT_USER "mreenen" -#define MQTT_PASS "somepass" -#define BASE_TOPIC "/cool/" -#define TIMEOUT 10000L - -#define RECON_TIMEOUT 60 // seconds - -#if defined(_WIN32) - #define SLEEP(n) Sleep(n*10) -#else - #define SLEEP(n) usleep(n * 1000L) -#endif - -#endif diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 8daa456..0000000 --- a/src/main.c +++ /dev/null @@ -1,44 +0,0 @@ -#include -#include -#include -#include - -#include "conf.h" - -#include "MQTTAsync.h" -#include "mqtt.h" -#include "module.h" - -int main(int argc, char* argv[]){ - printf("==============================\n" - "=== mqttClient ===============\n" - "==============================\n\n"); - - clientConf_t* client = MQTT_connect(NULL); - - if(client != NULL) - { - usleep((int)500e3); - Modules_Init(); - Modules_StartAll(); - - int returnCode = 1; - while(returnCode == 1) - { - char ch = getchar(); - switch (ch) { - case 'q': - case 'Q': - returnCode = 0; - MQTT_disconnect(client); - } - } - } - else - { - printf("CRITICAL: main(): failt to connect to mqtt\n"); - return -1; - } - - return 0; -} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..1fd8d4c --- /dev/null +++ b/src/main.rs @@ -0,0 +1,173 @@ +use std::time::Duration; +use std::thread; + +use rumqttc::{MqttOptions, Client, QoS}; +use chrono::{Local, Timelike, Datelike}; +use crossbeam::channel::unbounded; + +struct MqttMessage { + topic: String, + payload: String +} + +fn mqtt_clock(publish: crossbeam::channel::Sender) { + // let clock_topic: String = String::from("clock"); + + // init last values with invalid values + let mut last_year: i32 = 65535; + let mut last_month: u32 = 65535; + let mut last_dom: u32 = 65535; + let mut last_dow: u32 = 65535; + let mut last_iso_week: u32 = 65535; + let mut last_iso_year: i32 = 65535; + let mut last_hour: u32 = 65535; + // let mut last_hour12: u32 = 65535; + let mut last_minute: u32 = 65535; + let mut last_second: u32 = 65535; + + loop { + let datetime = Local::now(); + println!("DEBUG: mqtt_clock: {}", datetime.format("%Y-%m-%d %H:%M:%S")); + println!("DEBUG: mqtt_clock: last_second={}", last_second); + if last_second != datetime.second() { + last_second = datetime.second(); + match publish.send({ MqttMessage { + topic: String::from("clock/second"), + payload: last_second.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send second"), + Ok(_n) => println!("DEBUG: mqtt_clock: send second") + } + if last_minute != datetime.minute() { + last_minute = datetime.minute(); + match publish.send({ MqttMessage { + topic: String::from("clock/minute"), + payload: last_minute.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send minute"), + Ok(_n) => {} + } + if last_hour != datetime.hour() { + last_hour = datetime.hour(); + // last_hour12 = datetime.hour12(); + match publish.send({ MqttMessage { + topic: String::from("clock/hour"), + payload: last_hour.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send hour"), + Ok(_n) => {} + } + // match publish.send({ MqttMessage { + // topic: String::from("clock/hour12"), + // payload: last_hour12.to_string() + // }}) { + // Err(_n) => println!("ERROR: mqtt_clock: faild to send hour12"), + // Ok(_n) => {} + // } + if last_dom != datetime.day() { + last_dom = datetime.day(); + match publish.send({ MqttMessage { + topic: String::from("clock/dom"), + payload: last_dom.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send dom"), + Ok(_n) => {} + } + if last_iso_week != datetime.iso_week().week() { + last_iso_week = datetime.iso_week().week(); + match publish.send({ MqttMessage { + topic: String::from("clock/isoWeek"), + payload: last_iso_week.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send iso week"), + Ok(_n) => {} + } + if last_iso_year != datetime.iso_week().year() { + last_iso_year = datetime.iso_week().year(); + match publish.send({ MqttMessage { + topic: String::from("clock/isoYear"), + payload: last_iso_year.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send iso year"), + Ok(_n) => {} + } + } + } + if last_dow != datetime.weekday() as u32 { + last_dow = datetime.weekday() as u32; + match publish.send({ MqttMessage { + topic: String::from("clock/dow"), + payload: last_dow.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send dow"), + Ok(_n) => {} + } + } + if last_month != datetime.month() { + last_month = datetime.month(); + match publish.send({ MqttMessage { + topic: String::from("clock/month"), + payload: last_month.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send month"), + Ok(_n) => {} + } + if last_year != datetime.year() { + last_year = datetime.year(); + match publish.send({ MqttMessage { + topic: String::from("clock/year"), + payload: last_year.to_string() + }}) { + Err(_n) => println!("ERROR: mqtt_clock: faild to send year"), + Ok(_n) => {} + } + } + } + } + } + } + } + thread::sleep(Duration::from_millis(500)); + } +} + + +fn main() { + let (mqtt_publish, mqtt_publish_rx) = unbounded::(); + + let mut mqttoptions = MqttOptions::new("rumqtt-sync", "10.1.2.2", 1883); + mqttoptions.set_keep_alive(Duration::from_secs(5)); + let (client, _connection) = Client::new(mqttoptions, 10); + // client.subscribe("hello/rumqtt", QoS::AtMostOnce).unwrap(); + + // treath publisher + let publisher = thread::Builder::new() + .name("publisher".to_string()) + .spawn(move || { + loop { + let message = mqtt_publish_rx.recv(); + match message { + Err(_err) => println!("ERROR: publisher: faild to receve an message"), + Ok(msg) => { + println!("INFO : publisher: topic={}; payload={}", msg.topic, msg.payload); + match client.publish(msg.topic, QoS::AtMostOnce, false, msg.payload) { + Err(_n) => println!("ERROR: publisher: faild to publish"), + Ok(_n) => {} + } + } + } + } + }); + + // treath mqtt clock + let mqtt_publish_clock = mqtt_publish.clone(); + let mqtt_clock_stat = thread::Builder::new() + .name("mqtt_clock".to_string()) + .spawn(move || { + mqtt_clock(mqtt_publish_clock); + }); + match mqtt_clock_stat { + Err(_n) => println!("ERROR: mqtt clock: faild to start thread"), + Ok(n) => n.join().expect("msg") + } +} diff --git a/src/module.c b/src/module.c deleted file mode 100644 index 28c89f2..0000000 --- a/src/module.c +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include -#include - -#include "module.h" - -Module_t *Modules = NULL; -unsigned int Modules_len = 0; -unsigned int Modules_alloc = 0; - -void Modules_Add(Module_t module) -{ - printf("INFO: Modules_Add(): add module '%s' to the list\n", module.Name); - if (Modules == NULL) - { - Modules = (Module_t*) malloc(sizeof(Module_t) * 5); - Modules_alloc = 5; - } - - if (Modules_len >= Modules_alloc) - { - Module_t *new_subs = (Module_t *) malloc(sizeof(Module_t) * (Modules_alloc + 5)); - memcpy(new_subs, Modules, sizeof(Module_t) * Modules_alloc); - Module_t *old_subs = Modules; - Modules = new_subs; - free(old_subs); - } - - memcpy(Modules + sizeof(Module_t)*Modules_len, &module, sizeof(Module_t)); - Modules_len++; -} - -void Modules_Init() -{ - // extern Module_t Module_Clock(); - // Modules_Add(Module_Clock()); - extern Module_t Module_Button(); - Modules_Add(Module_Button()); -} - -void Modules_StartOne(Module_t module) -{ - printf("INFO: Modules_StartOne(): starting module '%s'\n", module.Name); - (*(module.Start))(); -} - -void Modules_StopOne(Module_t module) -{ - (*(module.Stop))(); -} - -void Modules_StartAll() -{ - for (int i=0; i -#include -#include -#include - -#include "conf.h" -#include "module.h" -#include "mqtt.h" - -void button1(char *topicName, int topicLen, MQTTAsync_message *message) -{ - MQTT_publish("/cool/ledkast/set", 1, "{\"status\":\"TOGGLE\"}"); -} - -void Buttons_Stop() -{ - return; -} - -void Buttons_Start() -{ - MQTT_subscribe("button1", 1, &button1); - return; -} - -Module_t Module_Button() -{ - Module_t module; - module.Name = "buttons"; - module.Start = &Buttons_Start; - module.Stop = &Buttons_Stop; - return module; -} diff --git a/src/modules/clock.c b/src/modules/clock.c deleted file mode 100644 index 1ba5c11..0000000 --- a/src/modules/clock.c +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include - -#include "conf.h" -#include "module.h" -#include "mqtt.h" - -int lastSec = 0; -int lastMin = 0; -int lastHour = 0; - -pthread_t *Thread = NULL; - -void *Worker(void *args); - -void Stop() -{ - printf("DEBUG: clock.Stop()\n"); - if (Thread != NULL) - { - pthread_cancel(*Thread); - free(Thread); - Thread = NULL; - } -} - -void Start() -{ - printf("DEBUG: clock.Start()\n"); - if (Thread != NULL) - { - Stop(); - } - printf("DEBUG: clock.Start(): create thread\n"); - int rc = pthread_create(Thread, NULL, Worker, Thread); - printf("DEBUG: clock.Start(): done %d\n", rc); -} - -Module_t Module_Clock() -{ - Module_t module; - module.Name = "clock"; - module.Start = &Start; - module.Stop = &Stop; - return module; -} - -void sendTick(char* name, struct tm* t) -{ - char topic[100] = BASE_TOPIC "clock/"; - strcat(&topic[0], name); - - char payload[50]; - sprintf(&payload[0], "%04d-%02d-%02dT%02d:%02d:%02d", - t->tm_year, - t->tm_mon + 1, - t->tm_mday, - t->tm_hour, - t->tm_min, - t->tm_sec - ); - printf("topic = %s\n", &topic[0]); - - MQTT_publish(topic, 1, &payload[0]); -} - -void *Worker(void *args) -{ - printf("DEBUG: clock.Worker()\n"); - int returnCode = 1; - time_t rowNow; - while (returnCode = 1) - { - time(&rowNow); - struct tm *now = gmtime(&rowNow); - - if (now->tm_sec != lastSec) - { - sendTick("second", now); - lastSec = now->tm_sec; - - if (now->tm_min != lastMin) - { - sendTick("minute", now); - lastMin = now->tm_min; - - if (now->tm_hour != lastHour) - { - sendTick("hour", now); - lastHour = now->tm_hour; - } - } - } - - usleep(500e3); - } - - pthread_exit(0); - return NULL; -} diff --git a/src/mqtt.c b/src/mqtt.c deleted file mode 100644 index ac75483..0000000 --- a/src/mqtt.c +++ /dev/null @@ -1,259 +0,0 @@ -#include -#include -#include -#include - -#include "conf.h" - -#include "MQTTClient.h" -#include "MQTTAsync.h" -#include "mqtt.h" - -typedef struct Subscription_s { - char* topic; - char qos; - void (*onMessage)(char* topicName, int topicLen, MQTTAsync_message* message); -} Subscription_t; - -clientConf_t* Client; - -Subscription_t *Subscriptions = NULL; -unsigned int Subscriptions_len = 0; -unsigned int Subscriptions_aloc = 0; - -void onSubscribe(void* context, MQTTAsync_successData* response){ - // printf("Successful subscribed to %s\n", (char*) context); - printf("Successful subscribed\n"); -} - -void onSubscribeFailure(void* context, MQTTAsync_failureData* response){ - printf("ERROR: Subscribe failed, rc %d\n", response->code); -} - -void MQTT_subscribe(char* topic, int qos, void (*onMessage)(char* topicName, int topicLen, MQTTAsync_message* message)) -{ - int rc; - - if (Subscriptions == NULL) - { - Subscriptions = (Subscription_t *) malloc(sizeof(Subscription_t) * 5); - Subscriptions_aloc = 5; - } - - if (Subscriptions_len >= Subscriptions_aloc) - { - Subscription_t *new_subs = (Subscription_t *) malloc(sizeof(Subscription_t) * (Subscriptions_aloc + 5)); - memcpy(new_subs, Subscriptions, sizeof(Subscription_t) * Subscriptions_aloc); - Subscription_t *old_subs = Subscriptions; - Subscriptions = new_subs; - free(old_subs); - } - - Subscription_t sub; - sub.qos = qos; - sub.onMessage = onMessage; - - if (topic[0] != '/') - { - char *newTopic = malloc(strlen(BASE_TOPIC) + strlen(topic) + 1); - memcpy(newTopic, BASE_TOPIC, strlen(BASE_TOPIC)); - memcpy(newTopic + strlen(BASE_TOPIC), topic, strlen(topic) + 1); - sub.topic = newTopic; - } - else - { - char *newTopic = malloc(strlen(topic) + 1); - memcpy(newTopic, topic, strlen(topic) + 1); - sub.topic = newTopic; - } - - memcpy(Subscriptions + sizeof(Subscription_t)*(Subscriptions_len), &sub, sizeof(Subscription_t)); - Subscriptions_len++; - - printf("INFO: MQTT_subscribe(): Subscribing to topic '%s' (QoS%d)\n", sub.topic, sub.qos); - - MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer; - opts.onSuccess = &onSubscribe; - opts.onFailure = &onSubscribeFailure; - opts.context = ⊂ - rc = MQTTAsync_subscribe(Client->client, sub.topic, qos, &opts); - // rc = MQTTAsync_subscribe(Client->client, topic, qos, &opts); - - if (rc != MQTTASYNC_SUCCESS){ - printf("ERROR: Failed to start subscribe, return code %d\n", rc); - } -} - -void MQTT_publish(char* topic, int qos, char* payload) -{ - printf("Publishing to %s\n", topic); - int rc = MQTTClient_publish(Client->client, topic, strlen(payload), payload, qos, 0, NULL); - printf("rc = %d\n", rc); -} - -int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message){ - printf("Message arrived\n"); - printf(" topic: %s\n", topicName); - printf(" message: %.*s\n", message->payloadlen, (char*)message->payload); - - printf("Subscriptions_len = %d\n", Subscriptions_len); - for (int i = 0; i < Subscriptions_len; i++) - { - Subscription_t sub = *(Subscriptions + i*sizeof(Subscription_t)); - printf("looking for '%s'; looking at '%s'\n", topicName, sub.topic); - int r = strcmp(topicName, sub.topic); - if(r == 0){ - printf("match %d\n", r); - (*(sub.onMessage))(topicName, topicLen, message); - } - else - printf("NO match %d\n", r); - } - - MQTTAsync_freeMessage(&message); - MQTTAsync_free(topicName); - return 1; -} - -void reconnect(){ - int rc; - - if(Client->last_reconn.t + RECON_TIMEOUT > time(NULL)){ - if(Client->last_reconn.c < 10){ - printf("INFO: MQTT.reconnect(): Wait %d seconds until reconect. reconect counter on %d\n", RECON_TIMEOUT, Client->last_reconn.c); - sleep(RECON_TIMEOUT); - } else { - printf("INFO: MQTT.reconnect(): Wait min minutes until reconect. reconect counter on %d\n", Client->last_reconn.c); - sleep(60 * 10); - } - } - - printf("INFO: MQTT.reconnect(): Reconnecting to MQTT server\n"); - rc = MQTTAsync_connect(Client->client, &(Client->conn_opts)); - if (rc != MQTTASYNC_SUCCESS){ - printf("ERROR: MQTT.reconnect(): Failed to reconnect, return code %d\n", rc); - } else { - printf("INFO: MQTT.reconnect(): Reconnect sucsesfull\n"); - } - Client->last_reconn.t = time(NULL); - Client->last_reconn.c++; -} - -void onConnectFailure(void* context, MQTTAsync_failureData5* response){ - printf("ERROR: MQTT.onConnectFailure(): Connection failed, rc %d\n", response->code); - reconnect(); -} - -void connlost(void *context, char *cause){ - printf("\nERROR: MQTT.connlost(): Lost connection to MQTT\n"); - if (cause != NULL) - { - printf(" cause: %s\n", cause); - } - - reconnect(); -} - -void onConn(void* context, MQTTAsync_successData5* response){ - printf("INFO: MQTT.onConn(): connected to MQTT server\n"); - - Client->last_reconn.c = 0; - - int rc; - for (int i=0; i < Subscriptions_len; i++) - { - Subscription_t sub = *(Subscriptions + sizeof(Subscription_t)*i); - - printf("INFO: MQTT.onConn(): Subscribing to topic %s (QoS%d)\n", sub.topic, sub.qos); - - MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer; - opts.onSuccess = &onSubscribe; - opts.onFailure = &onSubscribeFailure; - opts.context = ⊂ - rc = MQTTAsync_subscribe(Client->client, sub.topic, sub.qos, &opts); - - if (rc != MQTTASYNC_SUCCESS){ - printf("ERROR: MQTT.onConn(): Failed to start subscribe, return code %d\n", rc); - } - } - - if (Client->onConnect != NULL) - { - (*(Client->onConnect))(Client); - } -} - - -clientConf_t* MQTT_connect(void (*onConnect_cb)(void* context)){ - Client = (clientConf_t*) malloc(sizeof(clientConf_t)); // keep this util i say so - int rc; - int ch; - - rc = MQTTAsync_create(&(Client->client), ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL); - if (rc != MQTTASYNC_SUCCESS){ - printf("Failed to create client, return code %d\n", rc); - free(Client); - return NULL; - } - - Client->onConnect = onConnect_cb; - Client->last_reconn.c = 0; - Client->last_reconn.t = time(NULL); - - rc = MQTTAsync_setCallbacks(Client->client, Client, &connlost, &msgarrvd, NULL); - if (rc != MQTTASYNC_SUCCESS){ - printf("Failed to set callbacks, return code %d\n", rc); - MQTTAsync_destroy(&(Client->client)); - free(Client); - return NULL; - } - - MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; - Client->conn_opts = conn_opts; - Client->conn_opts.keepAliveInterval = 20; - Client->conn_opts.cleansession = 1; - Client->conn_opts.onSuccess = onConn; - Client->conn_opts.onFailure = onConnectFailure; - Client->conn_opts.context = &Client; - Client->conn_opts.username = MQTT_USER; - Client->conn_opts.password = MQTT_PASS; - printf("connecting to MQTT server (%s)\n", ADDRESS); - rc = MQTTAsync_connect(Client->client, &(Client->conn_opts)); - if(rc != MQTTASYNC_SUCCESS){ - printf("Failed to start connect, return code %d\n", rc); - MQTTAsync_destroy(&(Client->client)); - free(Client); - return NULL; - } - - return Client; -} - - - -void onDisconnectFailure(void* context, MQTTAsync_failureData* response){ - printf("Faild to discontect from MQTT, rc %d\n", response->code); - MQTTAsync_destroy(Client->client); - free(Client); -} - -void onDisconnect(void* context, MQTTAsync_successData* response){ - printf("disconnected from MQTT server\n"); - MQTTAsync_destroy(Client->client); - free(Client); -} - -void MQTT_disconnect(){ - int rc; - MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer; - disc_opts.onSuccess = &onDisconnect; - disc_opts.onFailure = &onDisconnectFailure; - rc = MQTTAsync_disconnect(Client->client, &disc_opts); - if (rc != MQTTASYNC_SUCCESS){ - printf("Failed to start disconnect, return code %d\n", rc); - MQTTAsync_destroy(Client->client); - return; - } -} - - diff --git a/src/mqtt.h b/src/mqtt.h deleted file mode 100644 index 84fe32d..0000000 --- a/src/mqtt.h +++ /dev/null @@ -1,25 +0,0 @@ -#if !defined(MQTT_H) -#define MQTT_H - -#include -#include "MQTTAsync.h" - -typedef struct clientConf_s { - MQTTAsync client; - MQTTAsync_connectOptions conn_opts; - struct lastReconn_s { - int c; - time_t t; - } last_reconn; - void (*onConnect)(void* context); - void (*onMessage)(char* topicName, int topicLen, MQTTAsync_message* message); -} clientConf_t; - - -clientConf_t* MQTT_connect(void (*onConnect)(void* context)); -void MQTT_disconnect(); - -void MQTT_subscribe(char* topic, int qos, void (*onMessage)(char* topicName, int topicLen, MQTTAsync_message* message)); -void MQTT_publish(char* topic, int qos, char* payload); - -#endif diff --git a/src/test.c b/src/test.c deleted file mode 100644 index 239b46f..0000000 --- a/src/test.c +++ /dev/null @@ -1,35 +0,0 @@ -// A simple C program to demonstrate callback -#include - -#include "mqtt.h" - - -typedef struct data_s { - int num; - void (*cb)(int num); -} data_t; - -void a(void* context){ - int num = ((clientConf_t*)context)->last_reconn.c; - printf("Hi, this is a. you gave me the number %d\n", num); -} - -clientConf_t b(int num, void* cb){ - clientConf_t data; - data.last_reconn.c = num; - data.onConnect = cb; - return data; -} - -void fire(clientConf_t* data){ - (*(data->onConnect))(data); -} - -int main(){ - printf("callback test\n"); - - clientConf_t d = b(5, &a); - - fire(&d); - -}