Basic C library for MQTT packet serialization and deserialization

Dependents:   MQTT MQTT MQTT MQTT ... more

Fork of MQTTPacket by MQTT

This library is part of the EclipseTM Paho project; specifically the embedded client.

A basic MQTT library in C for packet serialization and deserialization

Committer:
Ian Craggs
Date:
Mon Oct 30 12:47:11 2017 +0000
Revision:
25:aedcaf7984d5
Parent:
22:1af97b41bc9d
Merging mine and Jan's changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
icraggs 0:7734401cc1b4 1 /*******************************************************************************
icraggs 22:1af97b41bc9d 2 * Copyright (c) 2014, 2017 IBM Corp.
icraggs 0:7734401cc1b4 3 *
icraggs 0:7734401cc1b4 4 * All rights reserved. This program and the accompanying materials
icraggs 0:7734401cc1b4 5 * are made available under the terms of the Eclipse Public License v1.0
icraggs 0:7734401cc1b4 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
icraggs 0:7734401cc1b4 7 *
icraggs 0:7734401cc1b4 8 * The Eclipse Public License is available at
icraggs 0:7734401cc1b4 9 * http://www.eclipse.org/legal/epl-v10.html
icraggs 0:7734401cc1b4 10 * and the Eclipse Distribution License is available at
icraggs 0:7734401cc1b4 11 * http://www.eclipse.org/org/documents/edl-v10.php.
icraggs 0:7734401cc1b4 12 *
icraggs 0:7734401cc1b4 13 * Contributors:
icraggs 0:7734401cc1b4 14 * Ian Craggs - initial API and implementation and/or initial documentation
icraggs 20:63c71eeb4183 15 * Ian Craggs - add connack return code definitions
icraggs 22:1af97b41bc9d 16 * Xiang Rong - 442039 Add makefile to Embedded C client
icraggs 22:1af97b41bc9d 17 * Ian Craggs - fix for issue #64, bit order in connack response
icraggs 0:7734401cc1b4 18 *******************************************************************************/
icraggs 0:7734401cc1b4 19
icraggs 0:7734401cc1b4 20 #ifndef MQTTCONNECT_H_
icraggs 0:7734401cc1b4 21 #define MQTTCONNECT_H_
icraggs 0:7734401cc1b4 22
icraggs 20:63c71eeb4183 23 enum connack_return_codes
icraggs 20:63c71eeb4183 24 {
icraggs 22:1af97b41bc9d 25 MQTT_CONNECTION_ACCEPTED = 0,
icraggs 22:1af97b41bc9d 26 MQTT_UNNACCEPTABLE_PROTOCOL = 1,
icraggs 22:1af97b41bc9d 27 MQTT_CLIENTID_REJECTED = 2,
icraggs 22:1af97b41bc9d 28 MQTT_SERVER_UNAVAILABLE = 3,
icraggs 22:1af97b41bc9d 29 MQTT_BAD_USERNAME_OR_PASSWORD = 4,
icraggs 22:1af97b41bc9d 30 MQTT_NOT_AUTHORIZED = 5,
icraggs 20:63c71eeb4183 31 };
icraggs 22:1af97b41bc9d 32
icraggs 22:1af97b41bc9d 33 #if !defined(DLLImport)
icraggs 22:1af97b41bc9d 34 #define DLLImport
icraggs 22:1af97b41bc9d 35 #endif
icraggs 22:1af97b41bc9d 36 #if !defined(DLLExport)
icraggs 22:1af97b41bc9d 37 #define DLLExport
icraggs 22:1af97b41bc9d 38 #endif
icraggs 22:1af97b41bc9d 39
icraggs 20:63c71eeb4183 40
icraggs 20:63c71eeb4183 41 typedef union
icraggs 20:63c71eeb4183 42 {
icraggs 20:63c71eeb4183 43 unsigned char all; /**< all connect flags */
icraggs 0:7734401cc1b4 44 #if defined(REVERSED)
icraggs 20:63c71eeb4183 45 struct
icraggs 20:63c71eeb4183 46 {
icraggs 20:63c71eeb4183 47 unsigned int username : 1; /**< 3.1 user name */
icraggs 20:63c71eeb4183 48 unsigned int password : 1; /**< 3.1 password */
icraggs 20:63c71eeb4183 49 unsigned int willRetain : 1; /**< will retain setting */
icraggs 20:63c71eeb4183 50 unsigned int willQoS : 2; /**< will QoS value */
icraggs 20:63c71eeb4183 51 unsigned int will : 1; /**< will flag */
icraggs 20:63c71eeb4183 52 unsigned int cleansession : 1; /**< clean session flag */
icraggs 20:63c71eeb4183 53 unsigned int : 1; /**< unused */
icraggs 20:63c71eeb4183 54 } bits;
icraggs 0:7734401cc1b4 55 #else
icraggs 20:63c71eeb4183 56 struct
icraggs 20:63c71eeb4183 57 {
icraggs 20:63c71eeb4183 58 unsigned int : 1; /**< unused */
icraggs 20:63c71eeb4183 59 unsigned int cleansession : 1; /**< cleansession flag */
icraggs 20:63c71eeb4183 60 unsigned int will : 1; /**< will flag */
icraggs 20:63c71eeb4183 61 unsigned int willQoS : 2; /**< will QoS value */
icraggs 20:63c71eeb4183 62 unsigned int willRetain : 1; /**< will retain setting */
icraggs 20:63c71eeb4183 63 unsigned int password : 1; /**< 3.1 password */
icraggs 20:63c71eeb4183 64 unsigned int username : 1; /**< 3.1 user name */
icraggs 20:63c71eeb4183 65 } bits;
icraggs 0:7734401cc1b4 66 #endif
icraggs 20:63c71eeb4183 67 } MQTTConnectFlags; /**< connect flags byte */
icraggs 0:7734401cc1b4 68
icraggs 0:7734401cc1b4 69
icraggs 0:7734401cc1b4 70
icraggs 0:7734401cc1b4 71 /**
icraggs 0:7734401cc1b4 72 * Defines the MQTT "Last Will and Testament" (LWT) settings for
icraggs 0:7734401cc1b4 73 * the connect packet.
icraggs 0:7734401cc1b4 74 */
icraggs 0:7734401cc1b4 75 typedef struct
icraggs 0:7734401cc1b4 76 {
icraggs 0:7734401cc1b4 77 /** The eyecatcher for this structure. must be MQTW. */
icraggs 0:7734401cc1b4 78 char struct_id[4];
icraggs 0:7734401cc1b4 79 /** The version number of this structure. Must be 0 */
icraggs 0:7734401cc1b4 80 int struct_version;
icraggs 0:7734401cc1b4 81 /** The LWT topic to which the LWT message will be published. */
icraggs 0:7734401cc1b4 82 MQTTString topicName;
icraggs 0:7734401cc1b4 83 /** The LWT payload. */
icraggs 0:7734401cc1b4 84 MQTTString message;
icraggs 0:7734401cc1b4 85 /**
icraggs 0:7734401cc1b4 86 * The retained flag for the LWT message (see MQTTAsync_message.retained).
icraggs 0:7734401cc1b4 87 */
Ian Craggs 12:cd99ac9cb25a 88 unsigned char retained;
icraggs 0:7734401cc1b4 89 /**
icraggs 0:7734401cc1b4 90 * The quality of service setting for the LWT message (see
icraggs 0:7734401cc1b4 91 * MQTTAsync_message.qos and @ref qos).
icraggs 0:7734401cc1b4 92 */
Ian Craggs 14:c2052aee81de 93 char qos;
icraggs 0:7734401cc1b4 94 } MQTTPacket_willOptions;
icraggs 0:7734401cc1b4 95
icraggs 0:7734401cc1b4 96
icraggs 0:7734401cc1b4 97 #define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 }
icraggs 0:7734401cc1b4 98
icraggs 0:7734401cc1b4 99
icraggs 0:7734401cc1b4 100 typedef struct
icraggs 0:7734401cc1b4 101 {
icraggs 0:7734401cc1b4 102 /** The eyecatcher for this structure. must be MQTC. */
icraggs 0:7734401cc1b4 103 char struct_id[4];
icraggs 3:4a4f8699f935 104 /** The version number of this structure. Must be 0 */
icraggs 0:7734401cc1b4 105 int struct_version;
Ian Craggs 4:c502573c6016 106 /** Version of MQTT to be used. 3 = 3.1 4 = 3.1.1
Ian Craggs 4:c502573c6016 107 */
Ian Craggs 14:c2052aee81de 108 unsigned char MQTTVersion;
icraggs 0:7734401cc1b4 109 MQTTString clientID;
Ian Craggs 14:c2052aee81de 110 unsigned short keepAliveInterval;
Ian Craggs 12:cd99ac9cb25a 111 unsigned char cleansession;
Ian Craggs 12:cd99ac9cb25a 112 unsigned char willFlag;
icraggs 0:7734401cc1b4 113 MQTTPacket_willOptions will;
icraggs 0:7734401cc1b4 114 MQTTString username;
icraggs 0:7734401cc1b4 115 MQTTString password;
icraggs 0:7734401cc1b4 116 } MQTTPacket_connectData;
icraggs 0:7734401cc1b4 117
icraggs 16:d0b3886ada32 118 typedef union
icraggs 16:d0b3886ada32 119 {
icraggs 16:d0b3886ada32 120 unsigned char all; /**< all connack flags */
icraggs 16:d0b3886ada32 121 #if defined(REVERSED)
icraggs 16:d0b3886ada32 122 struct
icraggs 16:d0b3886ada32 123 {
icraggs 22:1af97b41bc9d 124 unsigned int reserved : 7; /**< unused */
icraggs 16:d0b3886ada32 125 unsigned int sessionpresent : 1; /**< session present flag */
icraggs 16:d0b3886ada32 126 } bits;
icraggs 16:d0b3886ada32 127 #else
icraggs 16:d0b3886ada32 128 struct
icraggs 16:d0b3886ada32 129 {
icraggs 16:d0b3886ada32 130 unsigned int sessionpresent : 1; /**< session present flag */
icraggs 22:1af97b41bc9d 131 unsigned int reserved: 7; /**< unused */
icraggs 16:d0b3886ada32 132 } bits;
icraggs 16:d0b3886ada32 133 #endif
icraggs 16:d0b3886ada32 134 } MQTTConnackFlags; /**< connack flags byte */
icraggs 16:d0b3886ada32 135
icraggs 3:4a4f8699f935 136 #define MQTTPacket_connectData_initializer { {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, \
icraggs 0:7734401cc1b4 137 MQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} }
icraggs 0:7734401cc1b4 138
icraggs 22:1af97b41bc9d 139 DLLExport int MQTTSerialize_connect(unsigned char* buf, int buflen, MQTTPacket_connectData* options);
icraggs 22:1af97b41bc9d 140 DLLExport int MQTTDeserialize_connect(MQTTPacket_connectData* data, unsigned char* buf, int len);
icraggs 0:7734401cc1b4 141
icraggs 22:1af97b41bc9d 142 DLLExport int MQTTSerialize_connack(unsigned char* buf, int buflen, unsigned char connack_rc, unsigned char sessionPresent);
icraggs 22:1af97b41bc9d 143 DLLExport int MQTTDeserialize_connack(unsigned char* sessionPresent, unsigned char* connack_rc, unsigned char* buf, int buflen);
icraggs 0:7734401cc1b4 144
icraggs 22:1af97b41bc9d 145 DLLExport int MQTTSerialize_disconnect(unsigned char* buf, int buflen);
icraggs 22:1af97b41bc9d 146 DLLExport int MQTTSerialize_pingreq(unsigned char* buf, int buflen);
icraggs 0:7734401cc1b4 147
icraggs 0:7734401cc1b4 148 #endif /* MQTTCONNECT_H_ */
icraggs 22:1af97b41bc9d 149