Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding publish and subscribe atomic client examples #347

Merged
merged 1 commit into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Expand Up @@ -78,6 +78,8 @@ examples/sn-client/sn-client_qos-1
examples/sn-client/sn-multithread
examples/multithread/multithread
examples/wiot/wiot
examples/pub-sub/mqtt-pub
examples/pub-sub/mqtt-sub

# eclipse
.cproject
Expand Down
2 changes: 2 additions & 0 deletions CMakeLists.txt
Expand Up @@ -147,6 +147,8 @@ if (WOLFMQTT_EXAMPLES)
add_mqtt_example(azureiothub azure/azureiothub.c)
add_mqtt_example(fwpush firmware/fwpush.c)
add_mqtt_example(fwclient firmware/fwclient.c)
add_mqtt_example(mqtt-pub pub-sub/mqtt-pub.c)
add_mqtt_example(mqtt-pub pub-sub/mqtt-sub.c)
endif()

####################################################
Expand Down
7 changes: 7 additions & 0 deletions README.md
Expand Up @@ -213,6 +213,13 @@ WolfGatewayQoS-1,wolfMQTT/example/testTopic, 1
### Multithread Example
This example exercises the multithreading capabilities of the client library. The client implements two tasks: one that publishes to the broker; and another that waits for messages from the broker. The publish thread is created `NUM_PUB_TASKS` times (10 by default) and sends unique messages to the broker. This feature is enabled using the `--enable-mt` configuration option. The example is located in `/examples/multithread/`.

### Atomic publish and subscribe examples
In the `examples/pub-sub` folder, there are two simple client examples:
* mqtt-pub - publishes to a topic
* mqtt-sub - subscribes to a topic and waits for messages

These examples are useful for quickly testing or scripting.

## Example Options
The command line examples can be executed with optional parameters. To see a list of the available parameters, add the `-?`

Expand Down
28 changes: 25 additions & 3 deletions examples/include.am
Expand Up @@ -13,7 +13,9 @@ noinst_PROGRAMS += examples/mqttclient/mqttclient \
examples/multithread/multithread \
examples/sn-client/sn-client \
examples/sn-client/sn-client_qos-1 \
examples/sn-client/sn-multithread
examples/sn-client/sn-multithread \
examples/pub-sub/mqtt-pub \
examples/pub-sub/mqtt-sub

noinst_HEADERS += examples/mqttclient/mqttclient.h \
examples/mqttsimple/mqttsimple.h \
Expand All @@ -28,7 +30,8 @@ noinst_HEADERS += examples/mqttclient/mqttclient.h \
examples/mqttport.h \
examples/nbclient/nbclient.h \
examples/multithread/multithread.h \
examples/sn-client/sn-client.h
examples/sn-client/sn-client.h \
examples/pub-sub/mqtt-pub-sub.h

# MQTT Client Example
examples_mqttclient_mqttclient_SOURCES = examples/mqttclient/mqttclient.c \
Expand Down Expand Up @@ -127,6 +130,21 @@ examples_sn_client_sn_multithread_SOURCES = examples/sn-client/sn-multithr
examples_sn_client_sn_multithread_LDADD = src/libwolfmqtt.la
examples_sn_client_sn_multithread_DEPENDENCIES = src/libwolfmqtt.la
examples_sn_client_sn_multithread_CPPFLAGS = -I$(top_srcdir)/examples $(AM_CPPFLAGS)

# MQTT pub and sub clients
examples_pub_sub_mqtt_pub_SOURCES = examples/pub-sub/mqtt-pub.c \
examples/mqttnet.c \
examples/mqttexample.c
examples_pub_sub_mqtt_pub_LDADD = src/libwolfmqtt.la
examples_pub_sub_mqtt_pub_DEPENDENCIES = src/libwolfmqtt.la
examples_pub_sub_mqtt_pub_CPPFLAGS = -I$(top_srcdir)/examples $(AM_CPPFLAGS)

examples_pub_sub_mqtt_sub_SOURCES = examples/pub-sub/mqtt-sub.c \
examples/mqttnet.c \
examples/mqttexample.c
examples_pub_sub_mqtt_sub_LDADD = src/libwolfmqtt.la
examples_pub_sub_mqtt_sub_DEPENDENCIES = src/libwolfmqtt.la
examples_pub_sub_mqtt_sub_CPPFLAGS = -I$(top_srcdir)/examples $(AM_CPPFLAGS)
endif


Expand All @@ -145,6 +163,8 @@ dist_example_DATA+= examples/multithread/multithread.c
dist_example_DATA+= examples/sn-client/sn-client.c
dist_example_DATA+= examples/sn-client/sn-client_qos-1.c
dist_example_DATA+= examples/sn-client/sn-multithread.c
dist_example_DATA+= examples/pub-sub/mqtt-pub.c
dist_example_DATA+= examples/pub-sub/mqtt-sub.c

DISTCLEANFILES+= examples/mqttclient/.libs/mqttclient \
examples/firmware/.libs/fwpush \
Expand All @@ -156,7 +176,9 @@ DISTCLEANFILES+= examples/mqttclient/.libs/mqttclient \
examples/multithread/.libs/multithread \
examples/sn-client/.libs/sn-client \
examples/sn-client/.libs/sn-client_qos-1 \
examples/sn-client/.libs/sn-multithread
examples/sn-client/.libs/sn-multithread \
examples/pub-sub/mqtt-pub \
examples/pub-sub/mqtt-sub

EXTRA_DIST+= examples/mqttuart.c \
examples/publish.dat \
Expand Down
3 changes: 0 additions & 3 deletions examples/mqttclient/mqttclient.c
Expand Up @@ -648,9 +648,6 @@ int mqttclient_test(MQTTCtx *mqttCtx)

