diff --git a/.github/workflows/check-dependencies.yaml b/.github/workflows/check-dependencies.yaml
index e14cef7..180137d 100644
--- a/.github/workflows/check-dependencies.yaml
+++ b/.github/workflows/check-dependencies.yaml
@@ -40,7 +40,7 @@ jobs:
| grep -v '^[[:space:]]*$' \
| grep -v fms- \
| grep -v influx-client \
- | grep -v zenoh \
+ | grep -v up-transport-hono \
| sed -E 's|([^ ]+) v([^ ]+).*|crate/cratesio/-/\1/\2|' \
> DEPS.txt
- name: Set up JDK
diff --git a/.gitignore b/.gitignore
index 69de282..de09756 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,5 +21,5 @@
*.drawio.bkp
**/target
-config/
+config/hono/
*.env
diff --git a/.sdv-blueprint.json b/.sdv-blueprint.json
index bf519d2..aa7022c 100644
--- a/.sdv-blueprint.json
+++ b/.sdv-blueprint.json
@@ -3,9 +3,23 @@
"version": "0.1.0",
"description": "A close to real-life showcase for truck fleet management where trucks run an SDV software stack so that logistics fleet operators can manage apps, data and services for a diverse set of vehicles.",
"participatingProjects": [
- { "id": "automotive.kuksa" },
- { "id": "automotive.leda" },
- { "id": "iot.hono" },
- { "id": "iot.paho" }
+ {
+ "id": "automotive.kuksa"
+ },
+ {
+ "id": "automotive.leda"
+ },
+ {
+ "id": "automotive.uprotocol"
+ },
+ {
+ "id": "iot.hono"
+ },
+ {
+ "id": "iot.paho"
+ },
+ {
+ "id": "iot.zenoh"
+ }
]
-}
+}
\ No newline at end of file
diff --git a/DEPENDENCIES b/DEPENDENCIES
deleted file mode 100644
index 22b678a..0000000
--- a/DEPENDENCIES
+++ /dev/null
@@ -1,308 +0,0 @@
-crate/cratesio/-/aes/0.8.4, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4260
-crate/cratesio/-/ahash/0.8.8, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/aho-corasick/1.0.2, MIT AND Unlicense, approved, #9759
-crate/cratesio/-/allocator-api2/0.2.16, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/anstream/0.6.11, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/anstyle/1.0.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/anstyle-parse/0.2.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/anstyle-query/1.0.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/anyhow/1.0.72, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/array-init/2.1.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/arrayvec/0.7.4, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/async-attributes/1.1.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/async-channel/1.9.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-channel/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-executor/1.8.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-global-executor/2.4.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-io/1.13.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-io/2.3.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-lock/2.8.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-lock/3.3.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-process/1.8.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-signal/0.2.5, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-std/1.12.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-stream/0.3.5, MIT, approved, clearlydefined
-crate/cratesio/-/async-stream-impl/0.3.5, MIT, approved, clearlydefined
-crate/cratesio/-/async-task/4.7.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/async-trait/0.1.72, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #6666
-crate/cratesio/-/atomic-waker/1.1.2, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/axum/0.6.19, MIT, approved, clearlydefined
-crate/cratesio/-/axum/0.7.4, MIT, approved, clearlydefined
-crate/cratesio/-/axum-core/0.3.4, MIT, approved, clearlydefined
-crate/cratesio/-/axum-core/0.4.3, MIT, approved, clearlydefined
-crate/cratesio/-/base64/0.21.7, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #9764
-crate/cratesio/-/bitflags/1.3.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/bitflags/2.4.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/block-buffer/0.10.4, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/blocking/1.5.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/bytes/1.4.0, MIT, approved, clearlydefined
-crate/cratesio/-/cache-padded/1.3.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/castaway/0.1.2, MIT, approved, clearlydefined
-crate/cratesio/-/cfg-if/1.0.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/chrono/0.4.26, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/cipher/0.4.4, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/clap/4.5.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #13275
-crate/cratesio/-/clap_builder/4.5.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #13276
-crate/cratesio/-/clap_derive/4.5.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/clap_lex/0.7.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #13279
-crate/cratesio/-/colorchoice/1.0.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/concurrent-queue/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/const_format/0.2.31, Zlib, approved, clearlydefined
-crate/cratesio/-/const_format_proc_macros/0.2.31, Zlib, approved, clearlydefined
-crate/cratesio/-/cpufeatures/0.2.12, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/crossbeam-channel/0.5.8, Apache-2.0 AND MIT AND Apache-2.0 AND MIT AND (Apache-2.0 AND BSD-3-Clause AND CC-BY-3.0 AND MIT), approved, #9756
-crate/cratesio/-/crossbeam-utils/0.8.16, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/crypto-common/0.1.6, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/csv/1.2.2, Unlicense OR MIT, approved, clearlydefined
-crate/cratesio/-/csv-core/0.1.10, Unlicense OR MIT, approved, clearlydefined
-crate/cratesio/-/curl/0.4.44, MIT AND curl, approved, #9765
-crate/cratesio/-/curl-sys/0.4.65+curl-8.2.1, MIT, approved, #9784
-crate/cratesio/-/digest/0.10.7, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/dirs/5.0.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/dirs-sys/0.4.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/duration-str/0.7.1, Apache-2.0, approved, clearlydefined
-crate/cratesio/-/dyn-clone/1.0.16, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/either/1.9.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #10050
-crate/cratesio/-/encoding_rs/0.8.32, Apache-2.0 AND BSD-3-Clause AND MIT AND Apache-2.0 AND (Apache-2.0 AND CC0-1.0 AND MIT) AND MIT AND BSD-3-Clause AND (Apache-2.0 AND BSD-3-Clause AND CC0-1.0 AND MIT) AND (Apache-2.0 AND MIT) AND CC0-1.0, approved, #9762
-crate/cratesio/-/env_filter/0.1.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/env_logger/0.10.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/env_logger/0.11.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/equivalent/1.0.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/event-listener/2.5.3, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/event-listener/3.1.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/event-listener/4.0.3, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/event-listener/5.0.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/event-listener-strategy/0.4.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/event-listener-strategy/0.5.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/fastrand/1.9.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/fastrand/2.0.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/fixedbitset/0.4.2, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4250
-crate/cratesio/-/flume/0.11.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/fnv/1.0.7, Apache-2.0 AND MIT, approved, clearlydefined
-crate/cratesio/-/form_urlencoded/1.2.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-channel/0.3.28, Apache-2.0 AND MIT AND Apache-2.0 AND MIT AND BSD-2-Clause-Views, approved, #6671
-crate/cratesio/-/futures-core/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-executor/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-io/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-lite/1.13.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/futures-lite/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/futures-macro/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-sink/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-task/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/futures-timer/3.0.2, Apache-2.0 AND MIT, approved, clearlydefined
-crate/cratesio/-/futures-util/0.3.28, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/generic-array/0.14.7, MIT, approved, clearlydefined
-crate/cratesio/-/getrandom/0.2.10, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/git-version/0.3.9, BSD-2-Clause, approved, clearlydefined
-crate/cratesio/-/git-version-macro/0.3.9, BSD-2-Clause, approved, clearlydefined
-crate/cratesio/-/h2/0.3.24, MIT, approved, clearlydefined
-crate/cratesio/-/h2/0.4.1, MIT, approved, clearlydefined
-crate/cratesio/-/hashbrown/0.12.3, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/hashbrown/0.13.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/hashbrown/0.14.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/heck/0.4.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/hex/0.4.3, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/hmac/0.12.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/home/0.5.9, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/http/0.2.9, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/http/1.0.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/httparse/1.8.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4256
-crate/cratesio/-/http-body/0.4.5, MIT, approved, clearlydefined
-crate/cratesio/-/http-body/1.0.0, MIT, approved, clearlydefined
-crate/cratesio/-/http-body-util/0.1.0, MIT, approved, clearlydefined
-crate/cratesio/-/httpdate/1.0.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/humantime/2.1.0, Apache-2.0 OR (Apache-2.0 AND MIT), approved, clearlydefined
-crate/cratesio/-/hyper/0.14.27, MIT, approved, clearlydefined
-crate/cratesio/-/hyper/1.1.0, MIT, approved, clearlydefined
-crate/cratesio/-/hyper-timeout/0.4.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/hyper-util/0.1.2, MIT, approved, clearlydefined
-crate/cratesio/-/iana-time-zone/0.1.57, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/idna/0.4.0, Apache-2.0 AND MIT AND Unicode-TOU, approved, #9786
-crate/cratesio/-/indexmap/1.9.3, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/indexmap/2.0.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/influxrs/2.0.1, MIT, approved, clearlydefined
-crate/cratesio/-/inout/0.1.3, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/io-lifetimes/1.0.11, Apache-2.0 AND MIT, approved, #10134
-crate/cratesio/-/ipnetwork/0.20.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/isahc/1.7.2, MIT AND CC-BY-4.0 AND MPL-2.0, approved, #9775
-crate/cratesio/-/is-terminal/0.4.12, MIT, approved, clearlydefined
-crate/cratesio/-/itertools/0.10.5, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4247
-crate/cratesio/-/itoa/1.0.9, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/json5/0.4.1, ISC, approved, clearlydefined
-crate/cratesio/-/keccak/0.1.5, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/keyed-set/0.4.5, EPL-2.0, approved, clearlydefined
-crate/cratesio/-/kv-log-macro/1.0.7, Apache-2.0 AND MIT, approved, clearlydefined
-crate/cratesio/-/lazy_static/1.4.0, Apache-2.0 AND MIT, approved, clearlydefined
-crate/cratesio/-/libc/0.2.150, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/libloading/0.8.1, ISC, approved, clearlydefined
-crate/cratesio/-/libnghttp2-sys/0.1.7+1.45.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #9783
-crate/cratesio/-/libz-sys/1.1.12, Apache-2.0 AND BSL-1.0 AND MIT AND CC-BY-3.0 AND CC-BY-4.0 AND LicenseRef-Public-domain AND (GPL-2.0-or-later AND LicenseRef-scancode-ada-linking-exception) AND Info-ZIP AND NTP AND Zlib, approved, #9763
-crate/cratesio/-/linux-raw-sys/0.3.8, Apache-2.0 AND MIT, approved, #10128
-crate/cratesio/-/linux-raw-sys/0.4.13, Apache-2.0 AND MIT, approved, #9787
-crate/cratesio/-/lock_api/0.4.11, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/log/0.4.19, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/lz4_flex/0.11.2, MIT, approved, clearlydefined
-crate/cratesio/-/matchit/0.7.0, MIT, approved, clearlydefined
-crate/cratesio/-/memchr/2.5.0, Unlicense OR MIT, approved, clearlydefined
-crate/cratesio/-/mime/0.3.17, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/minimal-lexical/0.2.1, Apache-2.0 AND MIT AND BSD-3-Clause AND (Apache-2.0 AND MIT) AND licenseRef-Public-Domain, approved, #9755
-crate/cratesio/-/mio/0.8.10, MIT, approved, #11387
-crate/cratesio/-/nanorand/0.7.0, Zlib AND (Apache-2.0 AND BSD-3-Clause), approved, #4265
-crate/cratesio/-/nom/7.1.3, MIT AND CC0-1.0, approved, #9761
-crate/cratesio/-/no-std-net/0.6.0, MIT, approved, clearlydefined
-crate/cratesio/-/num_cpus/1.16.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/num_enum/0.5.11, BSD-3-Clause OR (MIT OR Apache-2.0), approved, clearlydefined
-crate/cratesio/-/num_enum_derive/0.5.11, BSD-3-Clause OR (MIT OR Apache-2.0), approved, clearlydefined
-crate/cratesio/-/num-traits/0.2.16, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/once_cell/1.18.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/openssl-probe/0.1.5, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/openssl-sys/0.9.95, MIT AND (Apache-2.0 AND MIT), approved, #9757
-crate/cratesio/-/option-ext/0.2.0, MPL-2.0, approved, clearlydefined
-crate/cratesio/-/ordered-float/4.2.0, MIT, approved, clearlydefined
-crate/cratesio/-/paho-mqtt/0.12.3, EPL-1.0 OR BSD-3-Clause, approved, #9785
-crate/cratesio/-/paho-mqtt-sys/0.9.0, , approved, #11611
-crate/cratesio/-/parking/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/paste/1.0.14, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/percent-encoding/2.3.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pest/2.7.7, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pest_derive/2.7.7, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pest_generator/2.7.7, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pest_meta/2.7.7, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/petgraph/0.6.3, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pin-project/1.1.2, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/pin-project-internal/1.1.2, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/pin-project-lite/0.2.13, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/pin-utils/0.1.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/piper/0.2.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_base/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_datalink/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_macros/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_macros_support/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_packet/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_sys/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/pnet_transport/0.34.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/polling/2.8.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/polling/3.4.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/ppv-lite86/0.2.17, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/proc-macro2/1.0.78, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/proc-macro-crate/1.3.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/prost/0.12.1, Apache-2.0, approved, #10594
-crate/cratesio/-/prost-derive/0.12.1, Apache-2.0, approved, #11612
-crate/cratesio/-/prost-types/0.12.1, Apache-2.0 AND BSD-3-Clause, approved, #10593
-crate/cratesio/-/protobuf/3.3.0, MIT, approved, clearlydefined
-crate/cratesio/-/protobuf-support/3.3.0, MIT, approved, clearlydefined
-crate/cratesio/-/quote/1.0.32, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/rand/0.8.5, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/rand_chacha/0.3.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/rand_core/0.6.4, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/rdkafka/0.36.0, MIT, approved, clearlydefined
-crate/cratesio/-/rdkafka-sys/4.7.0+2.3.0, MIT AND BSD-2-Clause AND Zlib AND BSD-3-Clause AND ISC AND Apache-2.0 and LicenseRef-MSVC-Runtime, approved, https://gitlab.eclipse.org/eclip
-crate/cratesio/-/regex/1.9.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/regex-automata/0.3.3, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/regex-syntax/0.7.4, Apache-2.0 AND MIT AND Apache-2.0 AND MIT AND Unicode-DFS-2016, approved, #9758
-crate/cratesio/-/ring/0.17.7, ISC AND OpenSSL AND MIT AND (OpenSSL OR LicenseRef-Cryptogams) AND LicenseRef-Public-domain AND LicenseRef-SSLeay, approved, #11393
-crate/cratesio/-/ringbuffer-spsc/0.1.9, EPL-2.0, approved, #4242
-crate/cratesio/-/rustc_version/0.4.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/rust_decimal/1.30.0, MIT, approved, clearlydefined
-crate/cratesio/-/rustix/0.37.27, Apache-2.0 AND MIT, approved, #10131
-crate/cratesio/-/rustix/0.38.28, Apache-2.0 AND MIT, approved, #10049
-crate/cratesio/-/rustls/0.22.2, Apache-2.0 OR (ISC OR MIT), approved, clearlydefined
-crate/cratesio/-/rustls-pemfile/2.0.0, Apache-2.0 OR (ISC OR MIT), approved, clearlydefined
-crate/cratesio/-/rustls-pki-types/1.2.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/rustls-webpki/0.102.2, ISC, approved, #13228
-crate/cratesio/-/ryu/1.0.15, Apache-2.0 AND BSL-1.0 AND CC-BY-SA-3.0, approved, #4267
-crate/cratesio/-/schemars/0.8.16, MIT, approved, clearlydefined
-crate/cratesio/-/schemars_derive/0.8.16, MIT, approved, clearlydefined
-crate/cratesio/-/scopeguard/1.2.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/secrecy/0.8.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/semver/1.0.21, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/serde/1.0.193, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/serde_derive/1.0.193, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/serde_derive_internals/0.26.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/serde_json/1.0.104, Apache-2.0 AND MIT, approved, #4264
-crate/cratesio/-/serde_path_to_error/0.1.14, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/serde_urlencoded/0.7.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/serde_yaml/0.9.29, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/sha3/0.10.8, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/shellexpand/3.1.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/signal-hook-registry/1.4.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/slab/0.4.8, MIT, approved, clearlydefined
-crate/cratesio/-/sluice/0.5.5, MIT, approved, clearlydefined
-crate/cratesio/-/socket2/0.4.9, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/socket2/0.5.5, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/spin/0.9.8, MIT AND (Apache-2.0 AND MIT), approved, #4257
-crate/cratesio/-/static_assertions/1.1.0, Apache-2.0 AND MIT, approved, clearlydefined
-crate/cratesio/-/stop-token/0.7.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/strsim/0.11.0, MIT, approved, clearlydefined
-crate/cratesio/-/subtle/2.5.0, BSD-3-Clause, approved, #13229
-crate/cratesio/-/syn/1.0.109, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/syn/2.0.43, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/sync_wrapper/0.1.2, Apache-2.0, approved, clearlydefined
-crate/cratesio/-/termcolor/1.4.1, Unlicense OR MIT, approved, clearlydefined
-crate/cratesio/-/thiserror/1.0.44, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/thiserror-impl/1.0.44, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/time/0.3.23, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/time-core/0.1.1, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/tinyvec/1.6.0, Zlib OR (Apache-2.0 OR MIT), approved, clearlydefined
-crate/cratesio/-/tinyvec_macros/0.1.1, MIT OR (Apache-2.0 OR Zlib), approved, clearlydefined
-crate/cratesio/-/token-cell/1.5.0, EPL-2.0, approved, clearlydefined
-crate/cratesio/-/tokio/1.36.0, MIT, approved, clearlydefined
-crate/cratesio/-/tokio-io-timeout/1.2.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/tokio-macros/2.2.0, MIT, approved, clearlydefined
-crate/cratesio/-/tokio-rustls/0.25.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/tokio-stream/0.1.14, MIT, approved, clearlydefined
-crate/cratesio/-/tokio-util/0.7.8, MIT, approved, #11389
-crate/cratesio/-/toml_datetime/0.6.3, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/toml_edit/0.19.14, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/tonic/0.11.0, MIT AND Apache-2.0, approved, #13227
-crate/cratesio/-/tower/0.4.13, MIT AND Apache-2.0, approved, #6661
-crate/cratesio/-/tower-layer/0.3.2, MIT, approved, clearlydefined
-crate/cratesio/-/tower-service/0.3.2, MIT, approved, clearlydefined
-crate/cratesio/-/tracing/0.1.37, MIT, approved, clearlydefined
-crate/cratesio/-/tracing-attributes/0.1.26, MIT, approved, clearlydefined
-crate/cratesio/-/tracing-core/0.1.31, MIT, approved, clearlydefined
-crate/cratesio/-/tracing-futures/0.2.5, MIT, approved, clearlydefined
-crate/cratesio/-/try-lock/0.2.4, MIT, approved, clearlydefined
-crate/cratesio/-/twox-hash/1.6.3, MIT, approved, clearlydefined
-crate/cratesio/-/typenum/1.17.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/ucd-trie/0.1.6, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/uhlc/0.6.3, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/unicode-bidi/0.3.13, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/unicode-ident/1.0.11, Apache-2.0 AND MIT AND LicenseRef-unicode, approved, #4138
-crate/cratesio/-/unicode-normalization/0.1.22, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/unicode-xid/0.2.4, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/unsafe-libyaml/0.2.10, MIT, approved, clearlydefined
-crate/cratesio/-/untrusted/0.9.0, ISC AND (ISC AND MIT), approved, #7111
-crate/cratesio/-/unzip-n/0.1.2, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/url/2.4.0, MIT OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/utf8parse/0.2.1, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/uuid/1.7.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/validated_struct/2.1.0, EPL-2.0, approved, clearlydefined
-crate/cratesio/-/validated_struct_macros/2.1.0, EPL-2.0, approved, clearlydefined
-crate/cratesio/-/value-bag/1.7.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/vec_map/0.8.2, Apache-2.0 AND MIT, approved, clearlydefined
-crate/cratesio/-/waker-fn/1.1.0, Apache-2.0 OR MIT, approved, clearlydefined
-crate/cratesio/-/want/0.3.1, MIT, approved, clearlydefined
-crate/cratesio/-/winnow/0.5.1, MIT, approved, #9760
-crate/cratesio/-/zenoh/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-buffers/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-codec/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-collections/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-config/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-core/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-crypto/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-keyexpr/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-link/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-link-commons/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-link-tcp/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-macros/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-plugin-trait/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-protocol/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-result/0.10.1-rc, Apache-2.0 AND EPL-2.0 AND (EPL-2.0 OR Apache-2.0), approved, #13278
-crate/cratesio/-/zenoh-sync/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-transport/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zenoh-util/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined
-crate/cratesio/-/zerocopy/0.7.32, Apache-2.0 AND BSD-3-Clause AND MIT AND (Apache-2.0 AND BSD-2-Clause AND MIT) AND (Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND MIT) AND Apache-2.0 AND BSD-2-Clause AND MIT AND (Apache-2.0 AND MIT) AND BSD-3-Clause, approved, #13277
-crate/cratesio/-/zeroize/1.7.0, Apache-2.0 OR MIT, approved, clearlydefined
diff --git a/README.md b/README.md
index 2bde456..fdc22c2 100644
--- a/README.md
+++ b/README.md
@@ -29,24 +29,28 @@ for truck fleet management where trucks run an SDV software stack so that logist
manage apps, data and services for a diverse set of vehicles.
The use case illustrates how the standard VSS model can be customized and used to report data from a vehicle
-to a back end. The following diagram provides an overview of the current architecture:
+to a back end. It also shows how [Eclipse uProtocol™](https://eclipse-uprotocol.github.io) can be used
+to connect in-vehicle components to an off-vehicle service in the back end. The following diagram provides
+an overview of the current architecture:
-
+
The overall idea is to enable back end applications to consume data coming from a vehicle using the rFMS API.
Data originates from the vehicle's sensors which are represented by a CSV file that is being played back by the
-kuksa.val CSV feeder. The CSV feeder publishes the data to the kuksa.val Databroker. From there, the FMS Forwarder
-consumes the data and writes it to an InfluxDB in the back end. The measurements in the InfluxDB can then be
-visualized in a web browser by means of a Grafana dashboard. Alternatively, the measurements can be retrieved by
-a Fleet Management application via the FMS Server's (HTTP based) rFMS API.
+[Eclipse Kuksa™ CSV Provider](https://github.com/eclipse-kuksa/kuksa-csv-provider). The *CSV Provider* publishes
+the data to the [Kuksa Databroker](https://github.com/eclipse-kuksa/kuksa-databroker).
+The *FMS Forwarder* reads the signal values from the Databroker and sends them to the *FMS Consumer* in the back end
+using uProtocol _Notifications_. The FMS Consumer then writes the measurements to an *InfluxDB* from where it
+can be visualized in a web browser by means of a *Grafana* dashboard. Alternatively, the measurements can be
+retrieved by a Fleet Management application via the *FMS Server's* (HTTP based) rFMS API.
# Quick Start
The easiest way to set up and start the services is by means of using the Docker Compose file in the top level folder:
```sh
-docker compose -f ./fms-blueprint-compose.yaml up --detach
+docker compose -f ./fms-blueprint-compose.yaml -f ./fms-blueprint-compose-zenoh.yaml up --detach
```
This will pull or build (if necessary) the container images and create and start all components.
@@ -61,17 +65,21 @@ The rFMS API can be used to retrieve the data, e.g.
curl -v -s http://127.0.0.1:8081/rfms/vehicleposition?latestOnly=true | jq
```
-# Using Eclipse Hono to send Vehicle Data to Back End
+# Eclipse Zenoh™ Transport
+
+By default, the Docker Compose files start the _FMS Forwarder_ and _FMS Consumer_ using a [Zenoh](https://zenoh.io) based uProtocol transport.
-By default, the Docker Compose file starts the FMS Forwarder configured to write vehicle data directly to the
-Influx DB running in the back end.
+
-However, in a real world scenario, this tight coupling between the vehicle and the Influx DB is not desirable.
-As an alternative, the blueprint supports configuring the FMS Forwarder to send vehicle data to the MQTT adapter
-of an Eclipse Hono instance as shown in the diagram below.
+# Eclipse Hono™ based Transport
+
+The blueprint can also be configured to use a Hono based uProtocol transport that employs Hono's MQTT adapter
+and Apache Kafka™ based messaging infrastructure for sending vehicle data to the Consumer.
+In order to run the blueprint with the Hono transport, perform the following steps:
+
1. Register the vehicle as a device in Hono using the [create-config-hono.sh shell script](./create-config-hono.sh):
```sh
@@ -95,26 +103,6 @@ of an Eclipse Hono instance as shown in the diagram below.
The path set via the `--env-file` option needs to be adapted to the output folder specified in the previous step.
- The second compose file specified on the command line will also start the [FMS Consumer](./components/fms-consumer)
- back end component which receives vehicle data via Hono's north bound Kafka based Telemetry API and writes it to the
- Influx DB.
-
-# Using Eclipse Zenoh to geographically distribute the vehicle data
-
-The blueprint supports configuring the FMS Forwarder to send vehicle data to the Eclipse Zenoh router of an [Eclipse Zenoh](https://zenoh.io/) instance as shown in the diagram below.
-Zenoh router provides a plugin mechanism to other protocols to enable the Vehicle to anything communication.
-
-
-
-Start up the vehicle and back end services using Docker Compose:
-
-```sh
-docker compose -f ./fms-blueprint-compose.yaml -f ./fms-blueprint-compose-zenoh.yaml up --detach
-```
-
-Once all services have been started, the current vehicle status can be viewed on a [Grafana dashboard](http://127.0.0.1:3000),
-using *admin*/*admin* as username and password for logging in.
-
# Manual configuration
All information required for setting up the networks, volumes, configs and containers is contained in the
@@ -125,5 +113,6 @@ Additional information can be found in the components' corresponding subfolders.
# Contributing
-We are looking forward to your ideas and PRs. Each PRs triggers a GitHub action which checks the formating, performs linting and runs the test. You can performe similar check in your development environment. For more details check the respective [action](.github/workflows/lint_source_code.yaml) where the checks are listed in the bottom of the file.
-
+We are looking forward to your ideas and PRs. Each PRs triggers a GitHub action which checks the formating, performs
+linting and runs the test. You can performe similar check in your development environment. For more details check the
+respective [action](.github/workflows/lint_source_code.yaml) where the checks are listed in the bottom of the file.
diff --git a/components/Cargo.lock b/components/Cargo.lock
index d33640a..4191b7f 100644
--- a/components/Cargo.lock
+++ b/components/Cargo.lock
@@ -4,18 +4,18 @@ version = 3
[[package]]
name = "addr2line"
-version = "0.20.0"
+version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
[[package]]
-name = "adler"
-version = "1.0.2"
+name = "adler2"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
[[package]]
name = "aes"
@@ -43,18 +43,18 @@ dependencies = [
[[package]]
name = "aho-corasick"
-version = "1.0.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "allocator-api2"
-version = "0.2.16"
+version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
[[package]]
name = "android-tzdata"
@@ -73,50 +73,51 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.11"
+version = "0.6.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
+checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
+ "is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
-version = "1.0.1"
+version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd"
+checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56"
[[package]]
name = "anstyle-parse"
-version = "0.2.1"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.0"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
dependencies = [
"anstyle",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -133,9 +134,48 @@ checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc"
[[package]]
name = "arrayvec"
-version = "0.7.4"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
+
+[[package]]
+name = "asn1-rs"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048"
+dependencies = [
+ "asn1-rs-derive",
+ "asn1-rs-impl",
+ "displaydoc",
+ "nom",
+ "num-traits",
+ "rusticata-macros",
+ "thiserror",
+ "time",
+]
+
+[[package]]
+name = "asn1-rs-derive"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.85",
+ "synstructure",
+]
+
+[[package]]
+name = "asn1-rs-impl"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.85",
+]
[[package]]
name = "async-channel"
@@ -156,7 +196,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -167,21 +207,21 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]]
name = "axum"
-version = "0.7.4"
+version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e"
+checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae"
dependencies = [
"async-trait",
"axum-core",
"bytes",
"futures-util",
- "http 1.0.0",
+ "http 1.1.0",
"http-body",
"http-body-util",
"hyper",
@@ -197,9 +237,9 @@ dependencies = [
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
- "sync_wrapper",
+ "sync_wrapper 1.0.1",
"tokio",
- "tower",
+ "tower 0.5.1",
"tower-layer",
"tower-service",
"tracing",
@@ -207,20 +247,20 @@ dependencies = [
[[package]]
name = "axum-core"
-version = "0.4.3"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3"
+checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
dependencies = [
"async-trait",
"bytes",
"futures-util",
- "http 1.0.0",
+ "http 1.1.0",
"http-body",
"http-body-util",
"mime",
"pin-project-lite",
"rustversion",
- "sync_wrapper",
+ "sync_wrapper 1.0.1",
"tower-layer",
"tower-service",
"tracing",
@@ -228,17 +268,17 @@ dependencies = [
[[package]]
name = "backtrace"
-version = "0.3.68"
+version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12"
+checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
dependencies = [
"addr2line",
- "cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -253,6 +293,12 @@ version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+[[package]]
+name = "base64ct"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -261,9 +307,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.4.2"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
dependencies = [
"serde",
]
@@ -279,9 +325,15 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.13.0"
+version = "3.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
@@ -303,30 +355,42 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6"
[[package]]
name = "cc"
-version = "1.0.83"
+version = "1.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f"
dependencies = [
- "libc",
+ "shlex",
]
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
[[package]]
name = "chrono"
-version = "0.4.26"
+version = "0.4.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
+checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
dependencies = [
"android-tzdata",
"iana-time-zone",
"num-traits",
"serde",
- "winapi",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -341,18 +405,19 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.0"
+version = "4.5.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f"
+checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8"
dependencies = [
"clap_builder",
+ "clap_derive",
]
[[package]]
name = "clap_builder"
-version = "4.5.0"
+version = "4.5.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99"
+checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54"
dependencies = [
"anstream",
"anstyle",
@@ -360,26 +425,48 @@ dependencies = [
"strsim",
]
+[[package]]
+name = "clap_derive"
+version = "4.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.85",
+]
+
[[package]]
name = "clap_lex"
-version = "0.7.0"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
[[package]]
name = "cmake"
-version = "0.1.50"
+version = "0.1.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
+checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a"
dependencies = [
"cc",
]
[[package]]
name = "colorchoice"
-version = "1.0.0"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+
+[[package]]
+name = "combine"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
+dependencies = [
+ "bytes",
+ "memchr",
+]
[[package]]
name = "concurrent-queue"
@@ -390,6 +477,12 @@ dependencies = [
"crossbeam-utils",
]
+[[package]]
+name = "const-oid"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+
[[package]]
name = "const_format"
version = "0.2.33"
@@ -410,28 +503,37 @@ dependencies = [
"unicode-xid",
]
+[[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.4"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
-version = "0.2.12"
+version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0"
dependencies = [
"libc",
]
[[package]]
name = "crossbeam-channel"
-version = "0.5.8"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
- "cfg-if",
"crossbeam-utils",
]
@@ -474,24 +576,24 @@ dependencies = [
[[package]]
name = "curl"
-version = "0.4.44"
+version = "0.4.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
+checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265"
dependencies = [
"curl-sys",
"libc",
"openssl-probe",
"openssl-sys",
"schannel",
- "socket2 0.4.9",
- "winapi",
+ "socket2",
+ "windows-sys 0.52.0",
]
[[package]]
name = "curl-sys"
-version = "0.4.65+curl-8.2.1"
+version = "0.4.77+curl-8.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "961ba061c9ef2fe34bbd12b807152d96f0badd2bebe7b90ce6c8c8b7572a0986"
+checksum = "f469e8a5991f277a208224f6c7ad72ecb5f986e36d09ae1f2c1bb9259478a480"
dependencies = [
"cc",
"libc",
@@ -500,7 +602,47 @@ dependencies = [
"openssl-sys",
"pkg-config",
"vcpkg",
- "winapi",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2"
+
+[[package]]
+name = "der"
+version = "0.7.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
+dependencies = [
+ "const-oid",
+ "pem-rfc7468",
+ "zeroize",
+]
+
+[[package]]
+name = "der-parser"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553"
+dependencies = [
+ "asn1-rs",
+ "displaydoc",
+ "nom",
+ "num-bigint",
+ "num-traits",
+ "rusticata-macros",
+]
+
+[[package]]
+name = "deranged"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+dependencies = [
+ "powerfmt",
]
[[package]]
@@ -510,6 +652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
+ "const-oid",
"crypto-common",
"subtle",
]
@@ -535,6 +678,17 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "displaydoc"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.85",
+]
+
[[package]]
name = "duration-str"
version = "0.7.1"
@@ -549,39 +703,39 @@ dependencies = [
[[package]]
name = "dyn-clone"
-version = "1.0.16"
+version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d"
+checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
[[package]]
name = "either"
-version = "1.9.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "encoding_rs"
-version = "0.8.32"
+version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [
"cfg-if",
]
[[package]]
name = "env_filter"
-version = "0.1.0"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea"
+checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab"
dependencies = [
"log",
]
[[package]]
name = "env_logger"
-version = "0.11.1"
+version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05e7cf40684ae96ade6232ed84582f40ce0a66efcd43a5117aef610534f8e0b8"
+checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
dependencies = [
"env_filter",
"humantime",
@@ -596,9 +750,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -632,9 +786,9 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
+checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
[[package]]
name = "fixedbitset"
@@ -644,9 +798,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
[[package]]
name = "flume"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
dependencies = [
"futures-core",
"futures-sink",
@@ -660,17 +814,15 @@ version = "0.1.0-SNAPSHOT"
dependencies = [
"async-trait",
"clap",
- "duration-str",
"env_logger",
"fms-proto",
- "futures",
+ "fms-util",
"influx-client",
"log",
- "openssl-src",
- "protobuf",
- "rdkafka",
"tokio",
- "zenoh",
+ "up-rust",
+ "up-transport-hono-kafka",
+ "up-transport-zenoh",
]
[[package]]
@@ -683,9 +835,9 @@ dependencies = [
"duration-str",
"env_logger",
"fms-proto",
+ "fms-util",
"influx-client",
"log",
- "paho-mqtt",
"prost",
"prost-types",
"protobuf",
@@ -693,7 +845,9 @@ dependencies = [
"tokio",
"tonic",
"tonic-build",
- "zenoh",
+ "up-rust",
+ "up-transport-hono-mqtt",
+ "up-transport-zenoh",
]
[[package]]
@@ -723,6 +877,15 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "fms-util"
+version = "0.1.0-SNAPSHOT"
+dependencies = [
+ "clap",
+ "log",
+ "zenoh",
+]
+
[[package]]
name = "fnv"
version = "1.0.7"
@@ -731,9 +894,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "form_urlencoded"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
dependencies = [
"percent-encoding",
]
@@ -809,7 +972,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -826,9 +989,9 @@ checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
[[package]]
name = "futures-timer"
-version = "3.0.2"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
+checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
[[package]]
name = "futures-util"
@@ -860,9 +1023,9 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.10"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"js-sys",
@@ -873,9 +1036,9 @@ dependencies = [
[[package]]
name = "gimli"
-version = "0.27.3"
+version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
+checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "git-version"
@@ -894,7 +1057,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -908,7 +1071,7 @@ dependencies = [
"fnv",
"futures-core",
"futures-sink",
- "http 1.0.0",
+ "http 1.1.0",
"indexmap 2.6.0",
"slab",
"tokio",
@@ -940,9 +1103,9 @@ checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
[[package]]
name = "heck"
-version = "0.4.1"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
@@ -970,9 +1133,9 @@ dependencies = [
[[package]]
name = "http"
-version = "0.2.9"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
dependencies = [
"bytes",
"fnv",
@@ -981,9 +1144,9 @@ dependencies = [
[[package]]
name = "http"
-version = "1.0.0"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
dependencies = [
"bytes",
"fnv",
@@ -992,38 +1155,38 @@ dependencies = [
[[package]]
name = "http-body"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes",
- "http 1.0.0",
+ "http 1.1.0",
]
[[package]]
name = "http-body-util"
-version = "0.1.0"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
dependencies = [
"bytes",
"futures-util",
- "http 1.0.0",
+ "http 1.1.0",
"http-body",
"pin-project-lite",
]
[[package]]
name = "httparse"
-version = "1.8.0"
+version = "1.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946"
[[package]]
name = "httpdate"
-version = "1.0.2"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "humantime"
@@ -1041,7 +1204,7 @@ dependencies = [
"futures-channel",
"futures-util",
"h2",
- "http 1.0.0",
+ "http 1.1.0",
"http-body",
"httparse",
"httpdate",
@@ -1074,11 +1237,11 @@ dependencies = [
"bytes",
"futures-channel",
"futures-util",
- "http 1.0.0",
+ "http 1.1.0",
"http-body",
"hyper",
"pin-project-lite",
- "socket2 0.5.7",
+ "socket2",
"tokio",
"tower-service",
"tracing",
@@ -1086,16 +1249,16 @@ dependencies = [
[[package]]
name = "iana-time-zone"
-version = "0.1.57"
+version = "0.1.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "windows",
+ "windows-core",
]
[[package]]
@@ -1109,9 +1272,9 @@ dependencies = [
[[package]]
name = "idna"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
dependencies = [
"unicode-bidi",
"unicode-normalization",
@@ -1172,9 +1335,9 @@ dependencies = [
[[package]]
name = "instant"
-version = "0.1.12"
+version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
dependencies = [
"cfg-if",
]
@@ -1188,6 +1351,12 @@ dependencies = [
"serde",
]
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
+
[[package]]
name = "isahc"
version = "1.7.2"
@@ -1202,7 +1371,7 @@ dependencies = [
"encoding_rs",
"event-listener 2.5.3",
"futures-lite",
- "http 0.2.9",
+ "http 0.2.12",
"log",
"mime",
"once_cell",
@@ -1217,33 +1386,44 @@ dependencies = [
[[package]]
name = "itertools"
-version = "0.10.5"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]]
-name = "itertools"
-version = "0.13.0"
+name = "itoa"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+
+[[package]]
+name = "jni"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec"
dependencies = [
- "either",
+ "cesu8",
+ "combine",
+ "jni-sys",
+ "log",
+ "thiserror",
+ "walkdir",
]
[[package]]
-name = "itoa"
-version = "1.0.9"
+name = "jni-sys"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "js-sys"
-version = "0.3.64"
+version = "0.3.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9"
dependencies = [
"wasm-bindgen",
]
@@ -1282,6 +1462,9 @@ name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+dependencies = [
+ "spin",
+]
[[package]]
name = "libc"
@@ -1291,19 +1474,25 @@ checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
[[package]]
name = "libloading"
-version = "0.8.1"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161"
+checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
dependencies = [
"cfg-if",
- "windows-sys 0.48.0",
+ "windows-targets 0.52.6",
]
+[[package]]
+name = "libm"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
+
[[package]]
name = "libnghttp2-sys"
-version = "0.1.7+1.45.0"
+version = "0.1.10+1.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f"
+checksum = "959c25552127d2e1fa72f0e52548ec04fc386e827ba71a7bd01db46a447dc135"
dependencies = [
"cc",
"libc",
@@ -1311,20 +1500,19 @@ dependencies = [
[[package]]
name = "libredox"
-version = "0.0.1"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.6.0",
"libc",
- "redox_syscall 0.4.1",
]
[[package]]
name = "libz-sys"
-version = "1.1.12"
+version = "1.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b"
+checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472"
dependencies = [
"cc",
"libc",
@@ -1334,15 +1522,15 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
-version = "0.4.13"
+version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "lock_api"
-version = "0.4.11"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
dependencies = [
"autocfg",
"scopeguard",
@@ -1350,15 +1538,15 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.19"
+version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "lz4_flex"
-version = "0.11.2"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "912b45c753ff5f7f5208307e8ace7d2a2e30d024e26d3509f3dce546c044ce15"
+checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5"
dependencies = [
"twox-hash",
]
@@ -1374,15 +1562,21 @@ dependencies = [
[[package]]
name = "matchit"
-version = "0.7.0"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
+[[package]]
+name = "mediatype"
+version = "0.19.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40"
+checksum = "8878cd8d1b3c8c8ae4b2ba0a36652b7cf192f618a599a7fbdfa25cffd4ea72dd"
[[package]]
name = "memchr"
-version = "2.5.0"
+version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "mime"
@@ -1398,11 +1592,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.7.1"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
dependencies = [
- "adler",
+ "adler2",
]
[[package]]
@@ -1419,9 +1613,9 @@ dependencies = [
[[package]]
name = "multimap"
-version = "0.8.3"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
+checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
[[package]]
name = "nanorand"
@@ -1432,6 +1626,18 @@ dependencies = [
"getrandom",
]
+[[package]]
+name = "nix"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
+dependencies = [
+ "bitflags 2.6.0",
+ "cfg-if",
+ "cfg_aliases",
+ "libc",
+]
+
[[package]]
name = "no-std-net"
version = "0.6.0"
@@ -1458,13 +1664,67 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "num-bigint"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+dependencies = [
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint-dig"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
+dependencies = [
+ "byteorder",
+ "lazy_static",
+ "libm",
+ "num-integer",
+ "num-iter",
+ "num-traits",
+ "rand",
+ "smallvec",
+ "zeroize",
+]
+
+[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
[[package]]
name = "num-traits"
-version = "0.2.16"
+version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
+ "libm",
]
[[package]]
@@ -1500,13 +1760,22 @@ dependencies = [
[[package]]
name = "object"
-version = "0.31.1"
+version = "0.36.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1"
+checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e"
dependencies = [
"memchr",
]
+[[package]]
+name = "oid-registry"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9"
+dependencies = [
+ "asn1-rs",
+]
+
[[package]]
name = "once_cell"
version = "1.20.2"
@@ -1521,18 +1790,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
-version = "300.1.6+3.1.4"
+version = "300.4.0+3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085"
+checksum = "a709e02f2b4aca747929cca5ed248880847c650233cf8b8cdc48f40aaf4898a6"
dependencies = [
"cc",
]
[[package]]
name = "openssl-sys"
-version = "0.9.95"
+version = "0.9.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9"
+checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
dependencies = [
"cc",
"libc",
@@ -1547,6 +1816,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+[[package]]
+name = "outref"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a"
+
[[package]]
name = "overload"
version = "0.1.1"
@@ -1555,9 +1830,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "paho-mqtt"
-version = "0.12.3"
+version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19e405de34b835fb6457d8b0169eda21949f855472b3e346556af9e29fac6eb2"
+checksum = "b8367868d51cef74c28da328ed8f60529ddd3f04dca1867dd825fcc3085a4308"
dependencies = [
"async-channel",
"crossbeam-channel",
@@ -1581,9 +1856,9 @@ dependencies = [
[[package]]
name = "parking"
-version = "2.2.0"
+version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae"
+checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]]
name = "paste"
@@ -1592,16 +1867,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
-name = "percent-encoding"
-version = "2.3.0"
+name = "pem-rfc7468"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
+dependencies = [
+ "base64ct",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
-version = "2.7.7"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546"
+checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442"
dependencies = [
"memchr",
"thiserror",
@@ -1610,9 +1894,9 @@ dependencies = [
[[package]]
name = "pest_derive"
-version = "2.7.7"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809"
+checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd"
dependencies = [
"pest",
"pest_generator",
@@ -1620,22 +1904,22 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.7.7"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e"
+checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
name = "pest_meta"
-version = "2.7.7"
+version = "2.7.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a"
+checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d"
dependencies = [
"once_cell",
"pest",
@@ -1682,7 +1966,7 @@ dependencies = [
"phf_shared",
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -1696,29 +1980,29 @@ dependencies = [
[[package]]
name = "pin-project"
-version = "1.1.2"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842"
+checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
-version = "1.1.2"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c"
+checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
[[package]]
name = "pin-utils"
@@ -1726,11 +2010,32 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+[[package]]
+name = "pkcs1"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
+dependencies = [
+ "der",
+ "pkcs8",
+ "spki",
+]
+
+[[package]]
+name = "pkcs8"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
+dependencies = [
+ "der",
+ "spki",
+]
+
[[package]]
name = "pkg-config"
-version = "0.3.27"
+version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
[[package]]
name = "pnet_base"
@@ -1780,20 +2085,29 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
[[package]]
name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
[[package]]
name = "prettyplease"
-version = "0.2.12"
+version = "0.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62"
+checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033"
dependencies = [
"proc-macro2",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -1808,9 +2122,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.88"
+version = "1.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9"
+checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
dependencies = [
"unicode-ident",
]
@@ -1833,7 +2147,7 @@ checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15"
dependencies = [
"bytes",
"heck",
- "itertools 0.10.5",
+ "itertools",
"log",
"multimap",
"once_cell",
@@ -1842,7 +2156,7 @@ dependencies = [
"prost",
"prost-types",
"regex",
- "syn 2.0.79",
+ "syn 2.0.85",
"tempfile",
]
@@ -1853,10 +2167,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5"
dependencies = [
"anyhow",
- "itertools 0.10.5",
+ "itertools",
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -1870,10 +2184,11 @@ dependencies = [
[[package]]
name = "protobuf"
-version = "3.6.0"
+version = "3.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3018844a02746180074f621e847703737d27d89d7f0721a7a4da317f88b16385"
+checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72"
dependencies = [
+ "bytes",
"once_cell",
"protobuf-support",
"thiserror",
@@ -1881,9 +2196,9 @@ dependencies = [
[[package]]
name = "protobuf-codegen"
-version = "3.6.0"
+version = "3.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "411c15a212b4de05eb8bc989fd066a74c86bd3c04e27d6e86bd7703b806d7734"
+checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144"
dependencies = [
"anyhow",
"once_cell",
@@ -1896,9 +2211,9 @@ dependencies = [
[[package]]
name = "protobuf-parse"
-version = "3.6.0"
+version = "3.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06f45f16b522d92336e839b5e40680095a045e36a1e7f742ba682ddc85236772"
+checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257"
dependencies = [
"anyhow",
"indexmap 2.6.0",
@@ -1912,62 +2227,119 @@ dependencies = [
[[package]]
name = "protobuf-support"
-version = "3.6.0"
+version = "3.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faf96d872914fcda2b66d66ea3fff2be7c66865d31c7bb2790cff32c0e714880"
+checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252"
dependencies = [
"thiserror",
]
[[package]]
name = "protoc-bin-vendored"
-version = "3.0.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "005ca8623e5633e298ad1f917d8be0a44bcf406bf3cde3b80e63003e49a3f27d"
+checksum = "dd89a830d0eab2502c81a9b8226d446a52998bb78e5e33cb2637c0cdd6068d99"
dependencies = [
"protoc-bin-vendored-linux-aarch_64",
"protoc-bin-vendored-linux-ppcle_64",
"protoc-bin-vendored-linux-x86_32",
"protoc-bin-vendored-linux-x86_64",
+ "protoc-bin-vendored-macos-aarch_64",
"protoc-bin-vendored-macos-x86_64",
"protoc-bin-vendored-win32",
]
[[package]]
name = "protoc-bin-vendored-linux-aarch_64"
-version = "3.0.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fb9fc9cce84c8694b6ea01cc6296617b288b703719b725b8c9c65f7c5874435"
+checksum = "f563627339f1653ea1453dfbcb4398a7369b768925eb14499457aeaa45afe22c"
[[package]]
name = "protoc-bin-vendored-linux-ppcle_64"
-version = "3.0.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02d2a07dcf7173a04d49974930ccbfb7fd4d74df30ecfc8762cf2f895a094516"
+checksum = "5025c949a02cd3b60c02501dd0f348c16e8fff464f2a7f27db8a9732c608b746"
[[package]]
name = "protoc-bin-vendored-linux-x86_32"
-version = "3.0.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54fef0b04fcacba64d1d80eed74a20356d96847da8497a59b0a0a436c9165b0"
+checksum = "9c9500ce67d132c2f3b572504088712db715755eb9adf69d55641caa2cb68a07"
[[package]]
name = "protoc-bin-vendored-linux-x86_64"
-version = "3.0.0"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5462592380cefdc9f1f14635bcce70ba9c91c1c2464c7feb2ce564726614cc41"
+
+[[package]]
+name = "protoc-bin-vendored-macos-aarch_64"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8782f2ce7d43a9a5c74ea4936f001e9e8442205c244f7a3d4286bd4c37bc924"
+checksum = "c637745681b68b4435484543667a37606c95ddacf15e917710801a0877506030"
[[package]]
name = "protoc-bin-vendored-macos-x86_64"
-version = "3.0.0"
+version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5de656c7ee83f08e0ae5b81792ccfdc1d04e7876b1d9a38e6876a9e09e02537"
+checksum = "38943f3c90319d522f94a6dfd4a134ba5e36148b9506d2d9723a82ebc57c8b55"
[[package]]
name = "protoc-bin-vendored-win32"
-version = "3.0.0"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dc55d7dec32ecaf61e0bd90b3d2392d721a28b95cfd23c3e176eccefbeab2f2"
+
+[[package]]
+name = "quinn"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684"
+dependencies = [
+ "bytes",
+ "pin-project-lite",
+ "quinn-proto",
+ "quinn-udp",
+ "rustc-hash",
+ "rustls",
+ "socket2",
+ "thiserror",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-proto"
+version = "0.11.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6"
+dependencies = [
+ "bytes",
+ "rand",
+ "ring",
+ "rustc-hash",
+ "rustls",
+ "rustls-platform-verifier",
+ "slab",
+ "thiserror",
+ "tinyvec",
+ "tracing",
+]
+
+[[package]]
+name = "quinn-udp"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9653c3ed92974e34c5a6e0a510864dab979760481714c172e0a34e437cb98804"
+checksum = "e346e016eacfff12233c243718197ca12f148c84e1e84268a896699b41c71780"
+dependencies = [
+ "cfg_aliases",
+ "libc",
+ "once_cell",
+ "socket2",
+ "tracing",
+ "windows-sys 0.59.0",
+]
[[package]]
name = "quote"
@@ -2010,9 +2382,9 @@ dependencies = [
[[package]]
name = "rdkafka"
-version = "0.36.0"
+version = "0.36.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54f02a5a40220f8a2dfa47ddb38ba9064475a5807a69504b6f91711df2eea63"
+checksum = "1beea247b9a7600a81d4cc33f659ce1a77e1988323d7d2809c7ed1c21f4c316d"
dependencies = [
"futures-channel",
"futures-util",
@@ -2040,29 +2412,11 @@ dependencies = [
"pkg-config",
]
-[[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
-dependencies = [
- "bitflags 1.3.2",
-]
-
[[package]]
name = "redox_users"
-version = "0.4.4"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
+checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
dependencies = [
"getrandom",
"libredox",
@@ -2071,14 +2425,14 @@ dependencies = [
[[package]]
name = "regex"
-version = "1.9.1"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575"
+checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
- "regex-automata 0.3.3",
- "regex-syntax 0.7.4",
+ "regex-automata 0.4.8",
+ "regex-syntax 0.8.5",
]
[[package]]
@@ -2092,13 +2446,13 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.3.3"
+version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310"
+checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.7.4",
+ "regex-syntax 0.8.5",
]
[[package]]
@@ -2109,22 +2463,23 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
-version = "0.7.4"
+version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
+checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "ring"
-version = "0.17.7"
+version = "0.17.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
+checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
+ "cfg-if",
"getrandom",
"libc",
"spin",
"untrusted",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -2144,16 +2499,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
dependencies = [
"base64 0.21.7",
- "bitflags 2.4.2",
+ "bitflags 2.6.0",
"serde",
"serde_derive",
]
+[[package]]
+name = "rsa"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+dependencies = [
+ "const-oid",
+ "digest",
+ "num-bigint-dig",
+ "num-integer",
+ "num-traits",
+ "pkcs1",
+ "pkcs8",
+ "rand_core",
+ "signature",
+ "spki",
+ "subtle",
+ "zeroize",
+]
+
[[package]]
name = "rust_decimal"
-version = "1.30.0"
+version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0446843641c69436765a35a5a77088e28c2e6a12da93e84aa3ab1cd4aa5a042"
+checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555"
dependencies = [
"arrayvec",
"num-traits",
@@ -2161,9 +2536,15 @@ dependencies = [
[[package]]
name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+
+[[package]]
+name = "rustc-hash"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
[[package]]
name = "rustc_version"
@@ -2174,13 +2555,22 @@ dependencies = [
"semver",
]
+[[package]]
+name = "rusticata-macros"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632"
+dependencies = [
+ "nom",
+]
+
[[package]]
name = "rustix"
-version = "0.38.28"
+version = "0.38.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
+checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a"
dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.6.0",
"errno",
"libc",
"linux-raw-sys",
@@ -2189,9 +2579,9 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.23.7"
+version = "0.23.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b"
+checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e"
dependencies = [
"log",
"once_cell",
@@ -2202,27 +2592,66 @@ dependencies = [
"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.0.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4"
+checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
dependencies = [
- "base64 0.21.7",
"rustls-pki-types",
]
[[package]]
name = "rustls-pki-types"
-version = "1.2.0"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
+
+[[package]]
+name = "rustls-platform-verifier"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490"
+dependencies = [
+ "core-foundation",
+ "core-foundation-sys",
+ "jni",
+ "log",
+ "once_cell",
+ "rustls",
+ "rustls-native-certs",
+ "rustls-platform-verifier-android",
+ "rustls-webpki",
+ "security-framework",
+ "security-framework-sys",
+ "webpki-roots",
+ "winapi",
+]
+
+[[package]]
+name = "rustls-platform-verifier-android"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf"
+checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
[[package]]
name = "rustls-webpki"
-version = "0.102.2"
+version = "0.102.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
+checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
dependencies = [
"ring",
"rustls-pki-types",
@@ -2231,23 +2660,32 @@ dependencies = [
[[package]]
name = "rustversion"
-version = "1.0.14"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
[[package]]
name = "ryu"
-version = "1.0.15"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
[[package]]
name = "schannel"
-version = "0.1.22"
+version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
+checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2272,7 +2710,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -2291,30 +2729,54 @@ dependencies = [
"zeroize",
]
+[[package]]
+name = "security-framework"
+version = "2.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
+dependencies = [
+ "bitflags 2.6.0",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "num-bigint",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
[[package]]
name = "semver"
-version = "1.0.21"
+version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
[[package]]
name = "serde"
-version = "1.0.210"
+version = "1.0.214"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
+checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.210"
+version = "1.0.214"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
+checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -2325,7 +2787,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -2342,9 +2804,9 @@ dependencies = [
[[package]]
name = "serde_path_to_error"
-version = "0.1.14"
+version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
+checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
dependencies = [
"itoa",
"serde",
@@ -2375,6 +2837,17 @@ dependencies = [
"unsafe-libyaml",
]
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
[[package]]
name = "sha2"
version = "0.10.8"
@@ -2414,6 +2887,22 @@ dependencies = [
"dirs",
]
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "signature"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
+dependencies = [
+ "digest",
+ "rand_core",
+]
+
[[package]]
name = "siphasher"
version = "0.3.11"
@@ -2422,9 +2911,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
[[package]]
name = "slab"
-version = "0.4.8"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
dependencies = [
"autocfg",
]
@@ -2446,16 +2935,6 @@ version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
-[[package]]
-name = "socket2"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
-dependencies = [
- "libc",
- "winapi",
-]
-
[[package]]
name = "socket2"
version = "0.5.7"
@@ -2475,6 +2954,16 @@ dependencies = [
"lock_api",
]
+[[package]]
+name = "spki"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
+dependencies = [
+ "base64ct",
+ "der",
+]
+
[[package]]
name = "static_assertions"
version = "1.1.0"
@@ -2483,15 +2972,15 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "subtle"
-version = "2.5.0"
+version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
@@ -2506,9 +2995,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.79"
+version = "2.0.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
+checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56"
dependencies = [
"proc-macro2",
"quote",
@@ -2521,37 +3010,54 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+[[package]]
+name = "sync_wrapper"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+
+[[package]]
+name = "synstructure"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.85",
+]
+
[[package]]
name = "tempfile"
-version = "3.7.0"
+version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998"
+checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
dependencies = [
"cfg-if",
- "fastrand 2.0.0",
- "redox_syscall 0.3.5",
+ "fastrand 2.1.1",
+ "once_cell",
"rustix",
- "windows-sys 0.48.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "thiserror"
-version = "1.0.44"
+version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90"
+checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.44"
+version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96"
+checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -2566,25 +3072,40 @@ dependencies = [
[[package]]
name = "time"
-version = "0.3.23"
+version = "0.3.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446"
+checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [
+ "deranged",
+ "itoa",
+ "num-conv",
+ "powerfmt",
"serde",
"time-core",
+ "time-macros",
]
[[package]]
name = "time-core"
-version = "0.1.1"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+
+[[package]]
+name = "time-macros"
+version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
+checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
+dependencies = [
+ "num-conv",
+ "time-core",
+]
[[package]]
name = "tinyvec"
-version = "1.6.0"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
dependencies = [
"tinyvec_macros",
]
@@ -2595,6 +3116,19 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+[[package]]
+name = "tls-listener"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f1d8809f604e448c7bc53a5a0e4c2a0a20ba44cb1fb407314c8eeccb92127f9"
+dependencies = [
+ "futures-util",
+ "pin-project-lite",
+ "thiserror",
+ "tokio",
+ "tokio-rustls",
+]
+
[[package]]
name = "token-cell"
version = "1.5.0"
@@ -2606,16 +3140,16 @@ dependencies = [
[[package]]
name = "tokio"
-version = "1.40.0"
+version = "1.41.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
+checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"pin-project-lite",
- "socket2 0.5.7",
+ "socket2",
"tokio-macros",
"windows-sys 0.52.0",
]
@@ -2628,7 +3162,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -2653,6 +3187,18 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "tokio-tungstenite"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite",
+]
+
[[package]]
name = "tokio-util"
version = "0.7.12"
@@ -2670,15 +3216,15 @@ dependencies = [
[[package]]
name = "toml_datetime"
-version = "0.6.3"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
[[package]]
name = "toml_edit"
-version = "0.19.14"
+version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
"indexmap 2.6.0",
"toml_datetime",
@@ -2694,7 +3240,7 @@ dependencies = [
"async-trait",
"base64 0.22.1",
"bytes",
- "http 1.0.0",
+ "http 1.1.0",
"http-body",
"http-body-util",
"hyper",
@@ -2707,7 +3253,7 @@ dependencies = [
"tokio",
"tokio-rustls",
"tokio-stream",
- "tower",
+ "tower 0.4.13",
"tower-layer",
"tower-service",
"tracing",
@@ -2724,7 +3270,7 @@ dependencies = [
"prost-build",
"prost-types",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
@@ -2748,24 +3294,39 @@ dependencies = [
]
[[package]]
-name = "tower-layer"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
-
-[[package]]
-name = "tower-service"
-version = "0.3.2"
+name = "tower"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
-
-[[package]]
+checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper 0.1.2",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
+[[package]]
name = "tracing"
-version = "0.1.37"
+version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
- "cfg-if",
"log",
"pin-project-lite",
"tracing-attributes",
@@ -2774,20 +3335,20 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.26"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
name = "tracing-core"
-version = "0.1.31"
+version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
dependencies = [
"once_cell",
"valuable",
@@ -2847,9 +3408,27 @@ dependencies = [
[[package]]
name = "try-lock"
-version = "0.2.4"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "tungstenite"
+version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "data-encoding",
+ "http 1.1.0",
+ "httparse",
+ "log",
+ "rand",
+ "sha1",
+ "thiserror",
+ "utf-8",
+]
[[package]]
name = "twox-hash"
@@ -2869,9 +3448,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "ucd-trie"
-version = "0.1.6"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
[[package]]
name = "uhlc"
@@ -2889,30 +3468,30 @@ dependencies = [
[[package]]
name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893"
[[package]]
name = "unicode-ident"
-version = "1.0.11"
+version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
[[package]]
name = "unicode-normalization"
-version = "0.1.22"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
dependencies = [
"tinyvec",
]
[[package]]
name = "unicode-xid"
-version = "0.2.4"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "unsafe-libyaml"
@@ -2937,22 +3516,131 @@ dependencies = [
"syn 1.0.109",
]
+[[package]]
+name = "up-rust"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30118ab07c7ca420e2196bbc0f6f380b3100928d03ec1cd960f9220472f48f1a"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "mediatype",
+ "protobuf",
+ "protobuf-codegen",
+ "protoc-bin-vendored",
+ "rand",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "uriparse",
+ "uuid-simd",
+]
+
+[[package]]
+name = "up-transport-hono-kafka"
+version = "0.1.0-SNAPSHOT"
+dependencies = [
+ "async-trait",
+ "clap",
+ "fms-proto",
+ "futures",
+ "log",
+ "openssl-src",
+ "protobuf",
+ "rdkafka",
+ "tokio",
+ "up-rust",
+]
+
+[[package]]
+name = "up-transport-hono-mqtt"
+version = "0.1.0-SNAPSHOT"
+dependencies = [
+ "async-trait",
+ "clap",
+ "log",
+ "paho-mqtt",
+ "protobuf",
+ "up-rust",
+ "url_encor",
+]
+
+[[package]]
+name = "up-transport-zenoh"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dba40062ff410f59a9a34a51a9288c8ad92454e4199725264f4f9eaeb604fd9"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "bytes",
+ "lazy_static",
+ "protobuf",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "up-rust",
+ "zenoh",
+]
+
+[[package]]
+name = "uriparse"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff"
+dependencies = [
+ "fnv",
+ "lazy_static",
+]
+
[[package]]
name = "url"
-version = "2.4.0"
+version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
+checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
]
+[[package]]
+name = "url_encor"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "203f80ff045bd3adaefe8914354d2515c1a2900065baa5f8467bdbeaf03855b4"
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
[[package]]
name = "utf8parse"
-version = "0.2.1"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "uuid"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "uuid-simd"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
+dependencies = [
+ "outref",
+ "vsimd",
+]
[[package]]
name = "validated_struct"
@@ -2998,15 +3686,31 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "vsimd"
+version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
[[package]]
name = "waker-fn"
-version = "1.1.0"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
[[package]]
name = "want"
@@ -3025,34 +3729,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.87"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e"
dependencies = [
"cfg-if",
+ "once_cell",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.87"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.87"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -3060,32 +3765,42 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.87"
+version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.87"
+version = "0.2.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
+
+[[package]]
+name = "webpki-roots"
+version = "0.26.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
+dependencies = [
+ "rustls-pki-types",
+]
[[package]]
name = "which"
-version = "4.4.0"
+version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
dependencies = [
"either",
- "libc",
+ "home",
"once_cell",
+ "rustix",
]
[[package]]
@@ -3104,6 +3819,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+[[package]]
+name = "winapi-util"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+dependencies = [
+ "windows-sys 0.59.0",
+]
+
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
@@ -3111,12 +3835,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
-name = "windows"
-version = "0.48.0"
+name = "windows-core"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-targets 0.48.1",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -3125,7 +3849,7 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-targets 0.48.1",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -3134,137 +3858,170 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
- "windows-targets 0.52.0",
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
]
[[package]]
name = "windows-targets"
-version = "0.48.1"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
- "windows_aarch64_gnullvm 0.48.0",
- "windows_aarch64_msvc 0.48.0",
- "windows_i686_gnu 0.48.0",
- "windows_i686_msvc 0.48.0",
- "windows_x86_64_gnu 0.48.0",
- "windows_x86_64_gnullvm 0.48.0",
- "windows_x86_64_msvc 0.48.0",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
]
[[package]]
name = "windows-targets"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
-version = "0.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+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.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.48.0"
+version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.52.0"
+version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
-version = "0.5.1"
+version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [
"memchr",
]
+[[package]]
+name = "x509-parser"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69"
+dependencies = [
+ "asn1-rs",
+ "data-encoding",
+ "der-parser",
+ "lazy_static",
+ "nom",
+ "oid-registry",
+ "rusticata-macros",
+ "thiserror",
+ "time",
+]
+
[[package]]
name = "zenoh"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0de579d53e8fe630cc147874e7545b4171148817786f65f43c4a2f09c1fcc45"
+checksum = "b28b1ce69136eba7567e5ea5c9f37aa0c7cced2673bdc3c1dd7c3c1a2ecb0d21"
dependencies = [
"ahash",
"async-trait",
@@ -3272,7 +4029,7 @@ dependencies = [
"flume",
"futures",
"git-version",
- "itertools 0.13.0",
+ "itertools",
"json5",
"lazy_static",
"once_cell",
@@ -3283,7 +4040,7 @@ dependencies = [
"rustc_version",
"serde",
"serde_json",
- "socket2 0.5.7",
+ "socket2",
"tokio",
"tokio-util",
"tracing",
@@ -3309,18 +4066,18 @@ dependencies = [
[[package]]
name = "zenoh-buffers"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11cdd89e36fb6a885fe2bda464cde3c23b1b14fce1637e7290585fcc14eb92f1"
+checksum = "592504c9854fbc781b9a389cd7225b5878b8dd0cb9a12f15546c8d4eeba9a802"
dependencies = [
"zenoh-collections",
]
[[package]]
name = "zenoh-codec"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d5d83b5f868c72b2e79930e547834a92642efcf2e15d17ace837e7439f62196"
+checksum = "bfb0ce6e9104408c6a23e100a69b16b8e5713f904e061b14ac994fef8df6baba"
dependencies = [
"tracing",
"uhlc",
@@ -3330,15 +4087,15 @@ dependencies = [
[[package]]
name = "zenoh-collections"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2976e0975b54f532bbcf67a0c34a9813b4643b75f5831c3aaf8cde36b48a80c2"
+checksum = "ccb27c67033ffda0171506658802fda8dc22e62bcb094b49be86c04f84d8bdab"
[[package]]
name = "zenoh-config"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "810ff6f9a1a093a89dd3d44f0c666cb260d0015fd6c71c32b3cfb45535d49ae4"
+checksum = "15d3ddf489ec055bc7498d66f6bb2cce8278314fbadb40aa34a37bc0125f494f"
dependencies = [
"json5",
"num_cpus",
@@ -3358,9 +4115,9 @@ dependencies = [
[[package]]
name = "zenoh-core"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c4950b4bf1cefe5259403bf92dc09b4bf4171283ecdd7c27a43c188aafa6943"
+checksum = "0f3d36d0b828f429cfba005519de8941319a4ca3e0b21c7ede3cf8812e1e5518"
dependencies = [
"lazy_static",
"tokio",
@@ -3370,9 +4127,9 @@ dependencies = [
[[package]]
name = "zenoh-crypto"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "875d7984eb64470d6eed4a440a5440fd5f72d98f805e8d07e7bb3afdd30c3b4e"
+checksum = "2f82ea1bb77132325e7fae5d698cfa5dddd4d6e46e94fc73409e31e65a557d7d"
dependencies = [
"aes",
"hmac",
@@ -3384,9 +4141,9 @@ dependencies = [
[[package]]
name = "zenoh-keyexpr"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d38078470eb391e5bc41f7814314dba640a7c3eee9ed38d8a42537ce60966929"
+checksum = "9adcce6a97d03855e2f2e7e5fafb9659d65c47eebc4dc6049ded397874ff634e"
dependencies = [
"hashbrown 0.14.5",
"keyed-set",
@@ -3399,26 +4156,33 @@ dependencies = [
[[package]]
name = "zenoh-link"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "400b03dd126673da54c926f6475346b647d9267655a7c3f8af1726c06f8a5bce"
+checksum = "73741cc9d89411d9b9e969cbad3a6e494684f3a79e200caebdad62beb3cb13fe"
dependencies = [
"zenoh-config",
"zenoh-link-commons",
+ "zenoh-link-quic",
"zenoh-link-tcp",
+ "zenoh-link-tls",
+ "zenoh-link-udp",
+ "zenoh-link-unixsock_stream",
+ "zenoh-link-ws",
"zenoh-protocol",
"zenoh-result",
]
[[package]]
name = "zenoh-link-commons"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94d153eee94f66174f66df0f606ce961c261f5324388158bfea9c90a63f0a529"
+checksum = "6c74d63df6a0dda46f207699fafea4b832151b288451ce58eab7a56c8a07694d"
dependencies = [
"async-trait",
"flume",
"futures",
+ "rustls",
+ "rustls-webpki",
"serde",
"tokio",
"tokio-util",
@@ -3432,14 +4196,40 @@ dependencies = [
"zenoh-util",
]
+[[package]]
+name = "zenoh-link-quic"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9727ec46732859c14717fba67977ef94b866510e714db1270c2f56e19bd80dad"
+dependencies = [
+ "async-trait",
+ "base64 0.22.1",
+ "quinn",
+ "rustls",
+ "rustls-pemfile",
+ "rustls-pki-types",
+ "rustls-webpki",
+ "secrecy",
+ "tokio",
+ "tokio-util",
+ "tracing",
+ "webpki-roots",
+ "x509-parser",
+ "zenoh-config",
+ "zenoh-core",
+ "zenoh-link-commons",
+ "zenoh-protocol",
+ "zenoh-result",
+]
+
[[package]]
name = "zenoh-link-tcp"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55521483edbefeda81056f7a4492a5d4065cea4db6ce94f025a856d4e40cd651"
+checksum = "394d7bd1a098ef102f58b13305f88ce1ffba007c6fe1df2c6d9c4bb350fcb5cb"
dependencies = [
"async-trait",
- "socket2 0.5.7",
+ "socket2",
"tokio",
"tokio-util",
"tracing",
@@ -3450,23 +4240,112 @@ dependencies = [
"zenoh-util",
]
+[[package]]
+name = "zenoh-link-tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9521f53cf61a41b654e976d33cfddb2e94dc0289ecba4cfa39bfb843824f767"
+dependencies = [
+ "async-trait",
+ "base64 0.22.1",
+ "rustls",
+ "rustls-pemfile",
+ "rustls-pki-types",
+ "rustls-webpki",
+ "secrecy",
+ "socket2",
+ "tls-listener",
+ "tokio",
+ "tokio-rustls",
+ "tokio-util",
+ "tracing",
+ "webpki-roots",
+ "x509-parser",
+ "zenoh-config",
+ "zenoh-core",
+ "zenoh-link-commons",
+ "zenoh-protocol",
+ "zenoh-result",
+ "zenoh-runtime",
+]
+
+[[package]]
+name = "zenoh-link-udp"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bd6e9814f1f0f7db6e02f8d196106e356e55e2d5814d1bc8f211910e6fb1459"
+dependencies = [
+ "async-trait",
+ "socket2",
+ "tokio",
+ "tokio-util",
+ "tracing",
+ "zenoh-buffers",
+ "zenoh-core",
+ "zenoh-link-commons",
+ "zenoh-protocol",
+ "zenoh-result",
+ "zenoh-sync",
+ "zenoh-util",
+]
+
+[[package]]
+name = "zenoh-link-unixsock_stream"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aef73ad8357bf0c42abdb057686200bfd6c3fb4646ed07c13f6c18b363f1a0b6"
+dependencies = [
+ "async-trait",
+ "nix",
+ "tokio",
+ "tokio-util",
+ "tracing",
+ "uuid",
+ "zenoh-core",
+ "zenoh-link-commons",
+ "zenoh-protocol",
+ "zenoh-result",
+ "zenoh-runtime",
+]
+
+[[package]]
+name = "zenoh-link-ws"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f178df5cff946bc8ef81015df8d3106d19b027e9aff11db8aa2eee1a802cc05"
+dependencies = [
+ "async-trait",
+ "futures-util",
+ "tokio",
+ "tokio-tungstenite",
+ "tokio-util",
+ "tracing",
+ "url",
+ "zenoh-core",
+ "zenoh-link-commons",
+ "zenoh-protocol",
+ "zenoh-result",
+ "zenoh-runtime",
+ "zenoh-util",
+]
+
[[package]]
name = "zenoh-macros"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42d6be8dbd09d0bcd1eb304efac37dfa253a0cc2731d83aa76e11741fa0938fd"
+checksum = "528dc367e8de7e84d35d37d21998cf9a45360b0f8bffb4f9e5135bed45fd347f"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
"zenoh-keyexpr",
]
[[package]]
name = "zenoh-plugin-trait"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8e1bbb750e7509248c180f4441bac25b922c37e9ef1cf6ab1086718bef12d33"
+checksum = "a24cfd2508d900adad7c88617541b8d4a2ad581c15c307db798b6362554642fe"
dependencies = [
"git-version",
"libloading",
@@ -3481,9 +4360,9 @@ dependencies = [
[[package]]
name = "zenoh-protocol"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dde920503f0775a477f5055513c9c9a80ca5676eb5fe027b392553086113ecab"
+checksum = "c342042f4e7ed51718803f48ce49d9dc2e1a8060f1ed7f94c21e781c01dac9d9"
dependencies = [
"const_format",
"rand",
@@ -3496,18 +4375,18 @@ dependencies = [
[[package]]
name = "zenoh-result"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deb1ee98a8286b5a7329dec08456d1f91b68d129281f79937b140efc18d4cc90"
+checksum = "05f79737b88aafb33bbb0ea83821c9048e20702f3de7cce8822adac25f100aa7"
dependencies = [
"anyhow",
]
[[package]]
name = "zenoh-runtime"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d5a76c1582fb5ab73680c70c8f813a0942fb242f55b4eb0c57dcf63cbf03c0d"
+checksum = "30608ef77db6ba23df63901e3359299875474ff812c3d678b0101c88892cd3de"
dependencies = [
"lazy_static",
"ron",
@@ -3519,9 +4398,9 @@ dependencies = [
[[package]]
name = "zenoh-sync"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19f0b184bc719f1cbc4534e50cff3577e0862eb809eee30fc9a1c8d31f52f7b8"
+checksum = "ef62536159fcfb7eb51d22b69894d884abea5ce0bf6241cc2c3f9880f486060b"
dependencies = [
"event-listener 5.3.1",
"futures",
@@ -3533,9 +4412,9 @@ dependencies = [
[[package]]
name = "zenoh-task"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53671cbca63413e79f0b85ce44a2321cbb264ced93a7c7be583e152502bba6bc"
+checksum = "06d0efd5f0f70acc408a9bddeac526f91c85e2e42dc2c0d7c29a72bc9e26d6ca"
dependencies = [
"futures",
"tokio",
@@ -3547,9 +4426,9 @@ dependencies = [
[[package]]
name = "zenoh-transport"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc4b580c3b5193230ca63225bb73bd291fe0aab0ede829aee6662550cc8433e2"
+checksum = "3bc2a24c34c01775bd0601043dcd75de245eb3af35ce8eff96e0d9126e019812"
dependencies = [
"async-trait",
"crossbeam-utils",
@@ -3559,6 +4438,7 @@ dependencies = [
"paste",
"rand",
"ringbuffer-spsc",
+ "rsa",
"serde",
"sha3",
"tokio",
@@ -3580,9 +4460,9 @@ dependencies = [
[[package]]
name = "zenoh-util"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26ad6f214b19cf52e6da3e4ffafc8f68213de852c49eea0c62db57c234a49bee"
+checksum = "afe24db564df9094e521441b556bfc73f359ae5d7b537a0b03257387404f561d"
dependencies = [
"async-trait",
"const_format",
@@ -3606,26 +4486,27 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.7.32"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
+checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
+ "byteorder",
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.7.32"
+version = "0.7.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.79",
+ "syn 2.0.85",
]
[[package]]
name = "zeroize"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
diff --git a/components/Cargo.toml b/components/Cargo.toml
index 0b83165..f8acdf0 100644
--- a/components/Cargo.toml
+++ b/components/Cargo.toml
@@ -18,7 +18,15 @@
# SPDX-License-Identifier: Apache-2.0
[workspace]
-members = ["fms-consumer", "fms-forwarder", "fms-server", "influx-client"]
+members = [
+ "fms-consumer",
+ "fms-forwarder",
+ "fms-server",
+ "fms-util",
+ "influx-client",
+ "up-transport-hono-kafka",
+ "up-transport-hono-mqtt",
+]
resolver = "2"
[workspace.package]
@@ -31,13 +39,14 @@ documentation = "https://eclipse-sdv-blueprints.github.io/blueprints-website/"
[workspace.dependencies]
async-trait = { version = "0.1" }
+bytes = { version = "1.7" }
chrono = { version = "0.4", default-features = false }
clap = { version = "4.4", default-features = false }
-duration-str = { version = "0.7", default-features = false }
env_logger = { version = "0.11", default-features = false, features = [
"humantime",
] }
fms-proto = { path = "fms-proto" }
+fms-util = { path = "fms-util" }
influx-client = { path = "influx-client", default-features = false }
influxrs = { version = "3.0.1", default-features = false }
log = { version = "0.4" }
@@ -50,6 +59,10 @@ prost = { version = "0.12" }
prost-types = { version = "0.12" }
# tokio does not enable features by default
tokio = { version = "1.39" }
+up-rust = { version = "0.3.0", default-features = false }
+up-transport-hono-kafka = { path = "up-transport-hono-kafka" }
+up-transport-hono-mqtt = { path = "up-transport-hono-mqtt" }
+up-transport-zenoh = { version = "0.4.0" }
zenoh = { version = "1.0.0", default-features = false }
[profile.release]
diff --git a/components/DEPS.txt b/components/DEPS.txt
new file mode 100644
index 0000000..e69de29
diff --git a/components/fms-consumer/Cargo.toml b/components/fms-consumer/Cargo.toml
index 71a17a3..44021f6 100644
--- a/components/fms-consumer/Cargo.toml
+++ b/components/fms-consumer/Cargo.toml
@@ -33,6 +33,7 @@ readme.workspace = true
async-trait = { workspace = true }
clap = { workspace = true, features = [
"std",
+ "derive",
"env",
"color",
"help",
@@ -40,22 +41,12 @@ clap = { workspace = true, features = [
"error-context",
"suggestions",
] }
-duration-str = { workspace = true }
env_logger = { workspace = true }
fms-proto = { workspace = true }
-futures = { version = "0.3" }
+fms-util = { workspace = true }
influx-client = { workspace = true, features = ["writer"] }
-rdkafka = { version = "0.36", default-features = false, features = [
- "libz",
- "tokio",
- "cmake-build",
- "ssl-vendored",
-] }
log = { workspace = true }
-protobuf = { workspace = true }
-tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] }
-zenoh = { workspace = true, features = ["transport_tcp"] }
-
-[build-dependencies]
-# see https://github.com/fede1024/rust-rdkafka/issues/572#issuecomment-1529316876
-openssl-src = { version = "300", features = ["force-engine"] }
+tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
+up-rust = { workspace = true }
+up-transport-hono-kafka = { workspace = true }
+up-transport-zenoh = { workspace = true }
diff --git a/components/fms-consumer/src/main.rs b/components/fms-consumer/src/main.rs
index 8292297..aac0e83 100644
--- a/components/fms-consumer/src/main.rs
+++ b/components/fms-consumer/src/main.rs
@@ -17,312 +17,99 @@
//
// SPDX-License-Identifier: Apache-2.0
-use std::collections::HashMap;
-use std::fs::File;
-use std::io::{self, BufRead, BufReader};
-use std::process;
+use std::str::FromStr;
use std::sync::Arc;
+use std::thread;
-use clap::{Arg, ArgAction, ArgMatches, Command};
+use clap::{Parser, Subcommand};
use fms_proto::fms::VehicleStatus;
-use futures::TryStreamExt;
+use fms_util::ZenohTransportConfig;
+use influx_client::connection::InfluxConnectionConfig;
use influx_client::writer::InfluxWriter;
-use log::{debug, error, info, trace};
+use log::info;
-use rdkafka::config::RDKafkaLogLevel;
-use rdkafka::consumer::stream_consumer::StreamConsumer;
-use rdkafka::consumer::Consumer;
-use rdkafka::message::{BorrowedHeaders, BorrowedMessage, Headers};
-use rdkafka::{ClientConfig, Message};
+use up_rust::{UListener, UMessage, UTransport, UUri};
+use up_transport_hono_kafka::{HonoKafkaTransport, HonoKafkaTransportConfig};
+use up_transport_zenoh::UPTransportZenoh;
-use zenoh::Config;
-
-const CONTENT_TYPE_PROTOBUF: &str = "application/vnd.google.protobuf";
-
-const HEADER_NAME_ORIG_ADDRESS: &str = "orig_address";
-
-const PARAM_KAFKA_PROPERTIES_FILE: &str = "kafka-properties-file";
-const PARAM_KAFKA_TOPIC_NAME: &str = "kafka-topic";
-
-const SUBCOMMAND_HONO: &str = "hono";
-const SUBCOMMAND_ZENOH: &str = "zenoh";
-
-const KEY_EXPR: &str = "fms/vehicleStatus";
-
-fn parse_zenoh_args(args: &ArgMatches) -> Result> {
- if let Some(conf_file) = args.get_one::("config") {
- Config::from_file(conf_file)
- } else {
- Ok(Config::default())
- }
-}
-
-fn add_property_bag_to_map(property_bag: String, headers: &mut HashMap) {
- property_bag.split('&').for_each(|p| {
- trace!("processing property: {p}");
- if let Some((key, value)) = p.split_once('=') {
- if headers.contains_key(key) {
- trace!("skipping property [{key}] from property bag because header with same name exists");
- } else {
- trace!("adding propery [key: {key}, value: {value}] to header map");
- headers.insert(key.to_string(), value.to_string());
- }
- }
- });
-}
-
-fn get_headers_as_map(headers: &BorrowedHeaders) -> HashMap {
- let mut result = HashMap::new();
- headers.iter().for_each(|header| {
- match (
- header.key,
- header
- .value
- .and_then(|v| String::from_utf8(v.to_vec()).ok()),
- ) {
- (HEADER_NAME_ORIG_ADDRESS, Some(value)) => {
- if let Some((_topic, props)) = value.rsplit_once("/?") {
- debug!("found property bag in {HEADER_NAME_ORIG_ADDRESS} header: {props}");
- add_property_bag_to_map(props.to_string(), &mut result);
- }
- }
- (_, Some(value)) => {
- result.insert(header.key.to_string(), value);
- }
- (_, None) => {
- debug!("message contains empty header [{}]", header.key);
- }
- };
- });
-
- result
+struct VehicleStatusListener {
+ influx_writer: InfluxWriter,
}
-fn read_lines(filename: &String) -> Result>, Box> {
- // Open the file in read-only mode.
- match File::open(filename) {
- Ok(file) => {
- // Read the file line by line, and return an iterator of the lines of the file.
- Ok(io::BufReader::new(file).lines())
+#[async_trait::async_trait]
+impl UListener for VehicleStatusListener {
+ async fn on_receive(&self, msg: UMessage) {
+ if let Ok(vehicle_status) = msg.extract_protobuf::() {
+ self.influx_writer
+ .write_vehicle_status(&vehicle_status)
+ .await;
+ } else {
+ info!("ignoring event with invalid/unknown payload");
}
- Err(e) => Err(Box::new(e)),
}
}
-fn get_kafka_client_config(filename: &String) -> Result> {
- read_lines(filename).map(|lines| {
- let mut client_config = ClientConfig::new();
- for line in lines {
- match line {
- Ok(property) => match property.split_once('=') {
- Some((key, value)) => {
- client_config.set(key, value);
- }
- None => {
- debug!("cannot parse line into property: {}", property);
- }
- },
- Err(e) => {
- debug!("cannot read line from file: {e}");
- }
- }
- }
- client_config
- })
-}
+/// Receives FMS related VSS data points via Hono's Kafka based Telemetry API or Eclipse Zenoh instance
+/// and writes them to an InfluxDB server.
+#[derive(Parser)]
+#[command(version, about, long_about = None, arg_required_else_help = true)]
+struct FmsConsumerCommand {
+ /// The topic URI pattern to use for consuming vehicle status events.
+ #[arg(long = "topic-filter", value_name = "URI", env = "TOPIC_FILTER", default_value = "up://*/D100/1/D100", value_parser = up_rust::UUri::from_str )]
+ vehicle_status_topic_filter: UUri,
-fn deserialize_vehicle_status(protobuf: &[u8]) -> Option {
- use protobuf::Message;
+ /// The local uService address.
+ #[arg(long = "uservice-uri", value_name = "URI", env = "USERVICE_URI", default_value = "up://fms-consumer/D101/1/0", value_parser = up_rust::UUri::from_str )]
+ local_uservice_uri: UUri,
- match VehicleStatus::parse_from_bytes(protobuf) {
- Ok(vehicle_status) => {
- trace!("successfully deserialized VehicleStatus from protobuf");
- Some(vehicle_status)
- }
- Err(e) => {
- debug!("failed to deserialize VehicleStatus from protobuf: {}", e);
- None
- }
- }
-}
+ #[command(flatten)]
+ influxdb_connection: InfluxConnectionConfig,
-async fn process_protobuf_message(
- message_properties: HashMap,
- payload: &[u8],
- influx_writer: Arc,
-) {
- match message_properties.get("device_id") {
- Some(device_id) => {
- debug!("received message from vehicle {}", device_id);
- if let Some(vehicle_status) = deserialize_vehicle_status(payload) {
- influx_writer.write_vehicle_status(&vehicle_status).await;
- }
- }
- None => debug!("discarding message from unknown device"),
- }
+ #[command(subcommand)]
+ transport: TransportType,
}
-async fn process_zenoh_message(payload: &[u8], influx_writer: Arc) {
- if let Some(vehicle_status) = deserialize_vehicle_status(payload) {
- influx_writer.write_vehicle_status(&vehicle_status).await;
- } else {
- debug!("ignoring message without payload");
- }
-}
+#[derive(Subcommand)]
+#[command(subcommand_required = true)]
+enum TransportType {
+ /// Consumes VSS data using the Eclipse Hono/Kafka based uProtocol transport.
+ #[command(name = "hono")]
+ Hono(HonoKafkaTransportConfig),
-async fn process_hono_message(m: &BorrowedMessage<'_>, influx_writer: Arc) {
- if let Some(headers) = m.headers() {
- let message_properties = get_headers_as_map(headers);
- match (
- message_properties.get("content-type").map(String::as_str),
- m.payload(),
- ) {
- (Some(CONTENT_TYPE_PROTOBUF), Some(payload)) => {
- debug!("received protobuf message");
- process_protobuf_message(message_properties, payload, influx_writer).await
- }
- (_, None) => debug!("ignoring message without payload"),
- _ => {}
- }
- } else {
- debug!("ignoring message without headers");
- }
-}
-
-async fn run_async_processor_hono(args: &ArgMatches) -> Result<(), Box> {
- let influx_writer = InfluxWriter::new(args).map(Arc::new)?;
-
- let hono_args = args.subcommand_matches(SUBCOMMAND_HONO).unwrap();
- let mut client_config = get_kafka_client_config(
- hono_args
- .get_one::(PARAM_KAFKA_PROPERTIES_FILE)
- .unwrap(),
- )?;
-
- // Create the `StreamConsumer`, to receive the messages from the topic in form of a `Stream`.
- let consumer: StreamConsumer = client_config
- .set_log_level(RDKafkaLogLevel::Debug)
- .create()?;
-
- let topic_name = hono_args.get_one::(PARAM_KAFKA_TOPIC_NAME).unwrap();
-
- consumer.subscribe(&[topic_name.as_str()])?;
- info!("successfully subscribed to topic {topic_name}");
- info!("starting message consumer");
- consumer
- .stream()
- .try_for_each(|borrowed_message| {
- let cloned_writer = influx_writer.clone();
- async move {
- process_hono_message(&borrowed_message, cloned_writer).await;
- Ok(())
- }
- })
- .await?;
- Ok(())
-}
-
-async fn run_async_processor_zenoh(args: &ArgMatches) -> Result<(), Box> {
- let influx_writer = InfluxWriter::new(args).map(Arc::new)?;
- let zenoh_args = args.subcommand_matches(SUBCOMMAND_ZENOH).unwrap();
- let config = parse_zenoh_args(zenoh_args)
- .map_err(|e| Box::::from(e.to_string()))?;
-
- info!("Opening session...");
- let session = zenoh::open(config)
- .await
- .map_err(|e| Box::::from(e.to_string()))?;
-
- info!("Declaring Subscriber on '{}'...", &KEY_EXPR);
- let subscriber = session
- .declare_subscriber(KEY_EXPR)
- .await
- .map_err(|e| Box::::from(e.to_string()))?;
- while let Ok(sample) = subscriber.recv_async().await {
- let cloned_writer = influx_writer.clone();
- let payload = sample.payload().to_bytes();
- process_zenoh_message(&payload, cloned_writer).await;
- }
- Ok(())
+ /// Consumes VSS data using the Eclipse Zenoh based uProtocol transport.
+ #[command(name = "zenoh")]
+ Zenoh(ZenohTransportConfig),
}
#[tokio::main]
-pub async fn main() {
+pub async fn main() -> Result<(), Box> {
env_logger::init();
- let version = option_env!("VERGEN_GIT_SEMVER_LIGHTWEIGHT")
- .unwrap_or(option_env!("VERGEN_GIT_SHA").unwrap_or("unknown"));
-
- let mut parser = Command::new("FMS data consumer")
- .arg_required_else_help(true)
- .version(version)
- .about("Receives FMS related VSS data points via Hono's Kafka based Telemetry API or Eclipse Zenoh instance and writes them to an InfluxDB server");
-
- parser = influx_client::connection::add_command_line_args(parser);
+ let command = FmsConsumerCommand::parse();
- parser = parser
- .subcommand_required(true)
- .subcommand(
- Command::new(SUBCOMMAND_HONO)
- .about("Forwards VSS data to an Influx DB server from Hono's north bound Kafka API")
- .arg(
- Arg::new(PARAM_KAFKA_PROPERTIES_FILE)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_KAFKA_PROPERTIES_FILE)
- .help("The path to a file containing Kafka client properties for connecting to the Kafka broker(s).")
- .action(ArgAction::Set)
- .value_name("PATH")
- .env("KAFKA_PROPERTIES_FILE")
- .required(true),
- )
- .arg(
- Arg::new(PARAM_KAFKA_TOPIC_NAME)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_KAFKA_TOPIC_NAME)
- .alias("topic")
- .help("The name of the Kafka topic to consume VSS data from.")
- .value_name("TOPIC")
- .required(true)
- .env("KAFKA_TOPIC_NAME"),
- ),
- )
- .subcommand(
- Command::new(SUBCOMMAND_ZENOH)
- .about("Forwards VSS data to an Influx DB server from Eclipse Zenoh")
- .arg(
- Arg::new("config")
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long("config")
- .short('c')
- .help("A configuration file.")
- .required(false),
- ),
- );
-
- let args = parser.get_matches();
-
- match args.subcommand_name() {
- Some(SUBCOMMAND_HONO) => {
- info!("starting FMS data consumer for Hono");
- if let Err(e) = run_async_processor_hono(&args).await {
- error!("failed to start Hono processor: {e}");
- process::exit(1);
- }
- }
- Some(SUBCOMMAND_ZENOH) => {
- info!("starting FMS data consumer for Zenoh");
- if let Err(e) = run_async_processor_zenoh(&args).await {
- error!("failed to start Zenoh processor: {e}");
- process::exit(1);
- }
- }
- Some(_) => {
- // cannot happen because subcommand is required
- process::exit(1);
- }
- None => {
- // cannot happen because subcommand is required
- process::exit(1);
+ let transport: Arc = match command.transport {
+ TransportType::Hono(config) => HonoKafkaTransport::new(config).map(Arc::new)?,
+ TransportType::Zenoh(config) => {
+ let config = config.try_into()?;
+ UPTransportZenoh::new(config, command.local_uservice_uri)
+ .await
+ .map(Arc::new)?
}
};
+
+ let influx_writer = InfluxWriter::new(&command.influxdb_connection)?;
+ let listener = Arc::new(VehicleStatusListener { influx_writer });
+ info!(
+ "Registering listener for vehicle status events [source filter: {}]",
+ &command.vehicle_status_topic_filter.to_uri(false)
+ );
+ transport
+ .register_listener(&command.vehicle_status_topic_filter, None, listener)
+ .await
+ .map_err(Box::new)?;
+ // do not let the Notifier that we use to receive and process
+ // Vehicle status notifications go out of scope
+ thread::park();
+
+ Ok(())
}
diff --git a/components/fms-forwarder/Cargo.toml b/components/fms-forwarder/Cargo.toml
index 33b66c8..41c491e 100644
--- a/components/fms-forwarder/Cargo.toml
+++ b/components/fms-forwarder/Cargo.toml
@@ -34,6 +34,7 @@ async-trait = { workspace = true }
chrono = { workspace = true, features = ["std"] }
clap = { workspace = true, features = [
"std",
+ "derive",
"env",
"color",
"help",
@@ -41,14 +42,14 @@ clap = { workspace = true, features = [
"error-context",
"suggestions",
] }
-duration-str = { workspace = true, features = ["time"] }
+duration-str = { version = "0.7", default-features = false, features = [
+ "time",
+] }
env_logger = { workspace = true }
fms-proto = { workspace = true }
+fms-util = { workspace = true }
influx-client = { workspace = true, features = ["writer"] }
log = { workspace = true }
-paho-mqtt = { version = "0.12", default-features = false, features = [
- "vendored-ssl",
-] }
protobuf = { workspace = true }
prost = { version = "0.13" }
prost-types = { version = "0.13" }
@@ -59,7 +60,9 @@ tonic = { version = "0.12.3", default-features = false, features = [
"tls",
"prost",
] }
-zenoh = { workspace = true, features = ["transport_tcp"] }
+up-rust = { workspace = true, features = ["communication"] }
+up-transport-hono-mqtt = { workspace = true }
+up-transport-zenoh = { workspace = true }
[build-dependencies]
protoc-bin-vendored = { workspace = true }
diff --git a/components/fms-forwarder/src/hono_publisher.rs b/components/fms-forwarder/src/hono_publisher.rs
deleted file mode 100644
index 1ad936a..0000000
--- a/components/fms-forwarder/src/hono_publisher.rs
+++ /dev/null
@@ -1,92 +0,0 @@
-// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
-//
-// See the NOTICE file(s) distributed with this work for additional
-// information regarding copyright ownership.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// SPDX-License-Identifier: Apache-2.0
-
-use async_trait::async_trait;
-use clap::{ArgMatches, Command};
-use fms_proto::fms::VehicleStatus;
-use log::{debug, warn};
-use mqtt::MessageBuilder;
-use paho_mqtt as mqtt;
-use protobuf::Message;
-
-use crate::{
- mqtt_connection::{self, MqttConnection},
- status_publishing::StatusPublisher,
-};
-
-const TOPIC_TELEMETRY: &str = "telemetry/?content-type=application%2Fvnd.google.protobuf";
-
-/// Adds arguments to an existing command line which can be
-/// used to configure the connection to a Hono MQTT protocol adapter.
-///
-/// See [`mqtt_connection::add_command_line_args`]
-///
-pub fn add_command_line_args(command: Command) -> Command {
- mqtt_connection::add_command_line_args(command)
-}
-
-pub struct HonoPublisher {
- mqtt_connection: MqttConnection,
-}
-
-impl HonoPublisher {
- /// Creates a new publisher.
- ///
- /// Determines the parameters necessary for creating the publisher from values specified on
- /// the command line or via environment variables as defined by [`add_command_line_args`].
- ///
- /// The publisher returned is configured to keep trying to (re-)connect to the configured
- /// MQTT endpoint using a client certificate of username/password credentials.
- pub async fn new(args: &ArgMatches) -> Result> {
- MqttConnection::new(args).await.map(|con| HonoPublisher {
- mqtt_connection: con,
- })
- }
-}
-
-#[async_trait]
-impl StatusPublisher for HonoPublisher {
- async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus) {
- match vehicle_status.write_to_bytes() {
- Ok(payload) => {
- let msg = MessageBuilder::new()
- .topic(TOPIC_TELEMETRY)
- .payload(payload)
- .finalize();
- match self.mqtt_connection.mqtt_client.publish(msg).await {
- Ok(_t) => debug!(
- "successfully published vehicle status to MQTT endpoint [uri: {}, topic: {}]",
- self.mqtt_connection.uri, TOPIC_TELEMETRY
- ),
- Err(e) => {
- warn!(
- "error publishing vehicle status to MQTT endpoint [uri: {}, topic: {}]: {}",
- self.mqtt_connection.uri, TOPIC_TELEMETRY, e
- );
- }
- };
- return;
- }
- Err(e) => warn!(
- "error serializing vehicle status to protobuf message: {}",
- e
- ),
- }
- }
-}
diff --git a/components/fms-forwarder/src/main.rs b/components/fms-forwarder/src/main.rs
index b734227..25f8d90 100644
--- a/components/fms-forwarder/src/main.rs
+++ b/components/fms-forwarder/src/main.rs
@@ -17,103 +17,90 @@
//
// SPDX-License-Identifier: Apache-2.0
-use std::process;
+use std::{str::FromStr, sync::Arc};
-use clap::Command;
+use clap::{Parser, Subcommand};
use fms_proto::fms::VehicleStatus;
-use hono_publisher::HonoPublisher;
-use influx_client::writer::InfluxWriter;
-use log::{error, info};
-use status_publishing::StatusPublisher;
+use fms_util::ZenohTransportConfig;
+use log::{info, warn};
use tokio::sync::mpsc;
-use zenoh_publisher::ZenohPublisher;
+use up_rust::{
+ communication::{CallOptions, Publisher, SimplePublisher, UPayload},
+ LocalUriProvider, StaticUriProvider, UTransport, UUri,
+};
+use up_transport_hono_mqtt::{HonoMqttTransport, HonoMqttTransportConfig};
+use up_transport_zenoh::UPTransportZenoh;
-mod hono_publisher;
-mod mqtt_connection;
-mod status_publishing;
mod vehicle_abstraction;
-mod zenoh_publisher;
-const SUBCOMMAND_HONO: &str = "hono";
-const SUBCOMMAND_INFLUX: &str = "influx";
-const SUBCOMMAND_ZENOH: &str = "zenoh";
+/// Forwards FMS related VSS data points to a back end system using uProtocol.
+#[derive(Parser)]
+#[command(version, about, long_about = None, arg_required_else_help = true)]
+struct FmsForwarderCommand {
+ /// The topic to publish vehicle status events to.
+ #[arg(long = "topic", value_name = "URI", env = "TOPIC", default_value = "up://fms-forwarder/D100/1/D100", value_parser = up_rust::UUri::from_str )]
+ vehicle_status_topic: UUri,
+
+ #[command(flatten)]
+ databroker_connection: vehicle_abstraction::KuksaDatabrokerClientConfig,
+
+ #[command(subcommand)]
+ transport: TransportType,
+}
+
+#[derive(Subcommand)]
+#[command(subcommand_required = true)]
+enum TransportType {
+ /// Forwards VSS data via Eclipse uProtocol using Eclipse Hono based transport.
+ #[command(name = "hono")]
+ Hono(HonoMqttTransportConfig),
+
+ /// Forwards VSS data via Eclipse uProtocol using Eclipse Zenoh based transport.
+ #[command(name = "zenoh")]
+ Zenoh(ZenohTransportConfig),
+}
#[tokio::main]
async fn main() -> Result<(), Box> {
env_logger::init();
- let version = option_env!("VERGEN_GIT_SEMVER_LIGHTWEIGHT")
- .unwrap_or(option_env!("VERGEN_GIT_SHA").unwrap_or("unknown"));
+ let command = FmsForwarderCommand::parse();
+ let uri_provider = StaticUriProvider::try_from(&command.vehicle_status_topic).map(Arc::new)?;
- let mut parser = Command::new("fms-forwarder")
- .arg_required_else_help(true)
- .version(version)
- .about("Forwards FMS related VSS data points to a back end system");
- parser = vehicle_abstraction::add_command_line_args(parser);
- parser = parser
- .subcommand_required(true)
- .subcommand(hono_publisher::add_command_line_args(
- Command::new(SUBCOMMAND_HONO).about("Forwards VSS data to Hono's MQTT adapter"),
- ))
- .subcommand(influx_client::connection::add_command_line_args(
- Command::new(SUBCOMMAND_INFLUX).about("Forwards VSS data to an Influx DB server"),
- ))
- .subcommand(zenoh_publisher::add_command_line_args(
- Command::new(SUBCOMMAND_ZENOH).about("Forwards VSS data to Zenoh"),
- ));
-
- let args = parser.get_matches();
-
- let publisher: Box = match args.subcommand_name() {
- Some(SUBCOMMAND_HONO) => {
- let hono_args = args.subcommand_matches(SUBCOMMAND_HONO).unwrap();
- match HonoPublisher::new(hono_args).await {
- Ok(writer) => Box::new(writer),
- Err(e) => {
- error!("failed to create Hono publisher: {}", e);
- process::exit(1);
- }
- }
- }
- Some(SUBCOMMAND_INFLUX) => {
- let influx_args = args.subcommand_matches(SUBCOMMAND_INFLUX).unwrap();
- match InfluxWriter::new(influx_args) {
- Ok(writer) => Box::new(writer),
- Err(e) => {
- error!("failed to create InfluxDB writer: {e}");
- process::exit(1);
- }
- }
- }
- Some(SUBCOMMAND_ZENOH) => {
- let zenoh_args = args.subcommand_matches(SUBCOMMAND_ZENOH).unwrap();
- match ZenohPublisher::new(zenoh_args).await {
- Ok(writer) => Box::new(writer),
- Err(e) => {
- error!("failed to create Zenoh Publisher: {e}");
- process::exit(1);
- }
- }
- }
- Some(_) => {
- // cannot happen because subcommand is required
- process::exit(1);
- }
- None => {
- // cannot happen because subcommand is required
- process::exit(1);
+ let transport: Arc = match command.transport {
+ TransportType::Hono(config) => HonoMqttTransport::new(&config).await.map(Arc::new)?,
+ TransportType::Zenoh(config) => {
+ let zenoh_config = config.try_into()?;
+ UPTransportZenoh::new(zenoh_config, uri_provider.get_source_uri())
+ .await
+ .map(Arc::new)?
}
};
+ let origin_resource_id = u16::try_from(command.vehicle_status_topic.resource_id)?;
+ let publisher = Arc::new(SimplePublisher::new(transport, uri_provider));
info!("starting FMS forwarder");
let (tx, mut rx) = mpsc::channel::(30);
- vehicle_abstraction::init(&args, tx).await?;
+ vehicle_abstraction::init(&command.databroker_connection, tx).await?;
while let Some(vehicle_status) = rx.recv().await {
- publisher
- .as_ref()
- .publish_vehicle_status(&vehicle_status)
- .await;
+ match UPayload::try_from_protobuf(vehicle_status) {
+ Ok(payload) => {
+ if let Err(e) = publisher
+ .publish(
+ origin_resource_id,
+ CallOptions::for_publish(None, None, None),
+ Some(payload),
+ )
+ .await
+ {
+ warn!("failed to publish vehicle status event: {}", e);
+ }
+ }
+ Err(e) => {
+ warn!("failed to serialize vehicle status: {}", e);
+ }
+ }
}
Ok(())
}
diff --git a/components/fms-forwarder/src/mqtt_connection.rs b/components/fms-forwarder/src/mqtt_connection.rs
deleted file mode 100644
index 77b415e..0000000
--- a/components/fms-forwarder/src/mqtt_connection.rs
+++ /dev/null
@@ -1,308 +0,0 @@
-// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
-//
-// See the NOTICE file(s) distributed with this work for additional
-// information regarding copyright ownership.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// SPDX-License-Identifier: Apache-2.0
-
-use clap::{Arg, ArgMatches, Command};
-use log::{error, info, warn};
-use mqtt::{AsyncClient, ConnectOptionsBuilder, CreateOptionsBuilder, SslOptionsBuilder};
-use paho_mqtt as mqtt;
-use std::{thread, time::Duration};
-
-const PARAM_CA_PATH: &str = "ca-path";
-const PARAM_DEVICE_CERT: &str = "device-cert";
-const PARAM_DEVICE_KEY: &str = "device-key";
-const PARAM_ENABLE_HOSTNAME_VERIFICATION: &str = "enable-hostname-verification";
-const PARAM_MQTT_CLIENT_ID: &str = "mqtt-client-id";
-const PARAM_MQTT_URI: &str = "mqtt-uri";
-const PARAM_MQTT_USERNAME: &str = "mqtt-username";
-const PARAM_MQTT_PASSWORD: &str = "mqtt-password";
-const PARAM_TRUST_STORE_PATH: &str = "trust-store-path";
-
-/// Adds arguments to an existing command line which can be
-/// used to configure the connection to an MQTT endpoint.
-///
-/// The following arguments are being added:
-///
-/// | Long Name | Environment Variable | Default Value |
-/// |------------------------------|------------------------------|---------------|
-/// | mqtt-client-id | MQTT_CLIENT_ID | - |
-/// | mqtt-uri | MQTT_URI | - |
-/// | mqtt-username | MQTT_USERNAME | - |
-/// | mqtt-password | MQTT_PASSWORD | - |
-/// | device-cert | DEVICE_CERT | - |
-/// | device-key | DEVICE_KEY | - |
-/// | ca-path | CA_PATH | - |
-/// | trust-store-path | TRUST_STORE_PATH | - |
-/// | enable-hostname-verification | ENABLE_HOSTNAME_VERIFICATION | `true` |
-///
-pub fn add_command_line_args(command: Command) -> Command {
- command
- .arg(
- Arg::new(PARAM_MQTT_CLIENT_ID)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_MQTT_CLIENT_ID)
- .help("The client identifier to use in the MQTT Connect Packet.")
- .value_name("ID")
- .required(false)
- .env("MQTT_CLIENT_ID"),
- )
- .arg(
- Arg::new(PARAM_MQTT_URI)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_MQTT_URI)
- .help("The URI of the MQTT adapter to publish data to.")
- .value_name("URI")
- .required(true)
- .env("MQTT_URI"),
- )
- .arg(
- Arg::new(PARAM_MQTT_USERNAME)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_MQTT_USERNAME)
- .help("The username to use for authenticating to the MQTT endpoint.")
- .value_name("USERNAME")
- .required(false)
- .env("MQTT_USERNAME"),
- )
- .arg(
- Arg::new(PARAM_MQTT_PASSWORD)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_MQTT_PASSWORD)
- .help("The password to use for authenticating to the MQTT endpoint.")
- .value_name("PWD")
- .required(false)
- .env("MQTT_PASSWORD"),
- )
- .arg(
- Arg::new(PARAM_DEVICE_CERT)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_DEVICE_CERT)
- .help("The path to a PEM file containing the X.509 certificate that the device should use for authentication.")
- .value_name("PATH")
- .required(false)
- .env("DEVICE_CERT"),
- )
- .arg(
- Arg::new(PARAM_DEVICE_KEY)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_DEVICE_KEY)
- .help("The path to a PEM file containing the private key that the device should use for authentication.")
- .value_name("PATH")
- .required(false)
- .env("DEVICE_KEY"),
- )
- .arg(
- Arg::new(PARAM_CA_PATH)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_CA_PATH)
- .help("The path to a folder that contains PEM files for trusted certificate authorities.")
- .value_name("PATH")
- .required(false)
- .env("CA_PATH"),
- )
- .arg(
- Arg::new(PARAM_TRUST_STORE_PATH)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_TRUST_STORE_PATH)
- .help("The path to a file that contains PEM encoded trusted certificates.")
- .value_name("PATH")
- .required(false)
- .env("TRUST_STORE_PATH"),
- )
- .arg(
- Arg::new(PARAM_ENABLE_HOSTNAME_VERIFICATION)
- .value_parser(clap::builder::BoolishValueParser::new())
- .long(PARAM_ENABLE_HOSTNAME_VERIFICATION)
- .help("Indicates whether server certificates should be matched against the hostname/IP address
- used by a client to connect to the server.")
- .value_name("FLAG")
- .required(false)
- .default_value("true")
- .env("ENABLE_HOSTNAME_VERIFICATION"),
- )
-}
-
-/// A connection to an MQTT endpoint.
-///
-pub struct MqttConnection {
- pub mqtt_client: AsyncClient,
- pub uri: String,
-}
-
-impl MqttConnection {
- fn get_connect_options(
- args: &ArgMatches,
- ) -> Result> {
- let mut ssl_options_builder = SslOptionsBuilder::new();
- if let Some(path) = args.get_one::(PARAM_CA_PATH) {
- if let Err(e) = ssl_options_builder.ca_path(path) {
- error!("failed to set CA path on MQTT client: {e}");
- return Err(Box::new(e));
- }
- }
- if let Some(path) = args.get_one::(PARAM_TRUST_STORE_PATH) {
- if let Err(e) = ssl_options_builder.trust_store(path) {
- error!("failed to set trust store path on MQTT client: {e}");
- return Err(Box::new(e));
- }
- }
- if let Some(flag) = args.get_one::(PARAM_ENABLE_HOSTNAME_VERIFICATION) {
- ssl_options_builder.verify(*flag);
- }
-
- let mut connect_options_builder = ConnectOptionsBuilder::new_v3();
- connect_options_builder.connect_timeout(Duration::from_secs(10));
- connect_options_builder
- .automatic_reconnect(Duration::from_secs(1), Duration::from_secs(16));
- connect_options_builder.clean_session(true);
- connect_options_builder.keep_alive_interval(Duration::from_secs(10));
- connect_options_builder.max_inflight(10);
-
- match (
- args.get_one::(PARAM_MQTT_USERNAME),
- args.get_one::(PARAM_MQTT_PASSWORD),
- args.get_one::(PARAM_DEVICE_CERT),
- args.get_one::(PARAM_DEVICE_KEY),
- ) {
- (_, _, Some(cert_path), Some(key_path)) => {
- match ssl_options_builder.key_store(cert_path) {
- Ok(_builder) => (),
- Err(e) => {
- error!("failed to set client certificate for MQTT client: {e}");
- return Err(Box::new(e));
- }
- }
- match ssl_options_builder.private_key(key_path) {
- Ok(_builder) => (),
- Err(e) => {
- error!("failed to set private key for MQTT client: {e}");
- return Err(Box::new(e));
- }
- }
- info!("using client certificate for authenticating to MQTT endpoint");
- }
- (Some(username), Some(password), _, _) => {
- connect_options_builder.user_name(username);
- connect_options_builder.password(password);
- info!("using username and password for authenticating to MQTT endpoint");
- }
- _ => {
- info!("no credentials specified, trying to connect anonymously to MQTT endpoint");
- }
- }
-
- connect_options_builder.ssl_options(ssl_options_builder.finalize());
- Ok(connect_options_builder.finalize())
- }
-
- /// Creates a new connection to an MQTT endpoint.
- ///
- /// Expects to find parameters as defined by [`add_command_line_args`] in the passed
- /// in *args*.
- ///
- /// The connection returned is configured to keep trying to (re-)connect to the configured
- /// MQTT endpoint.
- pub async fn new(args: &ArgMatches) -> Result> {
- let connect_options = MqttConnection::get_connect_options(args)?;
- let mqtt_uri = args.get_one::(PARAM_MQTT_URI).unwrap().to_owned();
- let client_id = args
- .get_one::(PARAM_MQTT_CLIENT_ID)
- .unwrap_or(&String::default())
- .to_owned();
- info!("connecting to MQTT endpoint at {}", mqtt_uri);
- match CreateOptionsBuilder::new()
- .server_uri(&mqtt_uri)
- .max_buffered_messages(50)
- .send_while_disconnected(true)
- .delete_oldest_messages(true)
- .client_id(client_id)
- .create_client()
- {
- Err(e) => {
- error!("failed to create MQTT client: {}", e);
- Err(Box::new(e))
- }
- Ok(client) => {
- client.connect_with_callbacks(
- connect_options,
- MqttConnection::on_connect_success,
- MqttConnection::on_connect_failure,
- );
- Ok(MqttConnection {
- mqtt_client: client,
- uri: mqtt_uri,
- })
- }
- }
- }
-
- fn on_connect_success(_client: &AsyncClient, _msgid: u16) {
- info!("successfully connected to MQTT endpoint");
- }
-
- fn on_connect_failure(client: &AsyncClient, _msgid: u16, rc: i32) {
- warn!(
- "attempt to connect to MQTT endpoint failed with error code {}, retrying ...",
- rc
- );
- thread::sleep(Duration::from_secs(3));
- client.reconnect_with_callbacks(
- MqttConnection::on_connect_success,
- MqttConnection::on_connect_failure,
- );
- }
-}
-
-#[cfg(test)]
-mod tests {
-
- #[test]
- fn test_get_add_command_line_args_requies_uri() {
- let command = super::add_command_line_args(clap::Command::new("mqtt"));
- let matches = command.try_get_matches_from(vec!["mqtt"]);
- assert!(matches.is_err_and(|e| e.kind() == clap::error::ErrorKind::MissingRequiredArgument));
- }
-
- #[test]
- fn test_get_add_command_line_args_uses_defaults() {
- let command = super::add_command_line_args(clap::Command::new("mqtt"));
- let matches =
- command.get_matches_from(vec!["mqtt", "--mqtt-uri", "mqtts://non-existing.host.io"]);
- assert_eq!(
- matches.get_one::(super::PARAM_MQTT_URI).unwrap(),
- "mqtts://non-existing.host.io"
- );
- assert!(matches
- .get_one::(super::PARAM_MQTT_CLIENT_ID)
- .is_none());
- assert!(matches
- .get_one::(super::PARAM_MQTT_USERNAME)
- .is_none());
- assert!(matches
- .get_one::(super::PARAM_MQTT_PASSWORD)
- .is_none());
- assert!(matches.get_one::(super::PARAM_DEVICE_KEY).is_none());
- assert!(matches
- .get_one::(super::PARAM_DEVICE_CERT)
- .is_none());
- assert!(matches.get_one::(super::PARAM_CA_PATH).is_none());
- assert!(matches
- .get_one::(super::PARAM_ENABLE_HOSTNAME_VERIFICATION)
- .unwrap());
- }
-}
diff --git a/components/fms-forwarder/src/status_publishing.rs b/components/fms-forwarder/src/status_publishing.rs
deleted file mode 100644
index 4147ada..0000000
--- a/components/fms-forwarder/src/status_publishing.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
-//
-// See the NOTICE file(s) distributed with this work for additional
-// information regarding copyright ownership.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// SPDX-License-Identifier: Apache-2.0
-
-use async_trait::async_trait;
-use fms_proto::fms::VehicleStatus;
-use influx_client::writer::InfluxWriter;
-
-/// A facade for publishing Vehicle status information to a back end store.
-#[async_trait]
-pub trait StatusPublisher {
- /// Publishes status information.
- async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus);
-}
-
-#[async_trait]
-impl StatusPublisher for InfluxWriter {
- async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus) {
- self.write_vehicle_status(vehicle_status).await
- }
-}
diff --git a/components/fms-forwarder/src/vehicle_abstraction.rs b/components/fms-forwarder/src/vehicle_abstraction.rs
index fee97d0..112cacb 100644
--- a/components/fms-forwarder/src/vehicle_abstraction.rs
+++ b/components/fms-forwarder/src/vehicle_abstraction.rs
@@ -20,7 +20,7 @@
//! An abstraction of a vehicle's (current) status based on
//! [Eclipse kuksa.val Databroker](https://github.com/eclipse/kuksa.val).
//!
-use clap::{Arg, ArgMatches, Command};
+use clap::Args;
use log::{debug, error, info, warn};
use protobuf::MessageField;
use tokio::sync::mpsc::Sender;
@@ -80,10 +80,6 @@ const TRIGGER_VSS_PATHS: &[&str] = &[
vss::FMS_VEHICLE_TACHOGRAPH_DRIVER2_WORKINGSTATE,
];
-const PARAM_DATABROKER_URI: &str = "databroker-uri";
-const PARAM_DEFAULT_VIN: &str = "default-vin";
-const PARAM_TIMER_INTERVAL: &str = "timer-interval";
-
const TELL_TALE_NAME_ECT: &str = "ENGINE_COOLANT_TEMPERATURE";
const TELL_TALE_NAME_ENGINE_OIL: &str = "ENGINE_OIL";
const TELL_TALE_NAME_ENGINE_MIL_INDICATOR: &str = "ENGINE_MIL_INDICATOR";
@@ -100,54 +96,27 @@ const TRIGGER_ENGINE_OFF: &str = "ENGINE_OFF";
const TRIGGER_TELL_TALE: &str = "TELL_TALE";
const TRIGGER_TIMER: &str = "TIMER";
+const PARAM_DATABROKER_URI: &str = "databroker-uri";
+const PARAM_DEFAULT_VIN: &str = "default-vin";
+const PARAM_TIMER_INTERVAL: &str = "timer-interval";
+
mod kuksa;
mod vss;
-/// Adds arguments to an existing command line which can be
-/// used to configure the component's behavior.
-///
-/// The following arguments are being added:
-///
-/// | long name | environment variable | default value | description |
-/// |---------------------|-----------------------|---------------|-------------|
-/// | *databroker-uri* | *KUKSA_DATABROKER_URI*| `http://127.0.0.1:55555` | The HTTP(S) URI of the kuksa.val Databroker's gRPC endpoint. |
-/// | *default-vin* | *DEFAULT_VIN* | `YV2E4C3A5VB180691` | The default VIN to use if the kuksa.val Databroker does not contain the vehicle's VIN. The VIN is used as a tag on measurements written to the InfluxDB server. |
-/// | *timer-interval* | *TIMER_INTERVAL* | `5s` | The time period to wait after polling FMS snapshot data from the kuksa.val Databroker, e.g 5m10s or 1h15m. |
-///
-pub fn add_command_line_args(command_line: Command) -> Command {
- command_line
- .arg(
- Arg::new(PARAM_DATABROKER_URI)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_DATABROKER_URI)
- .alias("uri")
- .help("The HTTP(S) URI of the kuksa.val Databroker's gRPC endpoint.")
- .value_name("URI")
- .required(false)
- .env("KUKSA_DATABROKER_URI")
- .default_value("http://127.0.0.1:55555"),
- )
- .arg(
- Arg::new(PARAM_DEFAULT_VIN)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_DEFAULT_VIN)
- .help("The default VIN to use if the kuksa.val Databroker does not contain the vehicle's VIN. The VIN is used as a tag on measurements written to the InfluxDB server.")
- .value_name("IDENTIFIER")
- .required(false)
- .env("DEFAULT_VIN")
- .default_value("YV2E4C3A5VB180691"),
- )
- .arg(
- Arg::new(PARAM_TIMER_INTERVAL)
- .value_parser(|s: &str| duration_str::parse(s))
- .long(PARAM_TIMER_INTERVAL)
- .alias("timer")
- .help("The time period to wait after polling FMS snapshot data from the kuksa.val Databroker, e.g 5m10s or 1h15m.")
- .value_name("DURATION_SPEC")
- .required(false)
- .env("TIMER_INTERVAL")
- .default_value("5s"),
- )
+#[derive(Args)]
+pub struct KuksaDatabrokerClientConfig {
+ /// The HTTP(S) URI of the Eclipse Kuksa Databroker's gRPC endpoint.
+ #[arg(long = PARAM_DATABROKER_URI, value_name = "URI", env = "KUKSA_DATABROKER_URI", default_value = "http://127.0.0.1:55555", value_parser = clap::builder::NonEmptyStringValueParser::new() )]
+ databroker_uri: String,
+
+ /// The default VIN to use if the kuksa.val Databroker does not contain the vehicle's VIN.
+ /// The VIN is used as a tag on measurements written to the InfluxDB server.
+ #[arg(long = PARAM_DEFAULT_VIN, value_name = "IDENTIFIER", env = "DEFAULT_VIN", default_value = "YV2E4C3A5VB180691", value_parser = clap::builder::NonEmptyStringValueParser::new() )]
+ default_vin: String,
+
+ /// The time period to wait after polling FMS snapshot data from the kuksa.val Databroker, e.g 5m10s or 1h15m.
+ #[arg(long = PARAM_TIMER_INTERVAL, value_name = "DURATION_SPEC", env = "TIMER_INTERVAL", default_value = "5s", value_parser = |s: &str| duration_str::parse(s) )]
+ timer_interval: Duration,
}
/// Indicates a problem while invoking a Databroker operation.
@@ -331,22 +300,12 @@ struct KuksaValDatabroker {
}
impl KuksaValDatabroker {
- async fn new(args: &ArgMatches) -> Result {
- let databroker_uri = args
- .get_one::(PARAM_DATABROKER_URI)
- .unwrap()
- .to_owned();
-
- let default_vin = args
- .get_one::(PARAM_DEFAULT_VIN)
- .unwrap()
- .to_owned();
-
+ async fn new(config: &KuksaDatabrokerClientConfig) -> Result {
info!(
- "creating client for kuksa.val Databroker at {}",
- databroker_uri
+ "creating client for Eclipse Kuksa Databroker at {}",
+ config.databroker_uri
);
- Endpoint::from_shared(databroker_uri.to_owned())
+ Endpoint::from_shared(config.databroker_uri.to_owned())
.map_err(|e| {
error!("invalid Databroker URI: {}", e);
DatabrokerError {
@@ -361,7 +320,7 @@ impl KuksaValDatabroker {
let client = ValClient::new(channel);
KuksaValDatabroker {
client: Box::new(client),
- default_vin,
+ default_vin: config.default_vin.to_owned(),
}
})
}
@@ -476,20 +435,13 @@ impl KuksaValDatabroker {
/// Sets up a connection to the Databroker and registers callbacks for
/// signals that trigger the reporting of the vehicle's current status.
-///
-/// Expects to find parameters as defined by [`add_command_line_args`] in the passed
-/// in *args*.
-///
pub async fn init(
- args: &ArgMatches,
+ config: &KuksaDatabrokerClientConfig,
status_publisher: Sender,
) -> Result<(), DatabrokerError> {
- let timer_interval = args
- .get_one::(PARAM_TIMER_INTERVAL)
- .unwrap()
- .to_owned();
+ let timer_interval = config.timer_interval.to_owned();
- let mut databroker = KuksaValDatabroker::new(args).await?;
+ let mut databroker = KuksaValDatabroker::new(config).await?;
let (tx, mut rx) = tokio::sync::mpsc::channel::(50);
let _ = &databroker.register_triggers(tx.clone()).await?;
diff --git a/components/fms-forwarder/src/zenoh_publisher.rs b/components/fms-forwarder/src/zenoh_publisher.rs
deleted file mode 100644
index dd22855..0000000
--- a/components/fms-forwarder/src/zenoh_publisher.rs
+++ /dev/null
@@ -1,89 +0,0 @@
-// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
-//
-// See the NOTICE file(s) distributed with this work for additional
-// information regarding copyright ownership.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-// SPDX-License-Identifier: Apache-2.0
-
-use crate::status_publishing::StatusPublisher;
-use async_trait::async_trait;
-use clap::{Arg, ArgMatches, Command};
-use fms_proto::fms::VehicleStatus;
-use log::{debug, warn};
-use protobuf::Message;
-use zenoh::{pubsub::Publisher, Config, Session};
-
-const KEY_EXPR: &str = "fms/vehicleStatus";
-
-pub fn add_command_line_args(command: Command) -> Command {
- command.arg(
- Arg::new("config")
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long("config")
- .short('c')
- .help("A file to read the Zenoh configuration from")
- .required(false),
- )
-}
-
-pub fn parse_args(args: &ArgMatches) -> Result> {
- if let Some(conf_file) = args.get_one::("config") {
- Config::from_file(conf_file)
- } else {
- Ok(Config::default())
- }
-}
-
-pub struct ZenohPublisher<'a> {
- // we need to keep a reference to the Session in order to
- // prevent Zenoh from closing it prematurely
- _session: Session,
- publisher: Publisher<'a>,
-}
-
-impl<'a> ZenohPublisher<'a> {
- pub async fn new(
- args: &ArgMatches,
- ) -> Result, Box> {
- let config = parse_args(args)?;
- let session = zenoh::open(config).await?;
- let publisher = session.declare_publisher(KEY_EXPR).await?;
- Ok(ZenohPublisher {
- _session: session,
- publisher,
- })
- }
-}
-
-#[async_trait]
-impl<'a> StatusPublisher for ZenohPublisher<'a> {
- async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus) {
- match vehicle_status.write_to_bytes() {
- Ok(payload) => {
- match self.publisher.put(payload).await {
- Ok(_t) => debug!("successfully published vehicle status to Zenoh",),
- Err(e) => {
- warn!("error publishing vehicle status to Zenoh: {}", e);
- }
- };
- return;
- }
- Err(e) => warn!(
- "error serializing vehicle status to protobuf message: {}",
- e
- ),
- }
- }
-}
diff --git a/components/fms-server/Cargo.toml b/components/fms-server/Cargo.toml
index 98f7d36..a1573c1 100644
--- a/components/fms-server/Cargo.toml
+++ b/components/fms-server/Cargo.toml
@@ -35,6 +35,7 @@ axum = "0.7"
chrono = { workspace = true, features = ["clock", "serde"] }
clap = { workspace = true, features = [
"std",
+ "derive",
"env",
"color",
"help",
diff --git a/components/fms-server/src/influx_reader.rs b/components/fms-server/src/influx_reader.rs
index 3e8f91a..a530636 100644
--- a/components/fms-server/src/influx_reader.rs
+++ b/components/fms-server/src/influx_reader.rs
@@ -17,10 +17,9 @@
//
// SPDX-License-Identifier: Apache-2.0
-use chrono::{DateTime, NaiveDateTime, Utc};
-use clap::ArgMatches;
+use chrono::{DateTime, Utc};
use const_format::formatcp;
-use influx_client::connection::InfluxConnection;
+use influx_client::connection::{InfluxConnection, InfluxConnectionConfig};
use influxrs::InfluxError;
use log::error;
@@ -73,9 +72,7 @@ fn unpack_value_bool(value: Option<&String>) -> Option {
fn unpack_time(value: Option<&String>) -> Option> {
let timestamp = unpack_value_i64(value)?;
- NaiveDateTime::from_timestamp_millis(timestamp)?
- .and_local_timezone(Utc)
- .latest()
+ DateTime::from_timestamp_millis(timestamp)
}
fn unpack_driver_working_state(value: Option<&String>) -> Option {
@@ -99,7 +96,7 @@ pub struct InfluxReader {
}
impl InfluxReader {
- pub fn new(args: &ArgMatches) -> Result> {
+ pub fn new(args: &InfluxConnectionConfig) -> Result> {
InfluxConnection::new(args).map(|con| InfluxReader { influx_con: con })
}
diff --git a/components/fms-server/src/lib.rs b/components/fms-server/src/lib.rs
index c379e60..93c5d86 100644
--- a/components/fms-server/src/lib.rs
+++ b/components/fms-server/src/lib.rs
@@ -21,7 +21,7 @@ use axum::http::StatusCode;
use axum::{routing::get, Json, Router};
use axum::extract::{Query, State};
-use clap::{ArgMatches, Command};
+use influx_client::connection::InfluxConnectionConfig;
use log::{error, info};
use serde_json::json;
@@ -45,8 +45,8 @@ use models::status::{
};
use query_parser::parse_query_parameters;
-pub fn app(args: ArgMatches) -> Router {
- let influx_reader = InfluxReader::new(&args).map_or_else(
+pub fn app(influx_connection_params: &InfluxConnectionConfig) -> Router {
+ let influx_reader = InfluxReader::new(influx_connection_params).map_or_else(
|e| {
error!("failed to create InfluxDB client: {e}");
process::exit(1);
@@ -62,10 +62,6 @@ pub fn app(args: ArgMatches) -> Router {
.with_state(influx_reader)
}
-pub fn add_command_line_args(command_line: Command) -> Command {
- influx_client::connection::add_command_line_args(command_line)
-}
-
async fn root() -> &'static str {
"Welcome to the rFMS server. The following endpoints are implemented: '/rfms/vehicleposition', '/rfms/vehicles', and '/rfms/vehiclestatuses'"
}
diff --git a/components/fms-server/src/main.rs b/components/fms-server/src/main.rs
index ac31b96..eaff27e 100644
--- a/components/fms-server/src/main.rs
+++ b/components/fms-server/src/main.rs
@@ -17,17 +17,27 @@
//
// SPDX-License-Identifier: Apache-2.0
-use clap::Command;
+use clap::Parser;
+use influx_client::connection::InfluxConnectionConfig;
+
+/// Exposes data from an InfluxDB via an rFMS API endpoint.
+#[derive(Parser)]
+#[command(version, about, long_about = None)]
+struct FmsServerArgs {
+ #[command(flatten)]
+ influx_connection: InfluxConnectionConfig,
+}
#[tokio::main]
async fn main() {
env_logger::init();
- let mut parser = Command::new("rFMS server")
- .about("Exposes data from an InfluxDB via an rFMS API endpoint.");
- parser = fms_server::add_command_line_args(parser);
- let args = parser.get_matches();
- let router = fms_server::app(args);
+ // let mut parser = Command::new("rFMS server")
+ // .about("Exposes data from an InfluxDB via an rFMS API endpoint.");
+ // parser = fms_server::add_command_line_args(parser);
+ // let args = parser.get_matches();
+ let args = FmsServerArgs::parse();
+ let router = fms_server::app(&args.influx_connection);
let listener = tokio::net::TcpListener::bind("0.0.0.0:8081").await.unwrap();
axum::serve::serve(listener, router.into_make_service())
.await
diff --git a/components/fms-util/Cargo.toml b/components/fms-util/Cargo.toml
new file mode 100644
index 0000000..136fa17
--- /dev/null
+++ b/components/fms-util/Cargo.toml
@@ -0,0 +1,28 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+[package]
+name = "fms-util"
+publish = false
+license.workspace = true
+readme.workspace = true
+repository.workspace = true
+version.workspace = true
+edition.workspace = true
+documentation.workspace = true
+
+[dependencies]
+clap = { workspace = true, features = ["derive"] }
+log = { workspace = true }
+zenoh = { workspace = true, features = ["transport_tcp"] }
diff --git a/components/fms-util/src/lib.rs b/components/fms-util/src/lib.rs
new file mode 100644
index 0000000..5199fd0
--- /dev/null
+++ b/components/fms-util/src/lib.rs
@@ -0,0 +1,42 @@
+// SPDX-FileCopyrightText: 2024 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+use std::path::PathBuf;
+
+use clap::Args;
+use zenoh::config::Config;
+
+/// Parameters for configuring the connection to an Eclipse Zenoh router.
+#[derive(Args)]
+pub struct ZenohTransportConfig {
+ /// A file to read the Zenoh configuration from.
+ #[arg(long = "config", short)]
+ config_file: Option,
+}
+
+impl TryFrom for Config {
+ type Error = Box;
+ fn try_from(value: ZenohTransportConfig) -> Result {
+ if let Some(path) = &value.config_file {
+ Config::from_file(path).map_err(|e| e as Box)
+ } else {
+ Ok(Config::default())
+ }
+ }
+}
diff --git a/components/influx-client/Cargo.toml b/components/influx-client/Cargo.toml
index b04a79c..01d1f4d 100644
--- a/components/influx-client/Cargo.toml
+++ b/components/influx-client/Cargo.toml
@@ -30,15 +30,7 @@ readme.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-clap = { workspace = true, features = [
- "std",
- "env",
- "color",
- "help",
- "usage",
- "error-context",
- "suggestions",
-] }
+clap = { workspace = true, features = ["std", "derive", "env"] }
fms-proto = { workspace = true, optional = true }
protobuf = { workspace = true, optional = true }
influxrs = { workspace = true, features = ["client"] }
diff --git a/components/influx-client/src/connection.rs b/components/influx-client/src/connection.rs
index d083f66..7dab5f3 100644
--- a/components/influx-client/src/connection.rs
+++ b/components/influx-client/src/connection.rs
@@ -17,7 +17,9 @@
//
// SPDX-License-Identifier: Apache-2.0
-use clap::{Arg, ArgGroup, ArgMatches, Command};
+use std::path::PathBuf;
+
+use clap::Args;
use influxrs::InfluxClient;
use log::{error, info};
@@ -27,85 +29,72 @@ const PARAM_INFLUXDB_URI: &str = "influxdb-uri";
const PARAM_INFLUXDB_TOKEN: &str = "influxdb-token";
const PARAM_INFLUXDB_TOKEN_FILE: &str = "influxdb-token-file";
-/// Adds command line arguments to an existing command line which can be
-/// used to configure the connection to an InfluxDB server.
-///
-/// The following arguments are being added:
-///
-/// | long name | environment variable | default value |
-/// |---------------------|-------------------------|---------------|
-/// | influxdb-bucket | INFLUXDB_BUCKET | `demo` |
-/// | influxdb-org | INFLUXDB_ORG | `sdv` |
-/// | influxdb-uri | INFLUXDB_URI | - |
-/// | influxdb-token | INFLUXDB_TOKEN | - |
-/// | influxdb-token-file | INFLUXDB_TOKEN_FILE | - |
-///
-pub fn add_command_line_args(command_line: Command) -> Command {
- command_line
- .arg(
- Arg::new(PARAM_INFLUXDB_URI)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_INFLUXDB_URI)
- .alias("ia")
- .help("The HTTP(S) URI of the InfluxDB server to write data to.")
- .value_name("URI")
- .required(true)
- .env("INFLUXDB_URI"),
- )
- .group(ArgGroup::new("influxdb-auth-token").required(true))
- .arg(
- Arg::new(PARAM_INFLUXDB_TOKEN)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_INFLUXDB_TOKEN)
- .alias("token")
- .help("The API token to use for authenticating to the InfluxDB server.")
- .group("influxdb-auth-token")
- .value_name("TOKEN")
- .env("INFLUXDB_TOKEN"),
- )
- .arg(
- Arg::new(PARAM_INFLUXDB_TOKEN_FILE)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_INFLUXDB_TOKEN_FILE)
- .alias("token-file")
- .help("The path to a file that contains the API token to use for authenticating to the InfluxDB server.")
- .group("influxdb-auth-token")
- .value_name("FILE")
- .conflicts_with("influxdb-token")
- .env("INFLUXDB_TOKEN_FILE"),
- )
- .arg(
- Arg::new(PARAM_INFLUXDB_ORG)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_INFLUXDB_ORG)
- .alias("org")
- .help("The name of the organization to connect to on the InfluxDB server.")
- .value_name("NAME")
- .required(false)
- .default_value("sdv")
- .env("INFLUXDB_ORG"),
- )
- .arg(
- Arg::new(PARAM_INFLUXDB_BUCKET)
- .value_parser(clap::builder::NonEmptyStringValueParser::new())
- .long(PARAM_INFLUXDB_BUCKET)
- .alias("bucket")
- .help("The name of the bucket to write data to on the InfluxDB server.")
- .value_name("NAME")
- .required(false)
- .default_value("demo")
- .env("INFLUXDB_BUCKET"),
- )
+#[derive(Args, Debug)]
+#[group(required = true, multiple = false)]
+struct Token {
+ /// The API token to use for authenticating to the InfluxDB server.
+ #[arg(long = PARAM_INFLUXDB_TOKEN, value_name = "NAME", env = "INFLUXDB_TOKEN", value_parser = clap::builder::NonEmptyStringValueParser::new() )]
+ token: Option,
+
+ /// The path to a file that contains the API token to use for authenticating to the InfluxDB server.
+ #[arg(long = PARAM_INFLUXDB_TOKEN_FILE, value_name = "FILE", env = "INFLUXDB_TOKEN_FILE", value_parser = clap::builder::PathBufValueParser::new() )]
+ token_file: Option,
}
-fn read_token_from_file(filename: &str) -> std::io::Result {
- info!("reading token from file {filename}");
- std::fs::read_to_string(filename)
- .map(|s| s.trim().to_string())
- .map_err(|e| {
- error!("failed to read token from file [{filename}]: {e}");
- e
- })
+#[derive(Args, Debug)]
+pub struct InfluxConnectionConfig {
+ /// The HTTP(S) URI of the InfluxDB server.
+ #[arg(
+ long = PARAM_INFLUXDB_URI,
+ value_name = "URI",
+ required = true,
+ env = "INFLUXDB_URI",
+ value_parser = clap::builder::NonEmptyStringValueParser::new()
+ )]
+ uri: String,
+
+ /// The name of the organization to connect to on the InfluxDB server.
+ #[arg(
+ long = PARAM_INFLUXDB_ORG,
+ value_name = "URI",
+ required = false,
+ env = "INFLUXDB_ORG",
+ default_value = "sdv",
+ value_parser = clap::builder::NonEmptyStringValueParser::new()
+ )]
+ org: String,
+
+ /// The name of the bucket to write data to on the InfluxDB server.
+ #[arg(
+ long = PARAM_INFLUXDB_BUCKET,
+ value_name = "URI",
+ required = false,
+ env = "INFLUXDB_BUCKET",
+ default_value = "demo",
+ value_parser = clap::builder::NonEmptyStringValueParser::new()
+ )]
+ bucket: String,
+
+ #[command(flatten)]
+ token: Token,
+}
+
+impl InfluxConnectionConfig {
+ fn token(&self) -> Result> {
+ if let Some(token) = self.token.token.as_ref() {
+ Ok(token.to_owned())
+ } else if let Some(path) = self.token.token_file.as_ref() {
+ info!("reading token from file {:?}", path);
+ Ok(std::fs::read_to_string(path)
+ .map(|s| s.trim().to_string())
+ .map_err(|e| {
+ error!("failed to read token from file: {e}");
+ Box::new(e)
+ })?)
+ } else {
+ Err(Box::from("test"))
+ }
+ }
}
/// A connection to an InfluxDB server.
@@ -123,59 +112,49 @@ impl InfluxConnection {
/// # Examples
///
/// ```
- /// use clap::Command;
- /// use influx_client::connection::InfluxConnection;
+ /// use clap::{Args, Command, FromArgMatches};
+ /// use influx_client::connection::{InfluxConnection, InfluxConnectionConfig};
///
- /// let command = influx_client::connection::add_command_line_args(Command::new("influx_client"));
+ /// let command = Command::new("influx_client");
+ /// let command = InfluxConnectionConfig::augment_args(command);
/// let matches = command.get_matches_from(vec![
/// "influx_client",
/// "--influxdb-uri", "http://my-influx.io",
/// "--influxdb-token", "some-token",
/// "--influxdb-bucket", "the-bucket",
/// ]);
- /// let connection = InfluxConnection::new(&matches)?;
+ /// let connection_params = InfluxConnectionConfig::from_arg_matches(&matches)?;
+ /// let connection = InfluxConnection::new(&connection_params)?;
/// assert_eq!(connection.bucket, "the-bucket".to_string());
/// # Ok::<(), Box>(())
/// ```
- pub fn new(args: &ArgMatches) -> Result> {
- let influx_uri = args
- .get_one::(PARAM_INFLUXDB_URI)
- .unwrap()
- .to_owned();
- let influx_token = match args.get_one::(PARAM_INFLUXDB_TOKEN) {
- Some(token) => token.to_string(),
- None => {
- let file_name = args.get_one::(PARAM_INFLUXDB_TOKEN_FILE).unwrap();
- match read_token_from_file(file_name) {
- Ok(token) => token,
- Err(e) => return Err(Box::new(e)),
- }
- }
- };
- let influx_org = args
- .get_one::(PARAM_INFLUXDB_ORG)
- .unwrap()
- .to_owned();
- let influx_bucket = args
- .get_one::(PARAM_INFLUXDB_BUCKET)
- .unwrap()
- .to_owned();
- let client = InfluxClient::builder(influx_uri, influx_token, influx_org)
- .build()
- .unwrap();
+ pub fn new(
+ connection_params: &InfluxConnectionConfig,
+ ) -> Result> {
+ let client = InfluxClient::builder(
+ connection_params.uri.to_owned(),
+ connection_params.token()?,
+ connection_params.org.to_owned(),
+ )
+ .build()?;
Ok(InfluxConnection {
client,
- bucket: influx_bucket,
+ bucket: connection_params.bucket.to_owned(),
})
}
}
#[cfg(test)]
mod tests {
+ use clap::{Args, Command, FromArgMatches};
+
+ use super::*;
+ use crate::connection::InfluxConnectionConfig;
#[test]
fn test_command_line_uses_defaults() {
- let command = crate::connection::add_command_line_args(clap::Command::new("influx_client"));
+ let command = Command::new("influx_client");
+ let command = InfluxConnectionConfig::augment_args(command);
let matches = command.get_matches_from(vec![
"influx_client",
"--influxdb-uri",
@@ -183,43 +162,29 @@ mod tests {
"--influxdb-token",
"the-token",
]);
- assert_eq!(
- matches
- .get_one::(super::PARAM_INFLUXDB_URI)
- .unwrap(),
- "http://influx.io"
- );
- assert_eq!(
- matches
- .get_one::(super::PARAM_INFLUXDB_TOKEN)
- .unwrap(),
- "the-token"
- );
- assert_eq!(
- matches
- .get_one::(super::PARAM_INFLUXDB_ORG)
- .unwrap(),
- "sdv"
- );
- assert_eq!(
- matches
- .get_one::(super::PARAM_INFLUXDB_BUCKET)
- .unwrap(),
- "demo"
- );
+ let connection_params = InfluxConnectionConfig::from_arg_matches(&matches)
+ .expect("failed to create params from command line");
+ assert_eq!(connection_params.uri, *"http://influx.io");
+ assert_eq!(connection_params.token.token, Some("the-token".to_string()));
+ assert_eq!(connection_params.org, *"sdv");
+ assert_eq!(connection_params.bucket, *"demo");
}
#[test]
fn test_command_line_requires_uri() {
- let command = crate::connection::add_command_line_args(clap::Command::new("influx_client"));
+ let command = Command::new("influx_client");
+ let command = InfluxConnectionConfig::augment_args(command);
let matches =
command.try_get_matches_from(vec!["influx_client", "--influxdb-token", "the-token"]);
- assert!(matches.is_err_and(|e| e.kind() == clap::error::ErrorKind::MissingRequiredArgument));
+ assert!(
+ matches.is_err_and(|e| { e.kind() == clap::error::ErrorKind::MissingRequiredArgument })
+ );
}
#[test]
fn test_command_line_requires_token_or_token_file() {
- let command = crate::connection::add_command_line_args(clap::Command::new("influx_client"));
+ let command = Command::new("influx_client");
+ let command = InfluxConnectionConfig::augment_args(command);
let no_token_matches = command.try_get_matches_from(vec![
"influx_client",
"--influxdb-uri",
@@ -228,7 +193,8 @@ mod tests {
assert!(no_token_matches
.is_err_and(|e| e.kind() == clap::error::ErrorKind::MissingRequiredArgument));
- let command = crate::connection::add_command_line_args(clap::Command::new("influx_client"));
+ let command = Command::new("influx_client");
+ let command = InfluxConnectionConfig::augment_args(command);
let with_token_matches = command.get_matches_from(vec![
"influx_client",
"--influxdb-uri",
@@ -236,14 +202,13 @@ mod tests {
"--influxdb-token",
"the-token",
]);
- assert_eq!(
- with_token_matches
- .get_one::(super::PARAM_INFLUXDB_TOKEN)
- .unwrap(),
- "the-token"
- );
- let command = crate::connection::add_command_line_args(clap::Command::new("influx_client"));
+ let connection_params = InfluxConnectionConfig::from_arg_matches(&with_token_matches)
+ .expect("failed to create params from command line");
+ assert_eq!(connection_params.token.token, Some("the-token".to_string()));
+
+ let command = Command::new("influx_client");
+ let command = InfluxConnectionConfig::augment_args(command);
let with_token_file_matches = command.get_matches_from(vec![
"influx_client",
"--influxdb-uri",
@@ -251,11 +216,12 @@ mod tests {
"--influxdb-token-file",
"/path/to/token-file",
]);
+ let connection_params = InfluxConnectionConfig::from_arg_matches(&with_token_file_matches)
+ .expect("failed to create params from command line");
+ println!("params: {:?}", connection_params);
assert_eq!(
- with_token_file_matches
- .get_one::(super::PARAM_INFLUXDB_TOKEN_FILE)
- .unwrap(),
- "/path/to/token-file"
+ connection_params.token.token_file,
+ Some(PathBuf::from("/path/to/token-file"))
);
}
}
diff --git a/components/influx-client/src/writer.rs b/components/influx-client/src/writer.rs
index ea94906..3ef79e4 100644
--- a/components/influx-client/src/writer.rs
+++ b/components/influx-client/src/writer.rs
@@ -19,14 +19,13 @@
//! Provides means to write a Vehicle's current status properties
//! to an InfluxDB as Influx *measurements*.
-use clap::ArgMatches;
use fms_proto::fms::VehicleStatus;
use influxrs::Measurement;
use log::{debug, warn};
use protobuf::well_known_types::timestamp::Timestamp;
use std::time::{SystemTime, UNIX_EPOCH};
-use crate::connection::InfluxConnection;
+use crate::connection::{InfluxConnection, InfluxConnectionConfig};
fn build_header_measurement(
vin: &str,
@@ -194,7 +193,7 @@ impl InfluxWriter {
///
/// Determines the parameters necessary for creating the writer from values specified on
/// the command line or via environment variables as defined by [`super::add_command_line_args`].
- pub fn new(args: &ArgMatches) -> Result> {
+ pub fn new(args: &InfluxConnectionConfig) -> Result> {
InfluxConnection::new(args).map(|con| InfluxWriter { influx_con: con })
}
@@ -206,7 +205,7 @@ impl InfluxWriter {
/// This function writes the current vehicle status to InfluxDB by means of two measurements:
///
/// * *header* - contains the following tags/fields:
-
+ ///
/// | Type | Name | Description |
/// | ----- | --------------- | -------------------------------- |
/// | tag | trigger | The type of event that triggered the reporting of the vehicle status. |
@@ -219,9 +218,9 @@ impl InfluxWriter {
/// | field | engineTotalFuelUsed | The total fuel the vehicle has used during its lifetime in MilliLitres. |
/// | field | driver1Id | The unique identification of driver one in a Member State. |
/// | field | driver1IdCardIssuer | The country alpha code of the Member State having issued driver one's card. |
-
+ ///
/// * *snapshot* - contains the following tags/fields:
-
+ ///
/// | Type | Name | Description |
/// | ----- | --------------- | -------------------------------- |
/// | tag | trigger | The type of event that triggered the reporting of the vehicle status. |
diff --git a/components/up-transport-hono-kafka/Cargo.toml b/components/up-transport-hono-kafka/Cargo.toml
new file mode 100644
index 0000000..05695c4
--- /dev/null
+++ b/components/up-transport-hono-kafka/Cargo.toml
@@ -0,0 +1,43 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+[package]
+name = "up-transport-hono-kafka"
+publish = false
+license.workspace = true
+readme.workspace = true
+repository.workspace = true
+version.workspace = true
+edition.workspace = true
+documentation.workspace = true
+
+[dependencies]
+async-trait = { workspace = true }
+clap = { workspace = true, features = ["std", "derive", "env"] }
+fms-proto = { workspace = true }
+futures = { version = "0.3" }
+log = { workspace = true }
+protobuf = { workspace = true }
+rdkafka = { version = "0.36", default-features = false, features = [
+ "libz",
+ "tokio",
+ "cmake-build",
+ "ssl-vendored",
+] }
+tokio = { workspace = true }
+up-rust = { workspace = true, features = ["cloudevents", "util"] }
+
+[build-dependencies]
+# see https://github.com/fede1024/rust-rdkafka/issues/572#issuecomment-1529316876
+openssl-src = { version = "300", features = ["force-engine"] }
diff --git a/components/up-transport-hono-kafka/src/lib.rs b/components/up-transport-hono-kafka/src/lib.rs
new file mode 100644
index 0000000..3a7d4d6
--- /dev/null
+++ b/components/up-transport-hono-kafka/src/lib.rs
@@ -0,0 +1,298 @@
+// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+use std::{
+ collections::HashMap,
+ fs::File,
+ io::{BufRead, BufReader},
+ path::PathBuf,
+ sync::Arc,
+ time::Duration,
+};
+
+use clap::Args;
+use futures::TryStreamExt;
+use log::{debug, error, info, trace};
+use protobuf::Message as ProtoMessage;
+use rdkafka::{
+ config::RDKafkaLogLevel,
+ consumer::{Consumer, StreamConsumer},
+ message::{BorrowedHeaders, BorrowedMessage, Headers},
+ ClientConfig, Message,
+};
+use up_rust::{
+ local_transport::LocalTransport, CloudEvent, UCode, UListener, UMessage, UStatus, UTransport,
+ UUri,
+};
+
+const HEADER_NAME_ORIG_ADDRESS: &str = "orig_address";
+
+const PARAM_KAFKA_PROPERTIES_FILE: &str = "kafka-properties-file";
+const PARAM_HONO_TENANT_ID: &str = "hono-tenant-id";
+
+// TODO: this should be replaced with a constant from up-rust
+// see https://github.com/eclipse-uprotocol/up-rust/issues/223
+const MIME_TYPE_CLOUDEVENTS_PROTOBUF: &str = "application/cloudevents+protobuf";
+
+fn add_property_bag_to_map(property_bag: String, headers: &mut HashMap) {
+ property_bag.split('&').for_each(|p| {
+ trace!("processing property: {p}");
+ if let Some((key, value)) = p.split_once('=') {
+ if headers.contains_key(key) {
+ trace!("skipping property [{key}] from property bag because header with same name exists");
+ } else {
+ trace!("adding propery [key: {key}, value: {value}] to header map");
+ headers.insert(key.to_string(), value.to_string());
+ }
+ }
+ });
+}
+
+fn get_headers_as_map(headers: &BorrowedHeaders) -> HashMap {
+ let mut result = HashMap::new();
+ headers.iter().for_each(|header| {
+ match (
+ header.key,
+ header
+ .value
+ .and_then(|v| String::from_utf8(v.to_vec()).ok()),
+ ) {
+ (HEADER_NAME_ORIG_ADDRESS, Some(value)) => {
+ if let Some((_topic, props)) = value.rsplit_once("/?") {
+ debug!("found property bag in {HEADER_NAME_ORIG_ADDRESS} header: {props}");
+ add_property_bag_to_map(props.to_string(), &mut result);
+ }
+ }
+ (_, Some(value)) => {
+ result.insert(header.key.to_string(), value);
+ }
+ (_, None) => {
+ debug!("message contains empty header [{}]", header.key);
+ }
+ };
+ });
+
+ result
+}
+
+fn extract_umessage_from_cloudevent(payload: &[u8]) -> Option {
+ match CloudEvent::parse_from_bytes(payload) {
+ Ok(cloudevent) => match UMessage::try_from(cloudevent) {
+ Err(e) => {
+ info!("failed to extract payload from CloudEvent: {}", e);
+ None
+ }
+ Ok(msg) => Some(msg),
+ },
+ Err(e) => {
+ info!("failed to deserialize CloudEvent: {}", e);
+ None
+ }
+ }
+}
+
+fn extract_umessage_from_kafka_message(m: &BorrowedMessage<'_>) -> Option {
+ if let Some(headers) = m.headers() {
+ let message_properties = get_headers_as_map(headers);
+
+ if let Some(device_id) = message_properties.get("device_id") {
+ debug!("received message from vehicle {}", device_id);
+ } else {
+ debug!("discarding message from unknown device");
+ return None;
+ };
+
+ match (
+ message_properties.get("content-type").map(String::as_str),
+ m.payload(),
+ ) {
+ (Some(MIME_TYPE_CLOUDEVENTS_PROTOBUF), Some(payload)) => {
+ debug!("received message containing CloudEvent");
+ extract_umessage_from_cloudevent(payload)
+ }
+ (_, None) => {
+ debug!("ignoring message without payload");
+ None
+ }
+ _ => None,
+ }
+ } else {
+ debug!("ignoring message without headers");
+ None
+ }
+}
+
+#[derive(Args)]
+pub struct HonoKafkaTransportConfig {
+ /// The path to a file containing Kafka client properties for connecting to Hono's Kafka broker(s).
+ #[arg(long = PARAM_KAFKA_PROPERTIES_FILE, value_name = "PATH", env = "KAFKA_PROPERTIES_FILE", value_parser = clap::builder::PathBufValueParser::new())]
+ kafka_property_file: PathBuf,
+
+ /// The identifier of the Hono tenant to consume messages for.
+ #[arg(long = PARAM_HONO_TENANT_ID, value_name = "ID", env = "HONO_TENANT_ID")]
+ hono_tenant_id: String,
+}
+
+impl HonoKafkaTransportConfig {
+ fn read_lines(&self) -> Result>, Box> {
+ // Open the file in read-only mode.
+ match File::open(&self.kafka_property_file) {
+ Ok(file) => {
+ // Read the file line by line, and return an iterator of the lines of the file.
+ Ok(BufReader::new(file).lines())
+ }
+ Err(e) => Err(Box::new(e)),
+ }
+ }
+
+ fn get_kafka_client_config(&self) -> Result> {
+ self.read_lines().map(|lines| {
+ let mut client_config = ClientConfig::new();
+ for line in lines {
+ match line {
+ Ok(property) => match property.split_once('=') {
+ Some((key, value)) => {
+ client_config.set(key, value);
+ }
+ None => {
+ debug!("cannot parse line into property: {}", property);
+ }
+ },
+ Err(e) => {
+ debug!("cannot read line from file: {e}");
+ }
+ }
+ }
+ client_config
+ })
+ }
+}
+
+/// A simple uProtocol transport implementation for receiving messages from Eclipse Hono's
+/// Apache Kafka based messaging infrastructure.
+pub struct HonoKafkaTransport {
+ local_transport: Arc,
+}
+
+impl HonoKafkaTransport {
+ pub fn new(
+ config_params: HonoKafkaTransportConfig,
+ ) -> Result> {
+ let mut client_config = config_params.get_kafka_client_config()?;
+
+ // Create the `StreamConsumer`, to receive the messages from the topic in form of a `Stream`.
+ let consumer = client_config
+ .set_log_level(RDKafkaLogLevel::Debug)
+ .create::()?;
+
+ let telemetry_topic = format!("hono.telemetry.{}", config_params.hono_tenant_id);
+ let event_topic = format!("hono.event.{}", config_params.hono_tenant_id);
+ let response_topic = format!("hono.command_response.{}", config_params.hono_tenant_id);
+
+ let topics = &[
+ telemetry_topic.as_str(),
+ event_topic.as_str(),
+ response_topic.as_str(),
+ ];
+ for topic_name in topics {
+ match consumer.fetch_metadata(Some(topic_name), Duration::from_secs(10)) {
+ Err(e) => {
+ error!(
+ "could not retrieve meta data for topic [{topic_name}] from broker: {e}"
+ );
+ }
+ Ok(metadata) => match metadata
+ .topics()
+ .iter()
+ .find(|topic| topic.name().eq(*topic_name))
+ {
+ Some(topic) => {
+ if topic.partitions().is_empty() {
+ error!("topic [{topic_name}] does not exist (yet)");
+ }
+ }
+ None => {
+ error!("broker did not return meta data for topic [{topic_name}]");
+ }
+ },
+ }
+ }
+
+ if let Err(e) = consumer.subscribe(topics) {
+ error!("failed to subscribe to topic: {}", e);
+ return Err(Box::new(e));
+ } else {
+ info!("successfully subscribed to tenant's topics");
+ }
+
+ let local_transport = Arc::new(LocalTransport::default());
+ let local_transport_ref = local_transport.clone();
+ tokio::spawn(async move {
+ info!("starting message consumer");
+ consumer
+ .stream()
+ .try_for_each(|borrowed_message| {
+ let cloned_local_transport = local_transport_ref.clone();
+ async move {
+ if let Some(msg) = extract_umessage_from_kafka_message(&borrowed_message) {
+ let _ = cloned_local_transport.send(msg).await;
+ }
+ Ok(())
+ }
+ })
+ .await
+ .unwrap_or_else(|e| {
+ error!("could not start consumer for Hono topics: {}", e);
+ });
+ });
+ Ok(HonoKafkaTransport { local_transport })
+ }
+}
+
+#[async_trait::async_trait]
+impl UTransport for HonoKafkaTransport {
+ async fn send(&self, _message: UMessage) -> Result<(), UStatus> {
+ Err(UStatus::fail_with_code(
+ UCode::UNIMPLEMENTED,
+ "not implemented",
+ ))
+ }
+
+ async fn register_listener(
+ &self,
+ source_filter: &UUri,
+ sink_filter: Option<&UUri>,
+ listener: Arc,
+ ) -> Result<(), UStatus> {
+ self.local_transport
+ .register_listener(source_filter, sink_filter, listener)
+ .await
+ }
+
+ async fn unregister_listener(
+ &self,
+ source_filter: &UUri,
+ sink_filter: Option<&UUri>,
+ listener: Arc,
+ ) -> Result<(), UStatus> {
+ self.local_transport
+ .unregister_listener(source_filter, sink_filter, listener)
+ .await
+ }
+}
diff --git a/components/up-transport-hono-mqtt/Cargo.toml b/components/up-transport-hono-mqtt/Cargo.toml
new file mode 100644
index 0000000..21c8557
--- /dev/null
+++ b/components/up-transport-hono-mqtt/Cargo.toml
@@ -0,0 +1,34 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+[package]
+name = "up-transport-hono-mqtt"
+publish = false
+license.workspace = true
+readme.workspace = true
+repository.workspace = true
+version.workspace = true
+edition.workspace = true
+documentation.workspace = true
+
+[dependencies]
+async-trait = { workspace = true }
+clap = { workspace = true, features = ["std", "derive", "env"] }
+log = { workspace = true }
+paho-mqtt = { version = "0.12", default-features = false, features = [
+ "vendored-ssl",
+] }
+protobuf = { workspace = true }
+up-rust = { workspace = true, features = ["cloudevents"] }
+url_encor = { version = "1.0.2" }
diff --git a/components/up-transport-hono-mqtt/src/lib.rs b/components/up-transport-hono-mqtt/src/lib.rs
new file mode 100644
index 0000000..b0da308
--- /dev/null
+++ b/components/up-transport-hono-mqtt/src/lib.rs
@@ -0,0 +1,98 @@
+// SPDX-FileCopyrightText: 2024 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+use clap::Args;
+use log::{debug, warn};
+use paho_mqtt::{AsyncClient, MessageBuilder};
+use protobuf::Message;
+use up_rust::{CloudEvent, UCode, UMessage, UStatus, UTransport};
+use url_encor::Encoder;
+
+mod mqtt_connection;
+
+// TODO: this should be replaced with a constant from up-rust
+// see https://github.com/eclipse-uprotocol/up-rust/issues/223
+const MIME_TYPE_CLOUDEVENTS_PROTOBUF: &str = "application/cloudevents+protobuf";
+
+#[derive(Args)]
+pub struct HonoMqttTransportConfig {
+ #[command(flatten)]
+ mqtt_client_options: mqtt_connection::MqttClientOptions,
+}
+
+pub struct HonoMqttTransport {
+ mqtt_client: AsyncClient,
+ topic: String,
+}
+
+/// A simple uProtocol transport implementation for sending messages to Eclipse Hono's
+/// MQTT adapter (using MQTT v3.1.1).
+impl HonoMqttTransport {
+ /// Creates a new transport.
+ ///
+ /// Determines the parameters necessary for creating the publisher from values specified on
+ /// the command line or via environment variables as defined by [`add_command_line_args`].
+ ///
+ /// The publisher returned is configured to keep trying to (re-)connect to the configured
+ /// MQTT endpoint using a client certificate of username/password credentials.
+ pub async fn new(config: &HonoMqttTransportConfig) -> Result> {
+ let content_type = MIME_TYPE_CLOUDEVENTS_PROTOBUF.to_string().url_encode();
+ let topic = format!("telemetry/?content-type={}", content_type);
+
+ config
+ .mqtt_client_options
+ .connect()
+ .await
+ .map(|mqtt_client| HonoMqttTransport { mqtt_client, topic })
+ }
+}
+
+#[async_trait::async_trait]
+impl UTransport for HonoMqttTransport {
+ async fn send(&self, message: UMessage) -> Result<(), UStatus> {
+ let event = CloudEvent::try_from(message)
+ .map_err(|e| UStatus::fail_with_code(UCode::INVALID_ARGUMENT, e.to_string()))?;
+ let payload = event.write_to_bytes().map_err(|_e| {
+ UStatus::fail_with_code(UCode::INTERNAL, "failed to serialize CloudEvent to JSON")
+ })?;
+ let msg = MessageBuilder::new()
+ .topic(self.topic.clone())
+ .payload(payload)
+ .finalize();
+ match self.mqtt_client.publish(msg).await {
+ Ok(_t) => {
+ debug!(
+ "successfully published vehicle status to MQTT endpoint [uri: {}, topic: {}]",
+ self.mqtt_client.server_uri(),
+ self.topic
+ );
+ Ok(())
+ }
+ Err(e) => {
+ warn!(
+ "error publishing vehicle status to MQTT endpoint [uri: {}, topic: {}]: {}",
+ self.mqtt_client.server_uri(),
+ self.topic,
+ e
+ );
+ Err(UStatus::fail_with_code(UCode::INTERNAL, e.to_string()))
+ }
+ }
+ }
+}
diff --git a/components/up-transport-hono-mqtt/src/mqtt_connection.rs b/components/up-transport-hono-mqtt/src/mqtt_connection.rs
new file mode 100644
index 0000000..b88f705
--- /dev/null
+++ b/components/up-transport-hono-mqtt/src/mqtt_connection.rs
@@ -0,0 +1,264 @@
+// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
+//
+// See the NOTICE file(s) distributed with this work for additional
+// information regarding copyright ownership.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// SPDX-License-Identifier: Apache-2.0
+
+use clap::{Args, ValueEnum};
+use log::{debug, error, info, warn};
+use mqtt::{
+ AsyncClient, ConnectOptionsBuilder, CreateOptionsBuilder, SslOptions, SslOptionsBuilder,
+};
+use paho_mqtt as mqtt;
+use std::{fmt::Display, path::PathBuf, thread, time::Duration};
+
+const PARAM_CA_PATH: &str = "ca-path";
+const PARAM_DEVICE_CERT: &str = "device-cert";
+const PARAM_DEVICE_KEY: &str = "device-key";
+const PARAM_ENABLE_HOSTNAME_VERIFICATION: &str = "enable-hostname-verification";
+const PARAM_MQTT_CLIENT_ID: &str = "mqtt-client-id";
+const PARAM_MQTT_URI: &str = "mqtt-uri";
+const PARAM_MQTT_USERNAME: &str = "mqtt-username";
+const PARAM_MQTT_PASSWORD: &str = "mqtt-password";
+const PARAM_MQTT_PROTOCOL_VERSION: &str = "mqtt-protocol-version";
+const PARAM_TRUST_STORE_PATH: &str = "trust-store-path";
+
+pub fn on_connect_success(_client: &AsyncClient, _msgid: u16) {
+ info!("successfully connected to MQTT endpoint");
+}
+
+pub fn on_connect_failure(client: &AsyncClient, _msgid: u16, rc: i32) {
+ warn!(
+ "attempt to connect to MQTT endpoint failed with error code {}, retrying ...",
+ rc
+ );
+ thread::sleep(Duration::from_secs(3));
+ client.reconnect_with_callbacks(on_connect_success, on_connect_failure);
+}
+
+#[derive(Clone, ValueEnum)]
+pub enum MqttVersion {
+ V3,
+ V5,
+}
+
+impl Display for MqttVersion {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ MqttVersion::V3 => f.write_str("3.1.1"),
+ MqttVersion::V5 => f.write_str("5"),
+ }
+ }
+}
+
+#[derive(Args)]
+pub struct MqttClientOptions {
+ /// The client identifier to use in the MQTT Connect Packet.
+ #[arg(long = PARAM_MQTT_CLIENT_ID, value_name = "ID", env = "MQTT_CLIENT_ID")]
+ client_id: Option,
+
+ /// The URI of the MQTT adapter to publish data to.
+ #[arg(long = PARAM_MQTT_URI, value_name = "URI", env = "MQTT_URI")]
+ server_uri: String,
+
+ /// The username to use for authenticating to the MQTT endpoint.
+ #[arg(long = PARAM_MQTT_USERNAME, value_name = "USERNAME", env = "MQTT_USERNAME")]
+ username: Option,
+
+ /// The password to use for authenticating to the MQTT endpoint.
+ #[arg(long = PARAM_MQTT_PASSWORD, value_name = "PWD", env = "MQTT_PASSWORD")]
+ password: Option,
+
+ /// The path to a PEM file containing the X.509 certificate that the device should use for authentication.
+ #[arg(long = PARAM_DEVICE_CERT, value_name = "PATH", env = "DEVICE_CERT", value_parser = clap::builder::PathBufValueParser::new())]
+ cert_path: Option,
+
+ /// The path to a PEM file containing the private key that the device should use for authentication.
+ #[arg(long = PARAM_DEVICE_KEY, value_name = "PATH", env = "DEVICE_KEY", value_parser = clap::builder::PathBufValueParser::new())]
+ key_path: Option,
+
+ /// The path to a folder that contains PEM files for trusted certificate authorities.
+ #[arg(long = PARAM_CA_PATH, value_name = "PATH", env = "CA_PATH", value_parser = clap::builder::PathBufValueParser::new())]
+ ca_path: Option,
+
+ /// The path to a file that contains PEM encoded trusted certificates.
+ #[arg(long = PARAM_TRUST_STORE_PATH, value_name = "PATH", env = "TRUST_STORE_PATH", value_parser = clap::builder::PathBufValueParser::new())]
+ trust_store_path: Option,
+
+ /// Indicates whether server certificates should be matched against the
+ /// hostname/IP address used by a client to connect to the server.
+ #[arg(long = PARAM_ENABLE_HOSTNAME_VERIFICATION, value_name = "FLAG", default_value = "true", env = "ENABLE_HOSTNAME_VERIFICATION")]
+ enable_hostname_verification: bool,
+
+ /// The version of the MQTT protocol to use for connecting to the broker.
+ #[arg(
+ value_enum,
+ long = PARAM_MQTT_PROTOCOL_VERSION,
+ default_value = "v3",
+ env = "MQTT_PROTOCOL_VERSION"
+ )]
+ protocol_version: MqttVersion,
+}
+
+impl MqttClientOptions {
+ pub fn ssl_options(&self) -> Result> {
+ let mut ssl_options_builder = SslOptionsBuilder::new();
+ match (self.cert_path.as_ref(), self.key_path.as_ref()) {
+ (Some(cert_path), Some(key_path)) => {
+ if let Err(e) = ssl_options_builder.key_store(cert_path) {
+ error!("failed to set client certificate for MQTT client: {}", e);
+ return Err(Box::from(e));
+ }
+ if let Err(e) = ssl_options_builder.private_key(key_path) {
+ error!("failed to set private key for MQTT client: {}", e);
+ return Err(Box::from(e));
+ }
+ info!("using client certificate for authenticating to MQTT endpoint");
+ }
+ _ => {
+ debug!("no client key material specified");
+ }
+ }
+
+ if let Some(path) = self.ca_path.as_ref() {
+ if let Err(e) = ssl_options_builder.ca_path(path) {
+ error!("failed to set CA path on MQTT client: {}", e);
+ return Err(Box::from(e));
+ }
+ }
+ if let Some(path) = self.trust_store_path.as_ref() {
+ if let Err(e) = ssl_options_builder.trust_store(path) {
+ error!("failed to set trust store path on MQTT client: {}", e);
+ return Err(Box::from(e));
+ }
+ }
+ ssl_options_builder.verify(self.enable_hostname_verification);
+ Ok(ssl_options_builder.finalize())
+ }
+
+ fn mqtt3_connect_options(
+ &self,
+ ) -> Result> {
+ let mut connect_options_builder = ConnectOptionsBuilder::new_v3();
+ connect_options_builder.connect_timeout(Duration::from_secs(10));
+ connect_options_builder
+ .automatic_reconnect(Duration::from_secs(1), Duration::from_secs(16));
+ connect_options_builder.clean_session(true);
+ connect_options_builder.keep_alive_interval(Duration::from_secs(10));
+ connect_options_builder.max_inflight(10);
+ connect_options_builder.ssl_options(self.ssl_options()?);
+
+ match (self.username.as_ref(), self.password.as_ref()) {
+ (Some(username), Some(password)) => {
+ connect_options_builder.user_name(username);
+ connect_options_builder.password(password);
+ info!("using username and password for authenticating to MQTT endpoint");
+ }
+ _ => {
+ debug!("no credentials specified");
+ }
+ }
+ Ok(connect_options_builder.finalize())
+ }
+
+ fn mqtt5_connect_options(
+ &self,
+ ) -> Result> {
+ let options = ConnectOptionsBuilder::new_v5()
+ .connect_timeout(Duration::from_secs(5))
+ .automatic_reconnect(Duration::from_secs(1), Duration::from_secs(16))
+ .clean_start(true)
+ .keep_alive_interval(Duration::from_secs(10))
+ .max_inflight(10)
+ .finalize();
+ Ok(options)
+ }
+
+ pub fn create_async_client(&self) -> Result> {
+ CreateOptionsBuilder::new()
+ .server_uri(self.server_uri.as_str())
+ .max_buffered_messages(50)
+ .send_while_disconnected(true)
+ .delete_oldest_messages(true)
+ .client_id(self.client_id.clone().unwrap_or_default())
+ .create_client()
+ .map_err(Box::from)
+ }
+
+ pub async fn connect(&self) -> Result> {
+ let connect_options = match self.protocol_version {
+ MqttVersion::V3 => self.mqtt3_connect_options()?,
+ MqttVersion::V5 => self.mqtt5_connect_options()?,
+ };
+ match self.create_async_client() {
+ Err(e) => {
+ error!("failed to create MQTT client: {}", e);
+ Err(e)
+ }
+ Ok(client) => {
+ info!(
+ "connecting to MQTT endpoint [broker URI: {}, protocol version: {}]",
+ client.server_uri(),
+ self.protocol_version
+ );
+ client
+ .connect_with_callbacks(
+ connect_options,
+ crate::mqtt_connection::on_connect_success,
+ crate::mqtt_connection::on_connect_failure,
+ )
+ .await
+ .map(|_response| client)
+ .map_err(Box::from)
+ }
+ }
+ }
+}
+
+impl Display for MqttClientOptions {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_fmt(format_args!(
+ "MQTT Client Options [server-uri: {}]",
+ self.server_uri
+ ))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use clap::{Args, FromArgMatches};
+
+ use super::*;
+
+ #[test]
+ fn test_command_line_uses_defaults() {
+ let command = clap::Command::new("mqtt");
+ let command = MqttClientOptions::augment_args(command);
+ let matches =
+ command.get_matches_from(vec!["mqtt", "--mqtt-uri", "mqtts://non-existing.host.io"]);
+ let options = MqttClientOptions::from_arg_matches(&matches)
+ .expect("failed to create options from command line");
+
+ assert_eq!(options.server_uri, "mqtts://non-existing.host.io");
+ assert!(options.client_id.is_none());
+ assert!(options.username.is_none());
+ assert!(options.password.is_none());
+ assert!(options.cert_path.is_none());
+ assert!(options.key_path.is_none());
+ assert!(options.ca_path.is_none());
+ assert!(options.enable_hostname_verification);
+ }
+}
diff --git a/zenoh-config-client.json5 b/config/zenoh/config-client.json5
similarity index 100%
rename from zenoh-config-client.json5
rename to config/zenoh/config-client.json5
diff --git a/zenoh-config-router.json5 b/config/zenoh/config-router.json5
similarity index 100%
rename from zenoh-config-router.json5
rename to config/zenoh/config-router.json5
diff --git a/create-config-functions.sh b/create-config-functions.sh
index bfe71a6..a1edf10 100644
--- a/create-config-functions.sh
+++ b/create-config-functions.sh
@@ -90,14 +90,14 @@ create_docker_compose_env() {
ENV_FILE_PATH=$1
CONSUMER_CONFIG_FOLDER=$2
CONSUMER_KAFKA_PROPERTIES_FILE_NAME=$3
- CONSUMER_KAFKA_TOPIC_NAME=$4
+ CONSUMER_HONO_TENANT_ID=$4
FORWARDER_CONFIG_FOLDER=$5
FORWARDER_MQTT_ENV_FILE_PATH=$6
echo "Creating Docker Compose env file ${ENV_FILE_PATH} ..."
cat < "${ENV_FILE_PATH}"
FMS_CONSUMER_CONFIG_FOLDER=${CONSUMER_CONFIG_FOLDER}
FMS_CONSUMER_KAFKA_PROPERTIES_FILE=${CONSUMER_KAFKA_PROPERTIES_FILE_NAME}
-FMS_CONSUMER_KAFKA_TOPIC_NAME=${CONSUMER_KAFKA_TOPIC_NAME}
+FMS_CONSUMER_HONO_TENANT_ID=${CONSUMER_HONO_TENANT_ID}
FMS_FORWARDER_CONFIG_FOLDER=${FORWARDER_CONFIG_FOLDER}
FMS_FORWARDER_MQTT_ENV_FILE=${FORWARDER_MQTT_ENV_FILE_PATH}
EOF
diff --git a/create-config-hono.sh b/create-config-hono.sh
index 4e62b27..1350355 100755
--- a/create-config-hono.sh
+++ b/create-config-hono.sh
@@ -249,6 +249,7 @@ group.id=fms-demo-consumer
enable.partition.eof=false
session.timeout.ms=6000
enable.auto.commit=true
+allow.auto.create.topics=true
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.username=${HONO_KAFKA_USER}
@@ -288,6 +289,6 @@ create_docker_compose_env \
"${CONFIG_DIR_BASE}/hono.env" \
"${CONFIG_DIR_FMS_CONSUMER}" \
"kafka.properties" \
- "hono.telemetry.${HONO_TENANT_ID}" \
+ "${HONO_TENANT_ID}" \
"${CONFIG_DIR_FMS_FORWARDER}" \
"${MQTT_PROPS_FILE}"
diff --git a/fms-blueprint-compose-hono.yaml b/fms-blueprint-compose-hono.yaml
index 47c1b9d..63ccb79 100644
--- a/fms-blueprint-compose-hono.yaml
+++ b/fms-blueprint-compose-hono.yaml
@@ -20,32 +20,11 @@
services:
fms-consumer:
command: "hono"
- image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main"
- build:
- context: "./components"
- dockerfile: "Dockerfile.fms-consumer"
- container_name: "fms-consumer"
- cap_drop:
- - CAP_MKNOD
- - CAP_NET_RAW
- - CAP_AUDIT_WRITE
- networks:
- - "fms-backend"
- depends_on:
- influxdb:
- condition: service_healthy
- env_file:
- - "./influxdb/fms-demo.env"
environment:
- INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token"
+ HONO_TENANT_ID: "${FMS_CONSUMER_HONO_TENANT_ID}"
KAFKA_PROPERTIES_FILE: "/app/config/${FMS_CONSUMER_KAFKA_PROPERTIES_FILE:-kafka.properties}"
- KAFKA_TOPIC_NAME: "${FMS_CONSUMER_KAFKA_TOPIC_NAME}"
- RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}"
+ RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug,up_transport_hono_kafka=info}"
volumes:
- - type: "volume"
- source: "influxdb-auth"
- target: "/tmp"
- read_only: true
- type: "bind"
source: "${FMS_CONSUMER_CONFIG_FOLDER}"
target: "/app/config"
@@ -53,6 +32,9 @@ services:
command: "hono"
env_file:
- "${FMS_FORWARDER_MQTT_ENV_FILE}"
+ environment:
+ RUST_LOG: "${FMS_FORWARDER_LOG_CONFIG:-info,fms_forwarder=info,up_transport_hono_mqtt=info}"
+
volumes:
- type: "bind"
source: "${FMS_FORWARDER_CONFIG_FOLDER}"
diff --git a/fms-blueprint-compose-zenoh.yaml b/fms-blueprint-compose-zenoh.yaml
index ce9a6f9..67ffd76 100644
--- a/fms-blueprint-compose-zenoh.yaml
+++ b/fms-blueprint-compose-zenoh.yaml
@@ -22,7 +22,7 @@ services:
command: -c /zenoh-config.json5
environment:
RUST_LOG: zenoh=info
- image: eclipse/zenoh:1.0.0
+ image: eclipse/zenoh:1.1.0
container_name: "fms-zenoh-router"
networks:
- "fms-backend"
@@ -31,7 +31,7 @@ services:
- 7447:7447/tcp
restart: unless-stopped
volumes:
- - ./zenoh-config-router.json5:/zenoh-config.json5
+ - ./config/zenoh/config-router.json5:/zenoh-config.json5
fms-forwarder:
command: "zenoh -c /zenoh-config.json5"
@@ -39,34 +39,14 @@ services:
fms-zenoh-router:
condition: service_started
volumes:
- - ./zenoh-config-client.json5:/zenoh-config.json5
+ - ./config/zenoh/config-client.json5:/zenoh-config.json5
fms-consumer:
command: "zenoh -c /zenoh-config.json5"
- image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main"
- build:
- context: "./components"
- dockerfile: "Dockerfile.fms-consumer"
- container_name: "fms-consumer"
- cap_drop:
- - CAP_MKNOD
- - CAP_NET_RAW
- - CAP_AUDIT_WRITE
- networks:
- - "fms-backend"
depends_on:
influxdb:
condition: service_healthy
fms-zenoh-router:
condition: service_started
- env_file:
- - "./influxdb/fms-demo.env"
- environment:
- INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token"
- RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}"
volumes:
- - ./zenoh-config-client.json5:/zenoh-config.json5
- - type: "volume"
- source: "influxdb-auth"
- target: "/tmp"
- read_only: true
+ - ./config/zenoh/config-client.json5:/zenoh-config.json5
diff --git a/fms-blueprint-compose.yaml b/fms-blueprint-compose.yaml
index 23e54ad..2405ef4 100644
--- a/fms-blueprint-compose.yaml
+++ b/fms-blueprint-compose.yaml
@@ -144,6 +144,31 @@ services:
RUST_LOG: "info"
# for the time being, we do not use TLS secured connections to Databroker
command: "--insecure"
+ fms-consumer:
+ image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main"
+ build:
+ context: "./components"
+ dockerfile: "Dockerfile.fms-consumer"
+ container_name: "fms-consumer"
+ cap_drop:
+ - CAP_MKNOD
+ - CAP_NET_RAW
+ - CAP_AUDIT_WRITE
+ networks:
+ - "fms-backend"
+ depends_on:
+ influxdb:
+ condition: service_healthy
+ env_file:
+ - "./influxdb/fms-demo.env"
+ environment:
+ INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token"
+ RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}"
+ volumes:
+ - type: "volume"
+ source: "influxdb-auth"
+ target: "/tmp"
+ read_only: true
fms-forwarder:
image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-forwarder:main"
build: &fms-forwarder-build
@@ -159,7 +184,6 @@ services:
condition: service_healthy
databroker:
condition: service_started
- command: "influx"
env_file: "${FMS_FORWARDER_PROPERTIES_FILE:-./influxdb/fms-demo.env}"
environment:
INFLUXDB_TOKEN_FILE: "/etc/forwarder/fms-demo.token"
diff --git a/img/architecture-hono.drawio.license b/img/architecture-hono.drawio.license
new file mode 100644
index 0000000..59baed3
--- /dev/null
+++ b/img/architecture-hono.drawio.license
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
diff --git a/img/architecture-uprotocol.drawio.license b/img/architecture-uprotocol.drawio.license
new file mode 100644
index 0000000..59baed3
--- /dev/null
+++ b/img/architecture-uprotocol.drawio.license
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
diff --git a/img/architecture-uprotocol.drawio.svg b/img/architecture-uprotocol.drawio.svg
new file mode 100644
index 0000000..f0400ef
--- /dev/null
+++ b/img/architecture-uprotocol.drawio.svg
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/img/architecture-zenoh.drawio.license b/img/architecture-zenoh.drawio.license
new file mode 100644
index 0000000..59baed3
--- /dev/null
+++ b/img/architecture-zenoh.drawio.license
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation
+#
+# See the NOTICE file(s) distributed with this work for additional
+# information regarding copyright ownership.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
diff --git a/img/architecture.drawio.svg b/img/architecture.drawio.svg
deleted file mode 100644
index 3dd9842..0000000
--- a/img/architecture.drawio.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file