Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/mqttexample.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,9 @@ typedef struct _MQTTCtx {
unsigned int useNonBlockMode:1; /* set to use non-blocking mode.
network callbacks can return MQTT_CODE_CONTINUE to indicate "would block" */
#endif
#ifdef WOLFMQTT_WOLFIP
struct wolfIP *stack; /* wolfIP TCP/IP stack instance */
#endif
} MQTTCtx;


Expand Down
131 changes: 131 additions & 0 deletions examples/mqttnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -1157,6 +1157,132 @@ static int NetDisconnect(void *context)
return 0;
}

/* -------------------------------------------------------------------------- */
/* WOLFIP TCP/IP STACK NETWORK CALLBACK EXAMPLE */
/* -------------------------------------------------------------------------- */
#elif defined(WOLFMQTT_WOLFIP)

static int NetDisconnect(void *context)
{
SocketContext *sock = (SocketContext*)context;
if (sock) {
if (sock->fd != SOCKET_INVALID) {
wolfIP_sock_close(sock->stack, sock->fd);
sock->fd = SOCKET_INVALID;
}
sock->stat = SOCK_BEGIN;
}
return 0;
}

static int NetConnect(void *context, const char* host, word16 port,
int timeout_ms)
{
SocketContext *sock = (SocketContext*)context;
struct wolfIP_sockaddr_in addr;
int rc;

(void)timeout_ms;

if (context == NULL || host == NULL) {
return MQTT_CODE_ERROR_BAD_ARG;
}

switch (sock->stat) {
case SOCK_BEGIN:
{
/* Create TCP socket */
sock->fd = wolfIP_sock_socket(sock->stack, AF_INET,
IPSTACK_SOCK_STREAM, 0);
if (sock->fd < 0) {
return MQTT_CODE_ERROR_NETWORK;
}

sock->stat = SOCK_CONN;
}
FALL_THROUGH;

case SOCK_CONN:
{
/* Set up address and initiate connect.
* Note: atoip4() only supports dotted-quad IPv4 strings
* (e.g., "192.168.1.1") and does not resolve DNS hostnames. */
XMEMSET(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = ee16(port);
addr.sin_addr.s_addr = atoip4(host);
if (addr.sin_addr.s_addr == 0) {
NetDisconnect(context);
return MQTT_CODE_ERROR_BAD_ARG;
}

rc = wolfIP_sock_connect(sock->stack, sock->fd,
(struct wolfIP_sockaddr *)&addr, sizeof(addr));
if (rc == 0) {
return MQTT_CODE_SUCCESS;
}
if (rc == -WOLFIP_EAGAIN) {
return MQTT_CODE_CONTINUE;
}

/* Connection failed */
NetDisconnect(context);
return MQTT_CODE_ERROR_NETWORK;
}

default:
break;
}

return MQTT_CODE_ERROR_NETWORK;
}

static int NetRead(void *context, byte* buf, int buf_len, int timeout_ms)
{
SocketContext *sock = (SocketContext*)context;
int rc;

(void)timeout_ms;

if (context == NULL || buf == NULL || buf_len <= 0) {
return MQTT_CODE_ERROR_BAD_ARG;
}

rc = wolfIP_sock_recv(sock->stack, sock->fd, buf, buf_len, 0);
/* -WOLFIP_EAGAIN: no data yet; -1: socket not yet in ESTABLISHED state */
if (rc == -WOLFIP_EAGAIN || rc == -1) {
return MQTT_CODE_CONTINUE;
}
if (rc <= 0) {
return MQTT_CODE_ERROR_NETWORK;
}
return rc;
}

static int NetWrite(void *context, const byte* buf, int buf_len,
int timeout_ms)
{
SocketContext *sock = (SocketContext*)context;
int rc;

(void)timeout_ms;

if (context == NULL || buf == NULL || buf_len <= 0) {
return MQTT_CODE_ERROR_BAD_ARG;
}

rc = wolfIP_sock_send(sock->stack, sock->fd, buf, buf_len, 0);
/* -WOLFIP_EAGAIN: send buffer full; -1: socket not yet in ESTABLISHED state */
if (rc == -WOLFIP_EAGAIN || rc == -1) {
return MQTT_CODE_CONTINUE;
}
if (rc <= 0) {
return MQTT_CODE_ERROR_NETWORK;
}
return rc;
}


/* -------------------------------------------------------------------------- */
/* GENERIC BSD SOCKET TCP NETWORK CALLBACK EXAMPLE */
/* -------------------------------------------------------------------------- */
Expand Down Expand Up @@ -1807,6 +1933,11 @@ int MqttClientNet_Init(MqttNet* net, MQTTCtx* mqttCtx)
#endif
sockCtx->stat = SOCK_BEGIN;
sockCtx->mqttCtx = mqttCtx;
#ifdef WOLFMQTT_WOLFIP
if (mqttCtx != NULL) {
sockCtx->stack = mqttCtx->stack;
}
#endif

#if defined(WOLFMQTT_MULTITHREAD) && defined(WOLFMQTT_ENABLE_STDIN_CAP)
/* setup the pipe for waking select() */
Expand Down
3 changes: 3 additions & 0 deletions examples/mqttnet.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ typedef struct _SocketContext {
NX_IP *ipPtr;
NX_PACKET *nxPacket;
ULONG nxOffset;
#endif
#ifdef WOLFMQTT_WOLFIP
struct wolfIP *stack;
#endif
MQTTCtx* mqttCtx;
} SocketContext;
Expand Down
13 changes: 13 additions & 0 deletions examples/mqttport.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,19 @@ extern "C" {
#include "lwip/sockets.h"
#include "lwip/netdb.h"

/* wolfIP TCP/IP stack */
#elif defined(WOLFMQTT_WOLFIP)
#include "wolfip.h"

#define SOCKET_T int
#define SOCKET_INVALID (-1)
#define SOCK_ADDR_IN struct wolfIP_sockaddr_in
/* For wolfIP targets without filesystem support, define NO_FILESYSTEM
* via build configuration (e.g., compiler flags or user_settings.h). */
#ifndef NO_FILESYSTEM
#define NO_FILESYSTEM
#endif

/* User defined IO */
#elif defined(WOLFMQTT_USER_IO)
#include "userio_template.h"
Expand Down
Loading