PRINTF("MQTT Disconnect: %s (%d)",
MqttClient_ReturnCodeToString(rc), rc);
if (rc != MQTT_CODE_SUCCESS) {
goto disconn;
}

rc = MqttClient_NetDisconnect(&mqttCtx->client);

Expand Down
10 changes: 9 additions & 1 deletion examples/mqttexample.c
Expand Up @@ -247,6 +247,9 @@ void mqtt_show_usage(MQTTCtx* mqttCtx)
#endif
PRINTF("-T Test mode");
PRINTF("-f <file> Use file contents for publish");
if (!mqttCtx->debug_on) {
PRINTF("-d Enable example debug messages");
}
}

void mqtt_init_ctx(MQTTCtx* mqttCtx)
Expand All @@ -259,6 +262,7 @@ void mqtt_init_ctx(MQTTCtx* mqttCtx)
mqttCtx->client_id = kDefClientId;
mqttCtx->topic_name = kDefTopicName;
mqttCtx->cmd_timeout_ms = DEFAULT_CMD_TIMEOUT_MS;
mqttCtx->debug_on = 1;
#ifdef WOLFMQTT_V5
mqttCtx->max_packet_size = DEFAULT_MAX_PKT_SZ;
mqttCtx->topic_alias = 1;
Expand Down Expand Up @@ -286,7 +290,7 @@ int mqtt_parse_args(MQTTCtx* mqttCtx, int argc, char** argv)
#define MQTT_V5_ARGS ""
#endif

while ((rc = mygetopt(argc, argv, "?h:p:q:sk:i:lu:w:m:n:C:Tf:rt" \
while ((rc = mygetopt(argc, argv, "?h:p:q:sk:i:lu:w:m:n:C:Tf:rtd" \
MQTT_TLS_ARGS MQTT_V5_ARGS)) != -1) {
switch ((char)rc) {
case '?' :
Expand Down Expand Up @@ -364,6 +368,10 @@ int mqtt_parse_args(MQTTCtx* mqttCtx, int argc, char** argv)
mqttCtx->use_tls = 1;
break;

case 'd':
mqttCtx->debug_on = 1;
break;

#ifdef ENABLE_MQTT_TLS
case 'A':
mTlsCaFile = myoptarg;
Expand Down
1 change: 1 addition & 0 deletions examples/mqttexample.h
Expand Up @@ -168,6 +168,7 @@ typedef struct _MQTTCtx {
#endif
byte clean_session;
byte test_mode;
byte debug_on:1; /* enable debug messages in example */
#ifdef WOLFMQTT_V5
byte subId_not_avail; /* Server property */
byte enable_eauth; /* Enhanced authentication */
Expand Down
19 changes: 12 additions & 7 deletions examples/mqttnet.c
Expand Up @@ -76,8 +76,10 @@ static int NetConnect(void *context, const char* host, word16 port,

switch (sock->stat) {
case SOCK_BEGIN:
PRINTF("NetConnect: Host %s, Port %u, Timeout %d ms, Use TLS %d",
host, port, timeout_ms, mqttCtx->use_tls);
if (mqttCtx->debug_on) {
PRINTF("NetConnect: Host %s, Port %u, Timeout %d ms, Use TLS %d",
host, port, timeout_ms, mqttCtx->use_tls);
}

hostIp = FreeRTOS_gethostbyname_a(host, NULL, 0, 0);
if (hostIp == 0)
Expand Down Expand Up @@ -255,9 +257,10 @@ static int NetConnect(void *context, const char* host, word16 port,
switch(sock->stat) {
case SOCK_BEGIN:
{
PRINTF("NetConnect: Host %s, Port %u, Timeout %d ms, Use TLS %d",
host, port, timeout_ms, mqttCtx->use_tls);

if (mqttCtx->debug_on) {
PRINTF("NetConnect: Host %s, Port %u, Timeout %d ms, "
"Use TLS %d", host, port, timeout_ms, mqttCtx->use_tls);
}
XMEMSET(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
Expand Down Expand Up @@ -446,8 +449,10 @@ static int NetConnect(void *context, const char* host, word16 port,
switch(sock->stat) {
case SOCK_BEGIN:
{
PRINTF("NetConnect: Host %s, Port %u, Timeout %d ms, Use TLS %d",
host, port, timeout_ms, mqttCtx->use_tls);
if (mqttCtx->debug_on) {
PRINTF("NetConnect: Host %s, Port %u, Timeout %d ms, "
"Use TLS %d", host, port, timeout_ms, mqttCtx->use_tls);
}

XMEMSET(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
Expand Down
43 changes: 43 additions & 0 deletions examples/pub-sub/mqtt-pub-sub.h
@@ -0,0 +1,43 @@
/* mqtt-pub-sub
*
* Copyright (C) 2006-2023 wolfSSL Inc.
*
* This file is part of wolfMQTT.
*
* wolfMQTT is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfMQTT is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/

#ifndef WOLFMQTT_PUB_SUB_H
#define WOLFMQTT_PUB_SUB_H

#ifdef __cplusplus
extern "C" {
#endif


/* Exposed functions */
int pub_client(MQTTCtx *mqttCtx);
int sub_client(MQTTCtx *mqttCtx);

#if defined(NO_MAIN_DRIVER)
int mqttPub_main(int argc, char** argv);
int mqttSub_main(int argc, char** argv);
#endif

#ifdef __cplusplus
}
#endif

#endif /* WOLFMQTT_PUB_SUB_H */