1 /******************************************************************************* 2 * Copyright (c) 2009, 2018 IBM Corp. 3 * 4 * All rights reserved. This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License v1.0 6 * and Eclipse Distribution License v1.0 which accompany this distribution. 7 * 8 * The Eclipse Public License is available at 9 * http://www.eclipse.org/legal/epl-v10.html 10 * and the Eclipse Distribution License is available at 11 * http://www.eclipse.org/org/documents/edl-v10.php. 12 * 13 * Contributors: 14 * Ian Craggs - initial API and implementation and/or initial documentation 15 * Ian Craggs, Allan Stockdill-Mander - SSL updates 16 * Ian Craggs - MQTT 3.1.1 support 17 * Ian Craggs - big endian Linux reversed definition 18 * Ian Craggs - MQTT 5.0 support 19 *******************************************************************************/ 20 21 #if !defined(MQTTPACKET_H) 22 #define MQTTPACKET_H 23 24 #include "Socket.h" 25 #if defined(OPENSSL) || defined(MBEDTLS) 26 #include "SSLSocket.h" 27 #endif 28 #include "LinkedList.h" 29 #include "Clients.h" 30 31 #if !defined (__LITEOS__) 32 typedef unsigned int bool; 33 #endif 34 35 typedef void* (*pf)(int, unsigned char, char*, size_t); 36 37 #include "MQTTProperties.h" 38 #include "MQTTReasonCodes.h" 39 40 enum errors 41 { 42 MQTTPACKET_BAD = -4, 43 MQTTPACKET_BUFFER_TOO_SHORT = -2, 44 MQTTPACKET_READ_ERROR = -1, 45 MQTTPACKET_READ_COMPLETE 46 }; 47 48 49 enum msgTypes 50 { 51 CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL, 52 PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, 53 PINGREQ, PINGRESP, DISCONNECT, AUTH 54 }; 55 56 #if defined(__linux__) 57 #include <endian.h> 58 #if __BYTE_ORDER == __BIG_ENDIAN 59 #define REVERSED 1 60 #endif 61 #endif 62 63 /** 64 * Bitfields for the MQTT header byte. 65 */ 66 typedef union 67 { 68 /*unsigned*/ char byte; /**< the whole byte */ 69 #if defined(REVERSED) 70 struct 71 { 72 unsigned int type : 4; /**< message type nibble */ 73 bool dup : 1; /**< DUP flag bit */ 74 unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */ 75 bool retain : 1; /**< retained flag bit */ 76 } bits; 77 #else 78 struct 79 { 80 bool retain : 1; /**< retained flag bit */ 81 unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */ 82 bool dup : 1; /**< DUP flag bit */ 83 unsigned int type : 4; /**< message type nibble */ 84 } bits; 85 #endif 86 } Header; 87 88 89 /** 90 * Data for a connect packet. 91 */ 92 typedef struct 93 { 94 Header header; /**< MQTT header byte */ 95 union 96 { 97 unsigned char all; /**< all connect flags */ 98 #if defined(REVERSED) 99 struct 100 { 101 bool username : 1; /**< 3.1 user name */ 102 bool password : 1; /**< 3.1 password */ 103 bool willRetain : 1; /**< will retain setting */ 104 unsigned int willQoS : 2; /**< will QoS value */ 105 bool will : 1; /**< will flag */ 106 bool cleanstart : 1; /**< cleansession flag */ 107 int : 1; /**< unused */ 108 } bits; 109 #else 110 struct 111 { 112 int : 1; /**< unused */ 113 bool cleanstart : 1; /**< cleansession flag */ 114 bool will : 1; /**< will flag */ 115 unsigned int willQoS : 2; /**< will QoS value */ 116 bool willRetain : 1; /**< will retain setting */ 117 bool password : 1; /**< 3.1 password */ 118 bool username : 1; /**< 3.1 user name */ 119 } bits; 120 #endif 121 } flags; /**< connect flags byte */ 122 123 char *Protocol, /**< MQTT protocol name */ 124 *clientID, /**< string client id */ 125 *willTopic, /**< will topic */ 126 *willMsg; /**< will payload */ 127 128 int keepAliveTimer; /**< keepalive timeout value in seconds */ 129 unsigned char version; /**< MQTT version number */ 130 } Connect; 131 132 133 /** 134 * Data for a connack packet. 135 */ 136 typedef struct 137 { 138 Header header; /**< MQTT header byte */ 139 union 140 { 141 unsigned char all; /**< all connack flags */ 142 #if defined(REVERSED) 143 struct 144 { 145 unsigned int reserved : 7; /**< message type nibble */ 146 bool sessionPresent : 1; /**< was a session found on the server? */ 147 } bits; 148 #else 149 struct 150 { 151 bool sessionPresent : 1; /**< was a session found on the server? */ 152 unsigned int reserved : 7; /**< message type nibble */ 153 } bits; 154 #endif 155 } flags; /**< connack flags byte */ 156 unsigned char rc; /**< connack reason code */ 157 unsigned int MQTTVersion; /**< the version of MQTT */ 158 MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */ 159 } Connack; 160 161 162 /** 163 * Data for a packet with header only. 164 */ 165 typedef struct 166 { 167 Header header; /**< MQTT header byte */ 168 } MQTTPacket; 169 170 171 /** 172 * Data for a suback packet. 173 */ 174 typedef struct 175 { 176 Header header; /**< MQTT header byte */ 177 int msgId; /**< MQTT message id */ 178 int MQTTVersion; /**< the version of MQTT */ 179 MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */ 180 List* qoss; /**< list of granted QoSs (MQTT 3/4) / reason codes (MQTT 5) */ 181 } Suback; 182 183 184 /** 185 * Data for an MQTT V5 unsuback packet. 186 */ 187 typedef struct 188 { 189 Header header; /**< MQTT header byte */ 190 int msgId; /**< MQTT message id */ 191 int MQTTVersion; /**< the version of MQTT */ 192 MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */ 193 List* reasonCodes; /**< list of reason codes */ 194 } Unsuback; 195 196 197 /** 198 * Data for a publish packet. 199 */ 200 typedef struct 201 { 202 Header header; /**< MQTT header byte */ 203 char* topic; /**< topic string */ 204 int topiclen; 205 int msgId; /**< MQTT message id */ 206 char* payload; /**< binary payload, length delimited */ 207 int payloadlen; /**< payload length */ 208 int MQTTVersion; /**< the version of MQTT */ 209 MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */ 210 } Publish; 211 212 213 /** 214 * Data for one of the ack packets. 215 */ 216 typedef struct 217 { 218 Header header; /**< MQTT header byte */ 219 int msgId; /**< MQTT message id */ 220 unsigned char rc; /**< MQTT 5 reason code */ 221 int MQTTVersion; /**< the version of MQTT */ 222 MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */ 223 } Ack; 224 225 typedef Ack Puback; 226 typedef Ack Pubrec; 227 typedef Ack Pubrel; 228 typedef Ack Pubcomp; 229 230 int MQTTPacket_encode(char* buf, size_t length); 231 int MQTTPacket_decode(networkHandles* net, size_t* value); 232 int readInt(char** pptr); 233 char* readUTF(char** pptr, char* enddata); 234 unsigned char readChar(char** pptr); 235 void writeChar(char** pptr, char c); 236 void writeInt(char** pptr, int anInt); 237 void writeUTF(char** pptr, const char* string); 238 void writeData(char** pptr, const void* data, int datalen); 239 240 const char* MQTTPacket_name(int ptype); 241 242 void* MQTTPacket_Factory(int MQTTVersion, networkHandles* net, int* error); 243 int MQTTPacket_send(networkHandles* net, Header header, char* buffer, size_t buflen, int free, int MQTTVersion); 244 int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, size_t* buflens, int* frees, int MQTTVersion); 245 246 void* MQTTPacket_header_only(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen); 247 int MQTTPacket_send_disconnect(Clients* client, enum MQTTReasonCodes reason, MQTTProperties* props); 248 249 void* MQTTPacket_publish(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen); 250 void MQTTPacket_freePublish(Publish* pack); 251 int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, const char* clientID); 252 int MQTTPacket_send_puback(int msgid, networkHandles* net, const char* clientID); 253 void* MQTTPacket_ack(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen); 254 255 void MQTTPacket_freeAck(Ack* pack); 256 void MQTTPacket_freeSuback(Suback* pack); 257 void MQTTPacket_freeUnsuback(Unsuback* pack); 258 int MQTTPacket_send_pubrec(int msgid, networkHandles* net, const char* clientID); 259 int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, const char* clientID); 260 int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, const char* clientID); 261 262 void MQTTPacket_free_packet(MQTTPacket* pack); 263 264 void writeInt4(char** pptr, int anInt); 265 int readInt4(char** pptr); 266 void writeMQTTLenString(char** pptr, MQTTLenString lenstring); 267 int MQTTLenStringRead(MQTTLenString* lenstring, char** pptr, char* enddata); 268 int MQTTPacket_VBIlen(int rem_len); 269 int MQTTPacket_decodeBuf(char* buf, unsigned int* value); 270 271 #include "MQTTPacketOut.h" 272 273 #endif /* MQTTPACKET_H */ 274