From d2a6897f05a07a058b2185c953b30d26fded081b Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 6 Oct 2024 12:58:03 +0200 Subject: erster Import --- .clang-format | 45 ++++++++++++++++++++++++++++ .clang-tidy | 19 ++++++++++++ .gitignore | 2 ++ compile_flags.txt | 8 +++++ config.mk | 2 ++ makefile | 26 ++++++++++++++++ src/main.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 191 insertions(+) create mode 100644 .clang-format create mode 100644 .clang-tidy create mode 100644 .gitignore create mode 100644 compile_flags.txt create mode 100644 config.mk create mode 100644 makefile create mode 100644 src/main.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..b32bad6 --- /dev/null +++ b/.clang-format @@ -0,0 +1,45 @@ +--- +AccessModifierOffset: -4 +AlignConsecutiveAssignments: 'true' +AlignConsecutiveDeclarations: 'true' +AlignEscapedNewlines: Left +AlignTrailingComments: 'true' +AlwaysBreakAfterReturnType: TopLevelDefinitions +BreakBeforeBraces: Stroustrup +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeComma +ColumnLimit: '0' +CompactNamespaces: 'false' +Cpp11BracedListStyle: 'false' +FixNamespaceComments: 'true' +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '^.*(precomp|pch|stdafx)' + Priority: -1 + - Regex: '^<.*>' + Priority: 1 + - Regex: '^".*"' + Priority: 2 + - Regex: '.*' + Priority: 3 +IndentCaseLabels: 'false' +IndentPPDirectives: AfterHash +IndentWidth: '4' +IndentWrappedFunctionNames: 'false' +KeepEmptyLinesAtTheStartOfBlocks: 'false' +PointerAlignment: Right +SortIncludes: 'true' +SpaceAfterCStyleCast: 'true' +SpaceAfterTemplateKeyword: 'false' +SpaceBeforeAssignmentOperators: 'true' +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: 'false' +SpaceInEmptyParentheses: 'false' +SpacesInAngles: 'false' +SpacesInCStyleCastParentheses: 'false' +SpacesInConditionalStatement: 'true' +SpacesInParentheses: 'false' +Standard: Auto +TabWidth: '4' +UseTab: ForIndentation +... diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..0bceb5b --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,19 @@ +--- +Checks: "*, + -abseil-*, + -altera-*, + -android-*, + -fuchsia-*, + -google-*, + -llvm*, + -modernize-use-trailing-return-type, + -zircon-*, + -readability-else-after-return, + -readability-static-accessed-through-instance, + -readability-avoid-const-params-in-decls, + -cppcoreguidelines-non-private-member-variables-in-classes, + -misc-non-private-member-variables-in-classes, +" +WarningsAsErrors: '' +HeaderFilterRegex: '' +FormatStyle: none diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd42ee3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..8e3330c --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,8 @@ +-Wall +-Werror +-Wextra +-Wconversion +-Wdouble-promotion +-pedantic +-std=c17 +-Iinclude diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..8ca0709 --- /dev/null +++ b/config.mk @@ -0,0 +1,2 @@ +CFLAGS=-Wall -Werror -Wextra -Wconversion -Wdouble-promotion -pedantic -std=c17 -Iinclude +LDFLAGS=-lmosquitto diff --git a/makefile b/makefile new file mode 100644 index 0000000..7fada65 --- /dev/null +++ b/makefile @@ -0,0 +1,26 @@ +include config.mk + +BINARY=bin/client + +SRC_FILES=$(wildcard src/*.c) +OBJ_FILES=$(patsubst src/%.c,obj/%.o,$(SRC_FILES)) + +release: $(BINARY) +release: CFLAGS+=-DNDEBUG -O2 + +debug: $(BINARY) +debug: CFLAGS+=-g + +$(BINARY): $(OBJ_FILES) | bin + cc $(LDFLAGS) $^ -o $@ + +obj/%.o: src/%.c | obj + cc $(CFLAGS) -c $< -o $@ + +bin obj: + mkdir -p $@ + +clean: + rm -rf bin obj + +.PHONY: release debug clean diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..9579568 --- /dev/null +++ b/src/main.c @@ -0,0 +1,89 @@ +// Standard C +#include +#include +#include +#include + +// System +#include + +// Project +#include + +#define CLIENT_ID "my-client-id" +#define HOST "192.168.77.2" +#define PORT 1883 +#define USERNAME "zigbee2mqtt" +#define PASSWORD "xoorei2uk2booSudies4Numoek1uot" +#define TOPIC "zigbee2mqtt/Kontaktsensor" +#define KEEPALIVE 10 +#define WAIT_UNTIL_RECONNECT 10 + +static volatile bool terminate = false; // NOLINT + +void +handler(int signal) +{ + if ( signal == SIGINT ) { + terminate = true; + } +} + +static void +message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) +{ + (void) obj; + (void) mosq; + printf("message '%.*s' for topic '%s'\n", + message->payloadlen, (const char *) message->payload, + message->topic); +} + +int +main(void) +{ + (void) signal(SIGINT, handler); + + mosquitto_lib_init(); + + struct mosquitto *client = mosquitto_new(CLIENT_ID, true, NULL); + if ( client == NULL ) { + (void) fprintf(stderr, "error on new client...\n"); + return EXIT_FAILURE; + } + + int err = mosquitto_username_pw_set(client, USERNAME, PASSWORD); + if ( err != MOSQ_ERR_SUCCESS ) { + (void) fprintf(stderr, "error: %s\n", mosquitto_strerror(err)); + mosquitto_destroy(client); + return EXIT_FAILURE; + } + + mosquitto_message_callback_set(client, message_callback); + + err = mosquitto_connect(client, HOST, PORT, KEEPALIVE); + if ( err != MOSQ_ERR_SUCCESS ) { + (void) fprintf(stderr, "error: %s\n", mosquitto_strerror(err)); + mosquitto_destroy(client); + return EXIT_FAILURE; + } + + mosquitto_subscribe(client, NULL, TOPIC, 0); + + while ( !terminate ) { + err = mosquitto_loop(client, -1, 1); + if ( !terminate && err ) { + (void) fprintf(stderr, "connection error: %s\n", mosquitto_strerror(err)); + sleep(WAIT_UNTIL_RECONNECT); // NOLINT + mosquitto_reconnect(client); + } + } + + printf("cleanup...\n"); + mosquitto_disconnect(client); + mosquitto_destroy(client); + + mosquitto_lib_cleanup(); + + return EXIT_SUCCESS; +} -- cgit v1.3