MQTT version for enno SDK

Dependencies:   EthernetInterface MQTT mbed-rtos mbed serialzation_lib

Fork of HelloMQTT by MQTT

Committer:
weiarm2015
Date:
Wed Nov 25 07:07:31 2015 +0000
Revision:
20:3858e42b0cd3
Child:
21:c5f6350a292d
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
weiarm2015 20:3858e42b0cd3 1 #include "mbed.h"
weiarm2015 20:3858e42b0cd3 2 #include "MQTTEthernet.h"
weiarm2015 20:3858e42b0cd3 3 #include "MQTTPacket.h"
weiarm2015 20:3858e42b0cd3 4 #include "MQTTClient.h"
weiarm2015 20:3858e42b0cd3 5 #include "pb_decode.h"
weiarm2015 20:3858e42b0cd3 6 #include "sitewhere.h"
weiarm2015 20:3858e42b0cd3 7 #include "sitewhere.pb.h"
weiarm2015 20:3858e42b0cd3 8 #include "enno_api.h"
weiarm2015 20:3858e42b0cd3 9
weiarm2015 20:3858e42b0cd3 10
weiarm2015 20:3858e42b0cd3 11 //static iot_disconnect_handler clientDisconnectHandler; //warning defined but not used
weiarm2015 20:3858e42b0cd3 12
weiarm2015 20:3858e42b0cd3 13 /**
weiarm2015 20:3858e42b0cd3 14 * @brief Communication Protocol Type
weiarm2015 20:3858e42b0cd3 15 *
weiarm2015 20:3858e42b0cd3 16 * Defining an MQTT version Type
weiarm2015 20:3858e42b0cd3 17 *
weiarm2015 20:3858e42b0cd3 18 */
weiarm2015 20:3858e42b0cd3 19 typedef enum {
weiarm2015 20:3858e42b0cd3 20 MQTT_3_1 = 3, // MQTT 3.1 (protocol_lib message byte = 3)
weiarm2015 20:3858e42b0cd3 21 MQTT_3_1_1 = 4 // MQTT 3.1.1 (protocol_lib message byte = 4)
weiarm2015 20:3858e42b0cd3 22 } MQTT_Ver_t;
weiarm2015 20:3858e42b0cd3 23
weiarm2015 20:3858e42b0cd3 24 /**
weiarm2015 20:3858e42b0cd3 25 * @brief Quality of Service Type
weiarm2015 20:3858e42b0cd3 26 *
weiarm2015 20:3858e42b0cd3 27 * Defining a QoS type.
weiarm2015 20:3858e42b0cd3 28 * @note QoS 2 is \b NOT supported by the Enno IoT Service at the time of this SDK release. //?wzy
weiarm2015 20:3858e42b0cd3 29 *
weiarm2015 20:3858e42b0cd3 30 */
weiarm2015 20:3858e42b0cd3 31 typedef enum {
weiarm2015 20:3858e42b0cd3 32 QOS_0, // QoS 0 = at most once delivery
weiarm2015 20:3858e42b0cd3 33 QOS_1, // QoS 1 = at least once delivery
weiarm2015 20:3858e42b0cd3 34 QOS_2 // QoS 2 is NOT supported
weiarm2015 20:3858e42b0cd3 35 } QoSLevel;
weiarm2015 20:3858e42b0cd3 36
weiarm2015 20:3858e42b0cd3 37 /**
weiarm2015 20:3858e42b0cd3 38 * @brief Last Will and Testament Definition
weiarm2015 20:3858e42b0cd3 39 *
weiarm2015 20:3858e42b0cd3 40 * Defining a type for LWT parameters.
weiarm2015 20:3858e42b0cd3 41 * @note Retained messages are \b NOT supported by the Enno IoT Service at the time of this SDK release. //?
weiarm2015 20:3858e42b0cd3 42 *
weiarm2015 20:3858e42b0cd3 43 */
weiarm2015 20:3858e42b0cd3 44 typedef struct {
weiarm2015 20:3858e42b0cd3 45 const char *pTopicName; // LWT Topic
weiarm2015 20:3858e42b0cd3 46 const char *pMessage; // Message to be delivered as LWT
weiarm2015 20:3858e42b0cd3 47 bool isRetained; // NOT supported
weiarm2015 20:3858e42b0cd3 48 QoSLevel qos; // QoS of LWT message
weiarm2015 20:3858e42b0cd3 49 } MQTTWillOptions;
weiarm2015 20:3858e42b0cd3 50
weiarm2015 20:3858e42b0cd3 51 /**
weiarm2015 20:3858e42b0cd3 52 * @brief MQTT Message Parameters
weiarm2015 20:3858e42b0cd3 53 *
weiarm2015 20:3858e42b0cd3 54 * Defines a type for properties of MQTT messages including topic, payload an QoS.
weiarm2015 20:3858e42b0cd3 55 *
weiarm2015 20:3858e42b0cd3 56 */
weiarm2015 20:3858e42b0cd3 57 typedef struct {
weiarm2015 20:3858e42b0cd3 58 QoSLevel qos; // Message Quality of Service
weiarm2015 20:3858e42b0cd3 59 bool isRetained; // Retained messages are \b NOT supported by the Enno IoT Service at the time of this SDK release.
weiarm2015 20:3858e42b0cd3 60 bool isDuplicate; // Is this message a duplicate QoS > 0 message? Handled automatically by the MQTT client.
weiarm2015 20:3858e42b0cd3 61 uint16_t id; // Message sequence identifier. Handled automatically by the MQTT client.
weiarm2015 20:3858e42b0cd3 62 void *pPayload; // Pointer to MQTT message payload (bytes).
weiarm2015 20:3858e42b0cd3 63 uint32_t PayloadLen; // Length of MQTT payload.
weiarm2015 20:3858e42b0cd3 64 } MQTTMessageParams;
weiarm2015 20:3858e42b0cd3 65
weiarm2015 20:3858e42b0cd3 66 typedef void (*iot_disconnect_handler)(void);
weiarm2015 20:3858e42b0cd3 67
weiarm2015 20:3858e42b0cd3 68 typedef struct {
weiarm2015 20:3858e42b0cd3 69 char *pClientID; // Pointer to a string defining the MQTT client ID (this needs to be unique \b per \b device )
weiarm2015 20:3858e42b0cd3 70 char *pUserName; // Not used in the Enno IoT Service
weiarm2015 20:3858e42b0cd3 71 char *pPassword; // Not used in the Enno IoT Service
weiarm2015 20:3858e42b0cd3 72 MQTT_Ver_t MQTTVersion; // Desired MQTT version used during connection
weiarm2015 20:3858e42b0cd3 73 uint16_t KeepAliveInterval_Sec; // MQTT keep alive interval in seconds. Defines inactivity time allowed before determining the connection has been lost.
weiarm2015 20:3858e42b0cd3 74 bool isCleansession; // MQTT clean session. True = this session is to be treated as clean. Previous server state is cleared and no stated is retained from this connection.
weiarm2015 20:3858e42b0cd3 75 bool isWillMsgPresent; // Is there a LWT associated with this connection?
weiarm2015 20:3858e42b0cd3 76 MQTTWillOptions will; // MQTT LWT parameters.
weiarm2015 20:3858e42b0cd3 77 uint32_t mqttCommandTimeout_ms; // Timeout for MQTT blocking calls. In milliseconds.
weiarm2015 20:3858e42b0cd3 78 iot_disconnect_handler disconnectHandler; // Callback to be invoked upon connection loss.
weiarm2015 20:3858e42b0cd3 79 } ConnectParams;
weiarm2015 20:3858e42b0cd3 80
weiarm2015 20:3858e42b0cd3 81 const MQTTWillOptions MQTTwillOptionsDefault = {
weiarm2015 20:3858e42b0cd3 82 .pTopicName = NULL,
weiarm2015 20:3858e42b0cd3 83 .pMessage = NULL,
weiarm2015 20:3858e42b0cd3 84 .isRetained = false,
weiarm2015 20:3858e42b0cd3 85 .qos = QOS_0
weiarm2015 20:3858e42b0cd3 86 };
weiarm2015 20:3858e42b0cd3 87 MQTTMessageParams MQTTMessageParamsDefault = {
weiarm2015 20:3858e42b0cd3 88 .qos = QOS_0,
weiarm2015 20:3858e42b0cd3 89 .isRetained=false,
weiarm2015 20:3858e42b0cd3 90 .isDuplicate = false,
weiarm2015 20:3858e42b0cd3 91 .id = 0,
weiarm2015 20:3858e42b0cd3 92 .pPayload = NULL,
weiarm2015 20:3858e42b0cd3 93 .PayloadLen = 0
weiarm2015 20:3858e42b0cd3 94 };
weiarm2015 20:3858e42b0cd3 95 ConnectParams ConnectParamsDefault = {
weiarm2015 20:3858e42b0cd3 96 .pClientID = "mbed-sample",
weiarm2015 20:3858e42b0cd3 97 .pUserName = NULL,
weiarm2015 20:3858e42b0cd3 98 .pPassword = NULL,
weiarm2015 20:3858e42b0cd3 99 .MQTTVersion = MQTT_3_1,
weiarm2015 20:3858e42b0cd3 100 .KeepAliveInterval_Sec = 10,
weiarm2015 20:3858e42b0cd3 101 .isCleansession = true,
weiarm2015 20:3858e42b0cd3 102 .isWillMsgPresent = false,
weiarm2015 20:3858e42b0cd3 103 .will={.pTopicName = NULL, .pMessage = NULL, .isRetained = false, .qos = QOS_0},
weiarm2015 20:3858e42b0cd3 104 .mqttCommandTimeout_ms = 2000,
weiarm2015 20:3858e42b0cd3 105 .disconnectHandler = NULL
weiarm2015 20:3858e42b0cd3 106 };
weiarm2015 20:3858e42b0cd3 107
weiarm2015 20:3858e42b0cd3 108
weiarm2015 20:3858e42b0cd3 109
weiarm2015 20:3858e42b0cd3 110
weiarm2015 20:3858e42b0cd3 111
weiarm2015 20:3858e42b0cd3 112
weiarm2015 20:3858e42b0cd3 113 static Error_t parseConnectParamsForError(char *hostURL) {
weiarm2015 20:3858e42b0cd3 114 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 115 if (NULL == hostURL) {
weiarm2015 20:3858e42b0cd3 116 rc = NULL_VALUE_ERROR;
weiarm2015 20:3858e42b0cd3 117 printf("ERROR: hostURL can not be empty!\n");
weiarm2015 20:3858e42b0cd3 118 }
weiarm2015 20:3858e42b0cd3 119 return rc;
weiarm2015 20:3858e42b0cd3 120 }
weiarm2015 20:3858e42b0cd3 121
weiarm2015 20:3858e42b0cd3 122 static bool isPowerCycle = true;
weiarm2015 20:3858e42b0cd3 123
weiarm2015 20:3858e42b0cd3 124 Error_t enno_connect(char *hostURL, uint16_t port, char *appKey){
weiarm2015 20:3858e42b0cd3 125 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 126
weiarm2015 20:3858e42b0cd3 127 if
weiarm2015 20:3858e42b0cd3 128 return rc;
weiarm2015 20:3858e42b0cd3 129 }
weiarm2015 20:3858e42b0cd3 130
weiarm2015 20:3858e42b0cd3 131 Error_t enno_subscribe(char *topic, void *callback){
weiarm2015 20:3858e42b0cd3 132 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 133 if (trans_subscribe()){
weiarm2015 20:3858e42b0cd3 134 rc = SUBSCRIBE_ERROR;
weiarm2015 20:3858e42b0cd3 135 }
weiarm2015 20:3858e42b0cd3 136 return rc;
weiarm2015 20:3858e42b0cd3 137 }
weiarm2015 20:3858e42b0cd3 138 */
weiarm2015 20:3858e42b0cd3 139 Error_t enno_publish(char *path, EnnoMessages *messages_enno){
weiarm2015 20:3858e42b0cd3 140 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 141 if (0 != trans_publish()){
weiarm2015 20:3858e42b0cd3 142 rc = PUBLISH_ERROR;
weiarm2015 20:3858e42b0cd3 143 }
weiarm2015 20:3858e42b0cd3 144 return rc;
weiarm2015 20:3858e42b0cd3 145 }
weiarm2015 20:3858e42b0cd3 146
weiarm2015 20:3858e42b0cd3 147 Error_t enno_unsubscribe(char *pTopic) {
weiarm2015 20:3858e42b0cd3 148 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 149 if (0 != trans_unsubscribe(pTopic)) {
weiarm2015 20:3858e42b0cd3 150 rc = UNSUBSCRIBE_ERROR;
weiarm2015 20:3858e42b0cd3 151 }
weiarm2015 20:3858e42b0cd3 152 return rc;
weiarm2015 20:3858e42b0cd3 153
weiarm2015 20:3858e42b0cd3 154 }
weiarm2015 20:3858e42b0cd3 155
weiarm2015 20:3858e42b0cd3 156 Error_t enno_disconnect() {
weiarm2015 20:3858e42b0cd3 157 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 158 if (0! =trans_disconnect()){
weiarm2015 20:3858e42b0cd3 159 rc = DISCONNECT_ERROR;
weiarm2015 20:3858e42b0cd3 160 }
weiarm2015 20:3858e42b0cd3 161 return rc;
weiarm2015 20:3858e42b0cd3 162 }
weiarm2015 20:3858e42b0cd3 163
weiarm2015 20:3858e42b0cd3 164 Error_t enno_loop(int timeout) {
weiarm2015 20:3858e42b0cd3 165 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 166 if (0 != trans_loop(timeout)){
weiarm2015 20:3858e42b0cd3 167 rc = YIELD_ERROR;
weiarm2015 20:3858e42b0cd3 168 }
weiarm2015 20:3858e42b0cd3 169 return rc;
weiarm2015 20:3858e42b0cd3 170 }
weiarm2015 20:3858e42b0cd3 171
weiarm2015 20:3858e42b0cd3 172
weiarm2015 20:3858e42b0cd3 173
weiarm2015 20:3858e42b0cd3 174
weiarm2015 20:3858e42b0cd3 175
weiarm2015 20:3858e42b0cd3 176
weiarm2015 20:3858e42b0cd3 177