MQTT version for enno SDK
Dependencies: EthernetInterface MQTT mbed-rtos mbed serialzation_lib
Fork of HelloMQTT by
protocol/enno_api_mqtt_wrapper.c@20:3858e42b0cd3, 2015-11-25 (annotated)
- Committer:
- weiarm2015
- Date:
- Wed Nov 25 07:07:31 2015 +0000
- Revision:
- 20:3858e42b0cd3
- Child:
- 21:c5f6350a292d
?
Who changed what in which revision?
User | Revision | Line number | New 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 |