-
Notifications
You must be signed in to change notification settings - Fork 331
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add to paho MQTT 3.1.1 (ioLibrary interface porting)
- Loading branch information
Showing
21 changed files
with
3,456 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2014, 2015 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 | ||
* Ian Craggs - documentation and platform specific header | ||
*******************************************************************************/ | ||
|
||
#if !defined(__MQTT_CLIENT_C_) | ||
#define __MQTT_CLIENT_C_ | ||
|
||
#if defined(__cplusplus) | ||
extern "C" { | ||
#endif | ||
|
||
#if defined(WIN32_DLL) || defined(WIN64_DLL) | ||
#define DLLImport __declspec(dllimport) | ||
#define DLLExport __declspec(dllexport) | ||
#elif defined(LINUX_SO) | ||
#define DLLImport extern | ||
#define DLLExport __attribute__ ((visibility ("default"))) | ||
#else | ||
#define DLLImport | ||
#define DLLExport | ||
#endif | ||
|
||
#include "MQTTPacket.h" | ||
#include "stdio.h" | ||
#include "mqtt_interface.h" | ||
|
||
#define MAX_PACKET_ID 65535 /* according to the MQTT specification - do not change! */ | ||
|
||
#if !defined(MAX_MESSAGE_HANDLERS) | ||
#define MAX_MESSAGE_HANDLERS 5 /* redefinable - how many subscriptions do you want? */ | ||
#endif | ||
|
||
enum QoS { QOS0, QOS1, QOS2 }; | ||
|
||
/* all failure return codes must be negative */ | ||
enum returnCode { BUFFER_OVERFLOW = -2, FAILURE = -1, SUCCESSS = 0 }; | ||
|
||
/* The Platform specific header must define the Network and Timer structures and functions | ||
* which operate on them. | ||
* | ||
typedef struct Network | ||
{ | ||
int (*mqttread)(Network*, unsigned char* read_buffer, int, int); | ||
int (*mqttwrite)(Network*, unsigned char* send_buffer, int, int); | ||
} Network;*/ | ||
|
||
/* The Timer structure must be defined in the platform specific header, | ||
* and have the following functions to operate on it. */ | ||
extern void TimerInit(Timer*); | ||
extern char TimerIsExpired(Timer*); | ||
extern void TimerCountdownMS(Timer*, unsigned int); | ||
extern void TimerCountdown(Timer*, unsigned int); | ||
extern int TimerLeftMS(Timer*); | ||
|
||
typedef struct MQTTMessage | ||
{ | ||
enum QoS qos; | ||
unsigned char retained; | ||
unsigned char dup; | ||
unsigned short id; | ||
void *payload; | ||
size_t payloadlen; | ||
} MQTTMessage; | ||
|
||
typedef struct MessageData | ||
{ | ||
MQTTMessage* message; | ||
MQTTString* topicName; | ||
} MessageData; | ||
|
||
typedef void (*messageHandler)(MessageData*); | ||
|
||
typedef struct MQTTClient | ||
{ | ||
unsigned int next_packetid, | ||
command_timeout_ms; | ||
size_t buf_size, | ||
readbuf_size; | ||
unsigned char *buf, | ||
*readbuf; | ||
unsigned int keepAliveInterval; | ||
char ping_outstanding; | ||
int 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; | ||
#if defined(MQTT_TASK) | ||
Mutex mutex; | ||
Thread thread; | ||
#endif | ||
} MQTTClient; | ||
|
||
#define DefaultClient {0, 0, 0, 0, NULL, NULL, 0, 0, 0} | ||
|
||
|
||
/** | ||
* Create an MQTT client object | ||
* @param client | ||
* @param network | ||
* @param command_timeout_ms | ||
* @param | ||
*/ | ||
DLLExport void MQTTClientInit(MQTTClient* client, Network* network, unsigned int command_timeout_ms, | ||
unsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size); | ||
|
||
/** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack | ||
* The nework object must be connected to the network endpoint before calling this | ||
* @param options - connect options | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTConnect(MQTTClient* client, MQTTPacket_connectData* options); | ||
|
||
/** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs | ||
* @param client - the client object to use | ||
* @param topic - the topic to publish to | ||
* @param message - the message to send | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTPublish(MQTTClient* client, const char*, MQTTMessage*); | ||
|
||
/** MQTT Subscribe - send an MQTT subscribe packet and wait for suback before returning. | ||
* @param client - the client object to use | ||
* @param topicFilter - the topic filter to subscribe to | ||
* @param message - the message to send | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTSubscribe(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler); | ||
|
||
/** MQTT Subscribe - send an MQTT unsubscribe packet and wait for unsuback before returning. | ||
* @param client - the client object to use | ||
* @param topicFilter - the topic filter to unsubscribe from | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTUnsubscribe(MQTTClient* client, const char* topicFilter); | ||
|
||
/** MQTT Disconnect - send an MQTT disconnect packet and close the connection | ||
* @param client - the client object to use | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTDisconnect(MQTTClient* client); | ||
|
||
/** MQTT Yield - MQTT background | ||
* @param client - the client object to use | ||
* @param time - the time, in milliseconds, to yield for | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTYield(MQTTClient* client, int time); | ||
|
||
#if defined(MQTT_TASK) | ||
/** MQTT start background thread for a client. After this, MQTTYield should not be called. | ||
* @param client - the client object to use | ||
* @return success code | ||
*/ | ||
DLLExport int MQTTStartTask(MQTTClient* client); | ||
#endif | ||
|
||
#if defined(__cplusplus) | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
/******************************************************************************* | ||
* 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: | ||
* Ian Craggs - initial API and implementation and/or initial documentation | ||
* Xiang Rong - 442039 Add makefile to Embedded C client | ||
*******************************************************************************/ | ||
|
||
#ifndef MQTTCONNECT_H_ | ||
#define MQTTCONNECT_H_ | ||
|
||
#if !defined(DLLImport) | ||
#define DLLImport | ||
#endif | ||
#if !defined(DLLExport) | ||
#define DLLExport | ||
#endif | ||
|
||
|
||
typedef union | ||
{ | ||
unsigned char all; /**< all connect flags */ | ||
#if defined(REVERSED) | ||
struct | ||
{ | ||
unsigned int username : 1; /**< 3.1 user name */ | ||
unsigned int password : 1; /**< 3.1 password */ | ||
unsigned int willRetain : 1; /**< will retain setting */ | ||
unsigned int willQoS : 2; /**< will QoS value */ | ||
unsigned int will : 1; /**< will flag */ | ||
unsigned int cleansession : 1; /**< clean session flag */ | ||
unsigned int : 1; /**< unused */ | ||
} bits; | ||
#else | ||
struct | ||
{ | ||
unsigned int : 1; /**< unused */ | ||
unsigned int cleansession : 1; /**< cleansession flag */ | ||
unsigned int will : 1; /**< will flag */ | ||
unsigned int willQoS : 2; /**< will QoS value */ | ||
unsigned int willRetain : 1; /**< will retain setting */ | ||
unsigned int password : 1; /**< 3.1 password */ | ||
unsigned int username : 1; /**< 3.1 user name */ | ||
} bits; | ||
#endif | ||
} MQTTConnectFlags; /**< connect flags byte */ | ||
|
||
|
||
|
||
/** | ||
* Defines the MQTT "Last Will and Testament" (LWT) settings for | ||
* the connect packet. | ||
*/ | ||
typedef struct | ||
{ | ||
/** The eyecatcher for this structure. must be MQTW. */ | ||
char struct_id[4]; | ||
/** The version number of this structure. Must be 0 */ | ||
int struct_version; | ||
/** The LWT topic to which the LWT message will be published. */ | ||
MQTTString topicName; | ||
/** The LWT payload. */ | ||
MQTTString message; | ||
/** | ||
* The retained flag for the LWT message (see MQTTAsync_message.retained). | ||
*/ | ||
unsigned char retained; | ||
/** | ||
* The quality of service setting for the LWT message (see | ||
* MQTTAsync_message.qos and @ref qos). | ||
*/ | ||
char qos; | ||
} MQTTPacket_willOptions; | ||
|
||
|
||
#define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 } | ||
|
||
|
||
typedef struct | ||
{ | ||
/** The eyecatcher for this structure. must be MQTC. */ | ||
char struct_id[4]; | ||
/** The version number of this structure. Must be 0 */ | ||
int struct_version; | ||
/** Version of MQTT to be used. 3 = 3.1 4 = 3.1.1 | ||
*/ | ||
unsigned char MQTTVersion; | ||
MQTTString clientID; | ||
unsigned short keepAliveInterval; | ||
unsigned char cleansession; | ||
unsigned char willFlag; | ||
MQTTPacket_willOptions will; | ||
MQTTString username; | ||
MQTTString password; | ||
} MQTTPacket_connectData; | ||
|
||
typedef union | ||
{ | ||
unsigned char all; /**< all connack flags */ | ||
#if defined(REVERSED) | ||
struct | ||
{ | ||
unsigned int sessionpresent : 1; /**< session present flag */ | ||
unsigned int : 7; /**< unused */ | ||
} bits; | ||
#else | ||
struct | ||
{ | ||
unsigned int : 7; /**< unused */ | ||
unsigned int sessionpresent : 1; /**< session present flag */ | ||
} bits; | ||
#endif | ||
} MQTTConnackFlags; /**< connack flags byte */ | ||
|
||
#define MQTTPacket_connectData_initializer { {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, \ | ||
MQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} } | ||
|
||
DLLExport int MQTTSerialize_connect(unsigned char* buf, int buflen, MQTTPacket_connectData* options); | ||
DLLExport int MQTTDeserialize_connect(MQTTPacket_connectData* data, unsigned char* buf, int len); | ||
|
||
DLLExport int MQTTSerialize_connack(unsigned char* buf, int buflen, unsigned char connack_rc, unsigned char sessionPresent); | ||
DLLExport int MQTTDeserialize_connack(unsigned char* sessionPresent, unsigned char* connack_rc, unsigned char* buf, int buflen); | ||
|
||
DLLExport int MQTTSerialize_disconnect(unsigned char* buf, int buflen); | ||
DLLExport int MQTTSerialize_pingreq(unsigned char* buf, int buflen); | ||
|
||
#endif /* MQTTCONNECT_H_ */ |
Oops, something went wrong.