mirror of
https://gitee.com/beecue/fastbee.git
synced 2025-12-18 00:45:55 +08:00
116 lines
3.5 KiB
C
116 lines
3.5 KiB
C
/*
|
|
* Copyright (C) 2015-2018 Alibaba Group Holding Limited
|
|
*/
|
|
|
|
#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
|
|
};
|
|
|
|
|
|
/* CPT, control packet type */
|
|
enum msgTypes {
|
|
MQTT_CPT_RESERVED = 0, CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,
|
|
PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,
|
|
PINGREQ, PINGRESP, DISCONNECT
|
|
};
|
|
|
|
#define MQTT_HEADER_BIT_MASK_TYPE (0xF0)
|
|
#define MQTT_HEADER_BIT_MASK_DUP (0x08)
|
|
#define MQTT_HEADER_BIT_MASK_QOS (0x06)
|
|
#define MQTT_HEADER_BIT_MASK_RETAIN (0x01)
|
|
|
|
#define MQTT_HEADER_GET_TYPE(head) ((head & 0xF0) >> 4)
|
|
#define MQTT_HEADER_GET_DUP(head) ((head & 0x08) >> 3)
|
|
#define MQTT_HEADER_GET_QOS(head) ((head & 0x06) >> 1)
|
|
#define MQTT_HEADER_GET_RETAIN(head) (head & 0x01)
|
|
|
|
#define MQTT_HEADER_SET_TYPE(head, type) do {head |= ((type << 4) & 0xF0); } while (0)
|
|
#define MQTT_HEADER_SET_DUP(head, dup) do {head |= ((dup << 3) & 0x08); } while (0)
|
|
#define MQTT_HEADER_SET_QOS(head, qos) do {head |= ((qos << 1) & 0x06); } while (0)
|
|
#define MQTT_HEADER_SET_RETAIN(head, retain) do {head |= (retain & 0x01); } while (0)
|
|
|
|
/**
|
|
* Bitfields for the MQTT header byte.
|
|
*/
|
|
typedef union
|
|
{
|
|
unsigned char byte; /**< the whole byte */
|
|
} 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"
|
|
|
|
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);
|
|
|
|
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;
|
|
|
|
#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif /* MQTTPACKET_H_ */
|
|
|
|
|