134 lines
3.9 KiB
C
134 lines
3.9 KiB
C
|
/*******************************************************************************
|
||
|
* 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_ */
|