Skip to content

Commit

Permalink
Merge pull request #347 from embhorn/pub_sub_client
Browse files Browse the repository at this point in the history
Adding publish and subscribe atomic client examples
  • Loading branch information
dgarske authored Oct 12, 2023
2 parents 9c8985e + 73e8273 commit 62fb8f2
Show file tree
Hide file tree
Showing 11 changed files with 1,286 additions and 14 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,13 @@ More about MQTT-SN examples in [examples/sn-client/README.md](examples/sn-client
### 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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,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 @@ -254,6 +257,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 @@ -281,7 +285,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 @@ -359,6 +363,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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,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 @@ -231,9 +233,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 @@ -422,8 +425,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
Original file line number Diff line number Diff line change
@@ -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 */
Loading

0 comments on commit 62fb8f2

Please sign in to comment.