/******************************************************************************* * Copyright (c) 2014 IBM Corp. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation *******************************************************************************/ #ifndef __MQTT_CLIENT_C_ #define __MQTT_CLIENT_C_ #include "printf.h" #include "MQTTPacket.h" #include "MQTTLinux.h" //Platform specific implementation header file #define MAX_PACKET_ID 65535 #define MAX_MESSAGE_HANDLERS 20 enum QoS { QOS0, QOS1, QOS2 }; // all failure return codes must be negative enum returnCode { BUFFER_OVERFLOW = -2, FAILURE = -1, SUCCESS = 0 }; void NewTimer(Timer *); typedef struct MQTTMessage MQTTMessage; typedef struct MessageData MessageData; struct MQTTMessage { enum QoS qos; char retained; char dup; unsigned short id; void *payload; size_t payloadlen; }; struct MessageData { MQTTMessage *message; MQTTString *topicName; }; typedef void (*messageHandler)(MessageData *); typedef struct Client Client; int MQTTConnect(Client *, MQTTPacket_connectData *); int MQTTPublish(Client *, const char *, MQTTMessage *); int MQTTSubscribe(Client *, const char *, enum QoS, messageHandler); int MQTTUnsubscribe(Client *, const char *); int MQTTDisconnect(Client *); int MQTTYield(Client *, int); void setDefaultMessageHandler(Client *, messageHandler); void MQTTClient(Client *, Network *, unsigned int, unsigned char *, size_t, unsigned char *, size_t); struct Client { unsigned int next_packetid; unsigned int command_timeout_ms; size_t buf_size, readbuf_size; unsigned char *buf; unsigned char *readbuf; unsigned int keepAliveInterval; char ping_outstanding; char wait_pong; char isconnected; struct MessageHandlers { const char *topicFilter; void (*fp)(MessageData *); } messageHandlers[MAX_MESSAGE_HANDLERS]; // Message handlers are indexed by subscription topic void (*defaultMessageHandler)(MessageData *); Network *ipstack; Timer ping_timer; Timer pong_timer; OS_MUTEX send_mutex; }; #define DefaultClient {0, 0, 0, 0, NULL, NULL, 0, 0, 0} #endif