/******************************************************************************* | |
* 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 MQTTPACKET_H_ | |
#define MQTTPACKET_H_ | |
#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */ | |
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 | |
enum errors | |
{ | |
MQTTPACKET_BUFFER_TOO_SHORT = -2, | |
MQTTPACKET_READ_ERROR = -1, | |
MQTTPACKET_READ_COMPLETE | |
}; | |
enum msgTypes | |
{ | |
CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL, | |
PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, | |
PINGREQ, PINGRESP, DISCONNECT | |
}; | |
/** | |
* Bitfields for the MQTT header byte. | |
*/ | |
typedef union | |
{ | |
unsigned char byte; /**< the whole byte */ | |
#if defined(REVERSED) | |
struct | |
{ | |
unsigned int type : 4; /**< message type nibble */ | |
unsigned int dup : 1; /**< DUP flag bit */ | |
unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */ | |
unsigned int retain : 1; /**< retained flag bit */ | |
} bits; | |
#else | |
struct | |
{ | |
unsigned int retain : 1; /**< retained flag bit */ | |
unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */ | |
unsigned int dup : 1; /**< DUP flag bit */ | |
unsigned int type : 4; /**< message type nibble */ | |
} bits; | |
#endif | |
} MQTTHeader; | |
typedef struct | |
{ | |
int len; | |
char* data; | |
} MQTTLenString; | |
typedef struct | |
{ | |
char* cstring; | |
MQTTLenString lenstring; | |
} MQTTString; | |
#define MQTTString_initializer {NULL, {0, NULL}} | |
int MQTTstrlen(MQTTString mqttstring); | |
#include "MQTTConnect.h" | |
#include "MQTTPublish.h" | |
#include "MQTTSubscribe.h" | |
#include "MQTTUnsubscribe.h" | |
#include "MQTTFormat.h" | |
int MQTTSerialize_ack(unsigned char* buf, int buflen, unsigned char type, unsigned char dup, unsigned short packetid); | |
int MQTTDeserialize_ack(unsigned char* packettype, unsigned char* dup, unsigned short* packetid, unsigned char* buf, int buflen); | |
int MQTTPacket_len(int rem_len); | |
int MQTTPacket_equals(MQTTString* a, char* b); | |
int MQTTPacket_encode(unsigned char* buf, int length); | |
int MQTTPacket_decode(int (*getcharfn)(unsigned char*, int), int* value); | |
int MQTTPacket_decodeBuf(unsigned char* buf, int* value); | |
int readInt(unsigned char** pptr); | |
char readChar(unsigned char** pptr); | |
void writeChar(unsigned char** pptr, char c); | |
void writeInt(unsigned char** pptr, int anInt); | |
int readMQTTLenString(MQTTString* mqttstring, unsigned char** pptr, unsigned char* enddata); | |
void writeCString(unsigned char** pptr, const char* string); | |
void writeMQTTString(unsigned char** pptr, MQTTString mqttstring); | |
DLLExport int MQTTPacket_read(unsigned char* buf, int buflen, int (*getfn)(unsigned char*, int)); | |
typedef struct { | |
int (*getfn)(void *, unsigned char*, int); /* must return -1 for error, 0 for call again, or the number of bytes read */ | |
void *sck; /* pointer to whatever the system may use to identify the transport */ | |
int multiplier; | |
int rem_len; | |
int len; | |
char state; | |
}MQTTTransport; | |
int MQTTPacket_readnb(unsigned char* buf, int buflen, MQTTTransport *trp); | |
#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */ | |
} | |
#endif | |
#endif /* MQTTPACKET_H_ */ |