![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
MQTT version for enno SDK
Dependencies: EthernetInterface MQTT mbed-rtos mbed serialzation_lib
Fork of HelloMQTT by
protocol/enno_api_mqtt_wrapper.c@21:c5f6350a292d, 2015-12-02 (annotated)
- 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?
User | Revision | Line number | New 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 |