Pavle Radojkovic / mbed-mqtt
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MQTTGWPacket.h Source File

MQTTGWPacket.h

00001 /*******************************************************************************
00002  * Copyright (c) 2009, 2014 IBM Corp.
00003  *
00004  * All rights reserved. This program and the accompanying materials
00005  * are made available under the terms of the Eclipse Public License v1.0
00006  * and Eclipse Distribution License v1.0 which accompany this distribution.
00007  *
00008  * The Eclipse Public License is available at
00009  *    http://www.eclipse.org/legal/epl-v10.html
00010  * and the Eclipse Distribution License is available at
00011  *   http://www.eclipse.org/org/documents/edl-v10.php.
00012  *
00013  * Contributors:
00014  *    Ian Craggs - initial API and implementation and/or initial documentation
00015  *    Ian Craggs, Allan Stockdill-Mander - SSL updates
00016  *    Ian Craggs - MQTT 3.1.1 support
00017  *    Tomoaki Yamaguchi - modify codes for MATT-SN Gateway
00018  *******************************************************************************/
00019 
00020 #ifndef MQTTGWPACKET_H_
00021 #define MQTTGWPACKET_H_
00022 
00023 #include "Network.h"
00024 
00025 namespace MQTTSNGW
00026 {
00027 
00028 typedef void* (*pf)(unsigned char, char*, size_t);
00029 
00030 #define BAD_MQTT_PACKET -4
00031 
00032 enum msgTypes
00033 {
00034     CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,
00035     PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,
00036     PINGREQ, PINGRESP, DISCONNECT
00037 };
00038 
00039 
00040 /**
00041  * Bitfields for the MQTT header byte.
00042  */
00043 typedef union
00044 {
00045     /*unsigned*/ char byte; /**< the whole byte */
00046 #if defined(REVERSED)
00047     struct
00048     {
00049         unsigned int type : 4;  /**< message type nibble */
00050         bool dup : 1;           /**< DUP flag bit */
00051         unsigned int qos : 2;   /**< QoS value, 0, 1 or 2 */
00052         bool retain : 1;        /**< retained flag bit */
00053     } bits;
00054 #else
00055     struct
00056     {
00057         bool retain : 1;        /**< retained flag bit */
00058         unsigned int qos : 2;   /**< QoS value, 0, 1 or 2 */
00059         bool dup : 1;           /**< DUP flag bit */
00060         unsigned int type : 4;  /**< message type nibble */
00061     } bits;
00062 #endif
00063 } Header;
00064 
00065 
00066 /**
00067  * Data for a connect packet.
00068  */
00069 
00070 enum MQTT_connackCodes{
00071     MQTT_CONNECTION_ACCEPTED ,
00072     MQTT_UNACCEPTABLE_PROTOCOL_VERSION,
00073     MQTT_IDENTIFIER_REJECTED,
00074     MQTT_SERVER_UNAVAILABLE,
00075     MQTT_BAD_USERNAME_OR_PASSWORD,
00076     MQTT_NOT_AUTHORIZED
00077 };
00078 
00079 typedef struct
00080 {
00081     Header header;  /**< MQTT header byte */
00082     union
00083     {
00084         unsigned char all;  /**< all connect flags */
00085 #if defined(REVERSED)
00086         struct
00087         {
00088             bool username : 1;          /**< 3.1 user name */
00089             bool password : 1;          /**< 3.1 password */
00090             bool willRetain : 1;        /**< will retain setting */
00091             unsigned int willQoS : 2;   /**< will QoS value */
00092             bool will : 1;          /**< will flag */
00093             bool cleanstart : 1;    /**< cleansession flag */
00094             int : 1;    /**< unused */
00095         } bits;
00096 #else
00097         struct
00098         {
00099             int : 1;    /**< unused */
00100             bool cleanstart : 1;    /**< cleansession flag */
00101             bool will : 1;          /**< will flag */
00102             unsigned int willQoS : 2;   /**< will QoS value */
00103             bool willRetain : 1;        /**< will retain setting */
00104             bool password : 1;          /**< 3.1 password */
00105             bool username : 1;          /**< 3.1 user name */
00106         } bits;
00107 #endif
00108     } flags;    /**< connect flags byte */
00109 
00110     char *Protocol, /**< MQTT protocol name */
00111         *clientID,  /**< string client id */
00112         *willTopic, /**< will topic */
00113         *willMsg;   /**< will payload */
00114 
00115     int keepAliveTimer;     /**< keepalive timeout value in seconds */
00116     unsigned char version;  /**< MQTT version number */
00117 } Connect;
00118 
00119 #define MQTTPacket_Connect_Initializer {{0}, 0, nullptr, nullptr, nullptr, nullptr, 0, 0}
00120 #define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 }
00121 #define MQTTPacket_connectData_initializer { {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, \
00122         MQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} }
00123 
00124 
00125 
00126 /**
00127  * Data for a willMessage.
00128  */
00129 typedef struct
00130 {
00131     char* topic;
00132     char* msg;
00133     int retained;
00134     int qos;
00135 }willMessages;
00136 
00137 /**
00138  * Data for a connack packet.
00139  */
00140 typedef struct
00141 {
00142     Header header; /**< MQTT header byte */
00143     union
00144     {
00145         unsigned char all;  /**< all connack flags */
00146 #if defined(REVERSED)
00147         struct
00148         {
00149             unsigned int reserved : 7;  /**< message type nibble */
00150             bool sessionPresent : 1;    /**< was a session found on the server? */
00151         } bits;
00152 #else
00153         struct
00154         {
00155             bool sessionPresent : 1;    /**< was a session found on the server? */
00156             unsigned int reserved : 7;  /**< message type nibble */
00157         } bits;
00158 #endif
00159     } flags;     /**< connack flags byte */
00160     char rc; /**< connack return code */
00161 } Connack;
00162 
00163 
00164 /**
00165  * Data for a publish packet.
00166  */
00167 typedef struct
00168 {
00169     Header header;  /**< MQTT header byte */
00170     char* topic;    /**< topic string */
00171     int topiclen;
00172     int msgId;      /**< MQTT message id */
00173     char* payload;  /**< binary payload, length delimited */
00174     int payloadlen; /**< payload length */
00175 } Publish;
00176 
00177 #define MQTTPacket_Publish_Initializer {{0}, nullptr, 0, 0, nullptr, 0}
00178 
00179 /**
00180  * Data for one of the ack packets.
00181  */
00182 typedef struct
00183 {
00184     Header header;  /**< MQTT header byte */
00185     int msgId;      /**< MQTT message id */
00186 } Ack;
00187 
00188 /**
00189  * UTF8String.
00190  */
00191 typedef struct
00192 {
00193     unsigned char len;
00194     char*  data;
00195 } UTF8String;
00196 
00197 /**
00198  * Class MQTT Packet
00199  */
00200 class MQTTGWPacket
00201 {
00202 public:
00203     MQTTGWPacket();
00204     ~MQTTGWPacket();
00205     int recv(Network* network);
00206     int send(Network* network);
00207     int getType(void);
00208     int getPacketData(unsigned char* buf);
00209     int getPacketLength(void);
00210     const char* getName(void);
00211 
00212     int getAck(Ack* ack);
00213     int getCONNACK(Connack* resp);
00214     int getSUBACK(unsigned short* msgId, unsigned char* rc);
00215     int getPUBLISH(Publish* pub);
00216 
00217     int setCONNECT(Connect* conect, unsigned char* username, unsigned char* password);
00218     int setPUBLISH(Publish* pub);
00219     int setAck(unsigned char msgType, unsigned short msgid);
00220     int setHeader(unsigned char msgType);
00221     int setSUBSCRIBE(const char* topic, unsigned char qos, unsigned short msgId);
00222     int setUNSUBSCRIBE(const char* topics, unsigned short msgid);
00223 
00224     UTF8String getTopic(void);
00225     char* getMsgId(char* buf);
00226     int getMsgId(void);
00227     void setMsgId(int msgId);
00228     char* print(char* buf);
00229     MQTTGWPacket& operator =(MQTTGWPacket& packet);
00230 
00231 private:
00232     void  clearData(void);
00233     Header   _header;
00234     int _remainingLength;
00235     unsigned char* _data;
00236 };
00237 
00238 }
00239 
00240 #endif /* MQTTGWPACKET_H_ */