MQTT version for enno SDK

Dependencies:   EthernetInterface MQTT mbed-rtos mbed serialzation_lib

Fork of HelloMQTT by MQTT

Committer:
weiarm2015
Date:
Wed Dec 02 01:54:31 2015 +0000
Revision:
21:c5f6350a292d
Parent:
20:3858e42b0cd3
This is a alpha version of enno SDK for mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
weiarm2015 21:c5f6350a292d 1 /*
weiarm2015 21:c5f6350a292d 2 * enno_api_mqtt_wrapper.c
weiarm2015 21:c5f6350a292d 3 *
weiarm2015 21:c5f6350a292d 4 * Created on: 2015年11月20日
weiarm2015 21:c5f6350a292d 5 * Author: v-chawei
weiarm2015 21:c5f6350a292d 6 */
weiarm2015 20:3858e42b0cd3 7 #include "pb_decode.h"
weiarm2015 20:3858e42b0cd3 8 #include "sitewhere.h"
weiarm2015 20:3858e42b0cd3 9 #include "sitewhere.pb.h"
weiarm2015 20:3858e42b0cd3 10 #include "enno_api.h"
weiarm2015 21:c5f6350a292d 11 /*
weiarm2015 21:c5f6350a292d 12 int trans_connect(char *hostURL, uint16_t port, char *appKey);
weiarm2015 21:c5f6350a292d 13 int trans_subscribe(char *topic, char *topicType);
weiarm2015 21:c5f6350a292d 14 int trans_publish(char *path, char *payload, int payloadlen);
weiarm2015 21:c5f6350a292d 15 int trans_unsubscribe(char *pTopic);
weiarm2015 21:c5f6350a292d 16 int trans_disconnect();
weiarm2015 21:c5f6350a292d 17 int trans_loop(int timeout);
weiarm2015 21:c5f6350a292d 18 */
weiarm2015 20:3858e42b0cd3 19 //static iot_disconnect_handler clientDisconnectHandler; //warning defined but not used
weiarm2015 20:3858e42b0cd3 20
weiarm2015 20:3858e42b0cd3 21 /**
weiarm2015 20:3858e42b0cd3 22 * @brief Communication Protocol Type
weiarm2015 20:3858e42b0cd3 23 *
weiarm2015 20:3858e42b0cd3 24 * Defining an MQTT version Type
weiarm2015 20:3858e42b0cd3 25 *
weiarm2015 20:3858e42b0cd3 26 */
weiarm2015 20:3858e42b0cd3 27 typedef enum {
weiarm2015 20:3858e42b0cd3 28 MQTT_3_1 = 3, // MQTT 3.1 (protocol_lib message byte = 3)
weiarm2015 20:3858e42b0cd3 29 MQTT_3_1_1 = 4 // MQTT 3.1.1 (protocol_lib message byte = 4)
weiarm2015 20:3858e42b0cd3 30 } MQTT_Ver_t;
weiarm2015 20:3858e42b0cd3 31
weiarm2015 20:3858e42b0cd3 32 /**
weiarm2015 20:3858e42b0cd3 33 * @brief Quality of Service Type
weiarm2015 20:3858e42b0cd3 34 *
weiarm2015 20:3858e42b0cd3 35 * Defining a QoS type.
weiarm2015 20:3858e42b0cd3 36 * @note QoS 2 is \b NOT supported by the Enno IoT Service at the time of this SDK release. //?wzy
weiarm2015 20:3858e42b0cd3 37 *
weiarm2015 20:3858e42b0cd3 38 */
weiarm2015 20:3858e42b0cd3 39 typedef enum {
weiarm2015 20:3858e42b0cd3 40 QOS_0, // QoS 0 = at most once delivery
weiarm2015 20:3858e42b0cd3 41 QOS_1, // QoS 1 = at least once delivery
weiarm2015 20:3858e42b0cd3 42 QOS_2 // QoS 2 is NOT supported
weiarm2015 20:3858e42b0cd3 43 } QoSLevel;
weiarm2015 20:3858e42b0cd3 44
weiarm2015 20:3858e42b0cd3 45 /**
weiarm2015 20:3858e42b0cd3 46 * @brief Last Will and Testament Definition
weiarm2015 20:3858e42b0cd3 47 *
weiarm2015 20:3858e42b0cd3 48 * Defining a type for LWT parameters.
weiarm2015 20:3858e42b0cd3 49 * @note Retained messages are \b NOT supported by the Enno IoT Service at the time of this SDK release. //?
weiarm2015 20:3858e42b0cd3 50 *
weiarm2015 20:3858e42b0cd3 51 */
weiarm2015 20:3858e42b0cd3 52 typedef struct {
weiarm2015 20:3858e42b0cd3 53 const char *pTopicName; // LWT Topic
weiarm2015 20:3858e42b0cd3 54 const char *pMessage; // Message to be delivered as LWT
weiarm2015 20:3858e42b0cd3 55 bool isRetained; // NOT supported
weiarm2015 20:3858e42b0cd3 56 QoSLevel qos; // QoS of LWT message
weiarm2015 20:3858e42b0cd3 57 } MQTTWillOptions;
weiarm2015 20:3858e42b0cd3 58
weiarm2015 20:3858e42b0cd3 59 /**
weiarm2015 20:3858e42b0cd3 60 * @brief MQTT Message Parameters
weiarm2015 20:3858e42b0cd3 61 *
weiarm2015 20:3858e42b0cd3 62 * Defines a type for properties of MQTT messages including topic, payload an QoS.
weiarm2015 20:3858e42b0cd3 63 *
weiarm2015 20:3858e42b0cd3 64 */
weiarm2015 20:3858e42b0cd3 65 typedef struct {
weiarm2015 20:3858e42b0cd3 66 QoSLevel qos; // Message Quality of Service
weiarm2015 20:3858e42b0cd3 67 bool isRetained; // Retained messages are \b NOT supported by the Enno IoT Service at the time of this SDK release.
weiarm2015 20:3858e42b0cd3 68 bool isDuplicate; // Is this message a duplicate QoS > 0 message? Handled automatically by the MQTT client.
weiarm2015 20:3858e42b0cd3 69 uint16_t id; // Message sequence identifier. Handled automatically by the MQTT client.
weiarm2015 20:3858e42b0cd3 70 void *pPayload; // Pointer to MQTT message payload (bytes).
weiarm2015 20:3858e42b0cd3 71 uint32_t PayloadLen; // Length of MQTT payload.
weiarm2015 20:3858e42b0cd3 72 } MQTTMessageParams;
weiarm2015 20:3858e42b0cd3 73
weiarm2015 20:3858e42b0cd3 74 typedef void (*iot_disconnect_handler)(void);
weiarm2015 20:3858e42b0cd3 75
weiarm2015 20:3858e42b0cd3 76 typedef struct {
weiarm2015 20:3858e42b0cd3 77 char *pClientID; // Pointer to a string defining the MQTT client ID (this needs to be unique \b per \b device )
weiarm2015 20:3858e42b0cd3 78 char *pUserName; // Not used in the Enno IoT Service
weiarm2015 20:3858e42b0cd3 79 char *pPassword; // Not used in the Enno IoT Service
weiarm2015 20:3858e42b0cd3 80 MQTT_Ver_t MQTTVersion; // Desired MQTT version used during connection
weiarm2015 20:3858e42b0cd3 81 uint16_t KeepAliveInterval_Sec; // MQTT keep alive interval in seconds. Defines inactivity time allowed before determining the connection has been lost.
weiarm2015 20:3858e42b0cd3 82 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 83 bool isWillMsgPresent; // Is there a LWT associated with this connection?
weiarm2015 20:3858e42b0cd3 84 MQTTWillOptions will; // MQTT LWT parameters.
weiarm2015 20:3858e42b0cd3 85 uint32_t mqttCommandTimeout_ms; // Timeout for MQTT blocking calls. In milliseconds.
weiarm2015 20:3858e42b0cd3 86 iot_disconnect_handler disconnectHandler; // Callback to be invoked upon connection loss.
weiarm2015 20:3858e42b0cd3 87 } ConnectParams;
weiarm2015 20:3858e42b0cd3 88
weiarm2015 20:3858e42b0cd3 89 const MQTTWillOptions MQTTwillOptionsDefault = {
weiarm2015 20:3858e42b0cd3 90 .pTopicName = NULL,
weiarm2015 20:3858e42b0cd3 91 .pMessage = NULL,
weiarm2015 20:3858e42b0cd3 92 .isRetained = false,
weiarm2015 20:3858e42b0cd3 93 .qos = QOS_0
weiarm2015 20:3858e42b0cd3 94 };
weiarm2015 20:3858e42b0cd3 95 MQTTMessageParams MQTTMessageParamsDefault = {
weiarm2015 20:3858e42b0cd3 96 .qos = QOS_0,
weiarm2015 20:3858e42b0cd3 97 .isRetained=false,
weiarm2015 20:3858e42b0cd3 98 .isDuplicate = false,
weiarm2015 20:3858e42b0cd3 99 .id = 0,
weiarm2015 20:3858e42b0cd3 100 .pPayload = NULL,
weiarm2015 20:3858e42b0cd3 101 .PayloadLen = 0
weiarm2015 20:3858e42b0cd3 102 };
weiarm2015 20:3858e42b0cd3 103 ConnectParams ConnectParamsDefault = {
weiarm2015 20:3858e42b0cd3 104 .pClientID = "mbed-sample",
weiarm2015 20:3858e42b0cd3 105 .pUserName = NULL,
weiarm2015 20:3858e42b0cd3 106 .pPassword = NULL,
weiarm2015 20:3858e42b0cd3 107 .MQTTVersion = MQTT_3_1,
weiarm2015 20:3858e42b0cd3 108 .KeepAliveInterval_Sec = 10,
weiarm2015 20:3858e42b0cd3 109 .isCleansession = true,
weiarm2015 20:3858e42b0cd3 110 .isWillMsgPresent = false,
weiarm2015 20:3858e42b0cd3 111 .will={.pTopicName = NULL, .pMessage = NULL, .isRetained = false, .qos = QOS_0},
weiarm2015 20:3858e42b0cd3 112 .mqttCommandTimeout_ms = 2000,
weiarm2015 20:3858e42b0cd3 113 .disconnectHandler = NULL
weiarm2015 20:3858e42b0cd3 114 };
weiarm2015 20:3858e42b0cd3 115
weiarm2015 20:3858e42b0cd3 116 static Error_t parseConnectParamsForError(char *hostURL) {
weiarm2015 20:3858e42b0cd3 117 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 118 if (NULL == hostURL) {
weiarm2015 20:3858e42b0cd3 119 rc = NULL_VALUE_ERROR;
weiarm2015 20:3858e42b0cd3 120 printf("ERROR: hostURL can not be empty!\n");
weiarm2015 20:3858e42b0cd3 121 }
weiarm2015 20:3858e42b0cd3 122 return rc;
weiarm2015 20:3858e42b0cd3 123 }
weiarm2015 20:3858e42b0cd3 124
weiarm2015 21:c5f6350a292d 125
weiarm2015 20:3858e42b0cd3 126
weiarm2015 20:3858e42b0cd3 127 Error_t enno_connect(char *hostURL, uint16_t port, char *appKey){
weiarm2015 20:3858e42b0cd3 128 Error_t rc = NONE_ERROR;
weiarm2015 21:c5f6350a292d 129 rc = parseConnectParamsForError(hostURL);
weiarm2015 21:c5f6350a292d 130 int i = 0;
weiarm2015 21:c5f6350a292d 131 /* if (NULL == hostURL) {
weiarm2015 21:c5f6350a292d 132 rc = NULL_VALUE_ERROR;
weiarm2015 21:c5f6350a292d 133 printf("ERROR: hostURL can not be empty!\n");
weiarm2015 21:c5f6350a292d 134 }*/
weiarm2015 21:c5f6350a292d 135 if (rc == NONE_ERROR){
weiarm2015 21:c5f6350a292d 136 if((i=trans_connect(hostURL, port, appKey))!=0){
weiarm2015 21:c5f6350a292d 137 // rc = CONNECTION_ERROR;
weiarm2015 21:c5f6350a292d 138 rc = i;
weiarm2015 21:c5f6350a292d 139 }
weiarm2015 21:c5f6350a292d 140 }
weiarm2015 20:3858e42b0cd3 141 return rc;
weiarm2015 20:3858e42b0cd3 142 }
weiarm2015 20:3858e42b0cd3 143
weiarm2015 21:c5f6350a292d 144 Error_t enno_subscribe(char *topic, char *topicType){
weiarm2015 20:3858e42b0cd3 145 Error_t rc = NONE_ERROR;
weiarm2015 21:c5f6350a292d 146 if (0 !=trans_subscribe(topic, topicType)){
weiarm2015 20:3858e42b0cd3 147 rc = SUBSCRIBE_ERROR;
weiarm2015 20:3858e42b0cd3 148 }
weiarm2015 20:3858e42b0cd3 149 return rc;
weiarm2015 20:3858e42b0cd3 150 }
weiarm2015 21:c5f6350a292d 151
weiarm2015 20:3858e42b0cd3 152 Error_t enno_publish(char *path, EnnoMessages *messages_enno){
weiarm2015 20:3858e42b0cd3 153 Error_t rc = NONE_ERROR;
weiarm2015 21:c5f6350a292d 154 unsigned int len = 0;
weiarm2015 21:c5f6350a292d 155 unsigned char buffer[512];
weiarm2015 21:c5f6350a292d 156
weiarm2015 21:c5f6350a292d 157 switch (messages_enno->messageType) {
weiarm2015 21:c5f6350a292d 158 case 'R':
weiarm2015 21:c5f6350a292d 159 len = sw_register(messages_enno->Register.pHardwareId, messages_enno->Register.pSpecificationToken, buffer,
weiarm2015 21:c5f6350a292d 160 512, messages_enno->Register.pOriginator);
weiarm2015 21:c5f6350a292d 161 break;
weiarm2015 21:c5f6350a292d 162 case 'A':
weiarm2015 21:c5f6350a292d 163 len = sw_alert(messages_enno->Register.pHardwareId, messages_enno->Alert.pAlertType,
weiarm2015 21:c5f6350a292d 164 messages_enno->Alert.pAlertMessage, messages_enno->Alert.eventDate, buffer, 512,
weiarm2015 21:c5f6350a292d 165 messages_enno->Alert.pOriginator);
weiarm2015 21:c5f6350a292d 166 break;
weiarm2015 21:c5f6350a292d 167 case 'M':
weiarm2015 21:c5f6350a292d 168 len = sw_measurement(messages_enno->Register.pHardwareId, messages_enno->Measurement.pName,
weiarm2015 21:c5f6350a292d 169 messages_enno->Measurement.value, messages_enno->Measurement.eventDate, buffer, 512,
weiarm2015 21:c5f6350a292d 170 messages_enno->Measurement.pOriginator);
weiarm2015 21:c5f6350a292d 171 break;
weiarm2015 21:c5f6350a292d 172 case 'L':
weiarm2015 21:c5f6350a292d 173 len = sw_location(messages_enno->Register.pHardwareId, messages_enno->Location.lat,
weiarm2015 21:c5f6350a292d 174 messages_enno->Location.lon, messages_enno->Location.ele, messages_enno->Location.eventDate,
weiarm2015 21:c5f6350a292d 175 buffer, 512, messages_enno->Location.pOriginator);
weiarm2015 21:c5f6350a292d 176 break;
weiarm2015 21:c5f6350a292d 177 default:
weiarm2015 21:c5f6350a292d 178 printf("WARN:Nothing published.\n");
weiarm2015 21:c5f6350a292d 179 break;
weiarm2015 21:c5f6350a292d 180 }
weiarm2015 21:c5f6350a292d 181 if (0 != trans_publish(path, buffer, len)){
weiarm2015 21:c5f6350a292d 182 rc = PUBLISH_ERROR;
weiarm2015 20:3858e42b0cd3 183 }
weiarm2015 20:3858e42b0cd3 184 return rc;
weiarm2015 20:3858e42b0cd3 185 }
weiarm2015 20:3858e42b0cd3 186
weiarm2015 20:3858e42b0cd3 187 Error_t enno_unsubscribe(char *pTopic) {
weiarm2015 20:3858e42b0cd3 188 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 189 if (0 != trans_unsubscribe(pTopic)) {
weiarm2015 20:3858e42b0cd3 190 rc = UNSUBSCRIBE_ERROR;
weiarm2015 20:3858e42b0cd3 191 }
weiarm2015 20:3858e42b0cd3 192 return rc;
weiarm2015 20:3858e42b0cd3 193
weiarm2015 20:3858e42b0cd3 194 }
weiarm2015 20:3858e42b0cd3 195
weiarm2015 20:3858e42b0cd3 196 Error_t enno_disconnect() {
weiarm2015 20:3858e42b0cd3 197 Error_t rc = NONE_ERROR;
weiarm2015 21:c5f6350a292d 198 if (0 != trans_disconnect()){
weiarm2015 20:3858e42b0cd3 199 rc = DISCONNECT_ERROR;
weiarm2015 20:3858e42b0cd3 200 }
weiarm2015 20:3858e42b0cd3 201 return rc;
weiarm2015 20:3858e42b0cd3 202 }
weiarm2015 20:3858e42b0cd3 203
weiarm2015 20:3858e42b0cd3 204 Error_t enno_loop(int timeout) {
weiarm2015 20:3858e42b0cd3 205 Error_t rc = NONE_ERROR;
weiarm2015 20:3858e42b0cd3 206 if (0 != trans_loop(timeout)){
weiarm2015 20:3858e42b0cd3 207 rc = YIELD_ERROR;
weiarm2015 20:3858e42b0cd3 208 }
weiarm2015 20:3858e42b0cd3 209 return rc;
weiarm2015 20:3858e42b0cd3 210 }
weiarm2015 20:3858e42b0cd3 211
weiarm2015 20:3858e42b0cd3 212
weiarm2015 20:3858e42b0cd3 213
weiarm2015 20:3858e42b0cd3 214
weiarm2015 20:3858e42b0cd3 215
weiarm2015 20:3858e42b0cd3 216
weiarm2015 20:3858e42b0cd3 217