MQTTPacket.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /*******************************************************************************
  2. * Copyright (c) 2009, 2019 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. #if !defined(MQTTPACKET_H)
  21. #define MQTTPACKET_H
  22. #include "Socket.h"
  23. #if defined(OPENSSL)
  24. #include "SSLSocket.h"
  25. #endif
  26. #include "LinkedList.h"
  27. #include "Clients.h"
  28. typedef unsigned int bool;
  29. typedef void* (*pf)(int, unsigned char, char*, size_t);
  30. #include "MQTTProperties.h"
  31. #include "MQTTReasonCodes.h"
  32. enum errors
  33. {
  34. MQTTPACKET_BAD = -4,
  35. MQTTPACKET_BUFFER_TOO_SHORT = -2,
  36. MQTTPACKET_READ_ERROR = -1,
  37. MQTTPACKET_READ_COMPLETE
  38. };
  39. enum msgTypes
  40. {
  41. CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,
  42. PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,
  43. PINGREQ, PINGRESP, DISCONNECT, AUTH
  44. };
  45. #if defined(__linux__)
  46. #include <endian.h>
  47. #if __BYTE_ORDER == __BIG_ENDIAN
  48. #define REVERSED 1
  49. #endif
  50. #endif
  51. /**
  52. * Bitfields for the MQTT header byte.
  53. */
  54. typedef union
  55. {
  56. /*unsigned*/ char byte; /**< the whole byte */
  57. #if defined(REVERSED)
  58. struct
  59. {
  60. unsigned int type : 4; /**< message type nibble */
  61. bool dup : 1; /**< DUP flag bit */
  62. unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */
  63. bool retain : 1; /**< retained flag bit */
  64. } bits;
  65. #else
  66. struct
  67. {
  68. bool retain : 1; /**< retained flag bit */
  69. unsigned int qos : 2; /**< QoS value, 0, 1 or 2 */
  70. bool dup : 1; /**< DUP flag bit */
  71. unsigned int type : 4; /**< message type nibble */
  72. } bits;
  73. #endif
  74. } Header;
  75. /**
  76. * Data for a connect packet.
  77. */
  78. typedef struct
  79. {
  80. Header header; /**< MQTT header byte */
  81. union
  82. {
  83. unsigned char all; /**< all connect flags */
  84. #if defined(REVERSED)
  85. struct
  86. {
  87. bool username : 1; /**< 3.1 user name */
  88. bool password : 1; /**< 3.1 password */
  89. bool willRetain : 1; /**< will retain setting */
  90. unsigned int willQoS : 2; /**< will QoS value */
  91. bool will : 1; /**< will flag */
  92. bool cleanstart : 1; /**< cleansession flag */
  93. int : 1; /**< unused */
  94. } bits;
  95. #else
  96. struct
  97. {
  98. int : 1; /**< unused */
  99. bool cleanstart : 1; /**< cleansession flag */
  100. bool will : 1; /**< will flag */
  101. unsigned int willQoS : 2; /**< will QoS value */
  102. bool willRetain : 1; /**< will retain setting */
  103. bool password : 1; /**< 3.1 password */
  104. bool username : 1; /**< 3.1 user name */
  105. } bits;
  106. #endif
  107. } flags; /**< connect flags byte */
  108. char *Protocol, /**< MQTT protocol name */
  109. *clientID, /**< string client id */
  110. *willTopic, /**< will topic */
  111. *willMsg; /**< will payload */
  112. int keepAliveTimer; /**< keepalive timeout value in seconds */
  113. unsigned char version; /**< MQTT version number */
  114. } Connect;
  115. /**
  116. * Data for a connack packet.
  117. */
  118. typedef struct
  119. {
  120. Header header; /**< MQTT header byte */
  121. union
  122. {
  123. unsigned char all; /**< all connack flags */
  124. #if defined(REVERSED)
  125. struct
  126. {
  127. unsigned int reserved : 7; /**< message type nibble */
  128. bool sessionPresent : 1; /**< was a session found on the server? */
  129. } bits;
  130. #else
  131. struct
  132. {
  133. bool sessionPresent : 1; /**< was a session found on the server? */
  134. unsigned int reserved : 7; /**< message type nibble */
  135. } bits;
  136. #endif
  137. } flags; /**< connack flags byte */
  138. unsigned char rc; /**< connack reason code */
  139. unsigned int MQTTVersion; /**< the version of MQTT */
  140. MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */
  141. } Connack;
  142. /**
  143. * Data for a packet with header only.
  144. */
  145. typedef struct
  146. {
  147. Header header; /**< MQTT header byte */
  148. } MQTTPacket;
  149. /**
  150. * Data for a suback packet.
  151. */
  152. typedef struct
  153. {
  154. Header header; /**< MQTT header byte */
  155. int msgId; /**< MQTT message id */
  156. int MQTTVersion; /**< the version of MQTT */
  157. MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */
  158. List* qoss; /**< list of granted QoSs (MQTT 3/4) / reason codes (MQTT 5) */
  159. } Suback;
  160. /**
  161. * Data for an MQTT V5 unsuback packet.
  162. */
  163. typedef struct
  164. {
  165. Header header; /**< MQTT header byte */
  166. int msgId; /**< MQTT message id */
  167. int MQTTVersion; /**< the version of MQTT */
  168. MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */
  169. List* reasonCodes; /**< list of reason codes */
  170. } Unsuback;
  171. /**
  172. * Data for a publish packet.
  173. */
  174. typedef struct
  175. {
  176. Header header; /**< MQTT header byte */
  177. char* topic; /**< topic string */
  178. int topiclen;
  179. int msgId; /**< MQTT message id */
  180. char* payload; /**< binary payload, length delimited */
  181. int payloadlen; /**< payload length */
  182. int MQTTVersion; /**< the version of MQTT */
  183. MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */
  184. } Publish;
  185. /**
  186. * Data for one of the ack packets.
  187. */
  188. typedef struct
  189. {
  190. Header header; /**< MQTT header byte */
  191. int msgId; /**< MQTT message id */
  192. unsigned char rc; /**< MQTT 5 reason code */
  193. int MQTTVersion; /**< the version of MQTT */
  194. MQTTProperties properties; /**< MQTT 5.0 properties. Not used for MQTT < 5.0 */
  195. } Ack;
  196. typedef Ack Puback;
  197. typedef Ack Pubrec;
  198. typedef Ack Pubrel;
  199. typedef Ack Pubcomp;
  200. int MQTTPacket_encode(char* buf, size_t length);
  201. int MQTTPacket_decode(networkHandles* net, size_t* value);
  202. int readInt(char** pptr);
  203. char* readUTF(char** pptr, char* enddata);
  204. unsigned char readChar(char** pptr);
  205. void writeChar(char** pptr, char c);
  206. void writeInt(char** pptr, int anInt);
  207. void writeUTF(char** pptr, const char* string);
  208. void writeData(char** pptr, const void* data, int datalen);
  209. const char* MQTTPacket_name(int ptype);
  210. void* MQTTPacket_Factory(int MQTTVersion, networkHandles* net, int* error);
  211. int MQTTPacket_send(networkHandles* net, Header header, char* buffer, size_t buflen, int free, int MQTTVersion);
  212. int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, size_t* buflens, int* frees, int MQTTVersion);
  213. void* MQTTPacket_header_only(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen);
  214. int MQTTPacket_send_disconnect(Clients* client, enum MQTTReasonCodes reason, MQTTProperties* props);
  215. void* MQTTPacket_publish(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen);
  216. void MQTTPacket_freePublish(Publish* pack);
  217. int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, const char* clientID);
  218. int MQTTPacket_send_puback(int MQTTVersion, int msgid, networkHandles* net, const char* clientID);
  219. void* MQTTPacket_ack(int MQTTVersion, unsigned char aHeader, char* data, size_t datalen);
  220. void MQTTPacket_freeAck(Ack* pack);
  221. void MQTTPacket_freeSuback(Suback* pack);
  222. void MQTTPacket_freeUnsuback(Unsuback* pack);
  223. int MQTTPacket_send_pubrec(int MQTTVersion, int msgid, networkHandles* net, const char* clientID);
  224. int MQTTPacket_send_pubrel(int MQTTVersion, int msgid, int dup, networkHandles* net, const char* clientID);
  225. int MQTTPacket_send_pubcomp(int MQTTVersion, int msgid, networkHandles* net, const char* clientID);
  226. void MQTTPacket_free_packet(MQTTPacket* pack);
  227. void writeInt4(char** pptr, int anInt);
  228. int readInt4(char** pptr);
  229. void writeMQTTLenString(char** pptr, MQTTLenString lenstring);
  230. int MQTTLenStringRead(MQTTLenString* lenstring, char** pptr, char* enddata);
  231. int MQTTPacket_VBIlen(int rem_len);
  232. int MQTTPacket_decodeBuf(char* buf, unsigned int* value);
  233. #include "MQTTPacketOut.h"
  234. #endif /* MQTTPACKET_H */