Provides Javascript wrappers for MQTT.
Dependencies: mbed-http DEVI2C_JS MQTTPacket FP
MQTT_JS.cpp@1:a8ffffd1beab, 2020-02-03 (annotated)
- Committer:
- kajasu
- Date:
- Mon Feb 03 09:36:20 2020 +0000
- Revision:
- 1:a8ffffd1beab
- Parent:
- 0:f4dbe435e64c
TT
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 1 | /* |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 2 | * @file MQTT_JS.cpp |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 3 | * @author ST |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 4 | * @version V1.0.0 |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 5 | * @date 9 October 2017 |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 6 | * @brief Implementation of MQTT for Javascript. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 7 | ****************************************************************************** |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 8 | * @attention |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 9 | * |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 10 | * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 11 | * |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 12 | * Redistribution and use in source and binary forms, with or without modification, |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 13 | * are permitted provided that the following conditions are met: |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 14 | * 1. Redistributions of source code must retain the above copyright notice, |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 15 | * this list of conditions and the following disclaimer. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 16 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 17 | * this list of conditions and the following disclaimer in the documentation |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 18 | * and/or other materials provided with the distribution. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 19 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 20 | * may be used to endorse or promote products derived from this software |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 21 | * without specific prior written permission. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 22 | * |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 23 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 24 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 25 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 26 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 27 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 28 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 29 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 30 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 31 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 32 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 33 | * |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 34 | ****************************************************************************** |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 35 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 36 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 37 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 38 | /* Includes ------------------------------------------------------------------*/ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 39 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 40 | #include "MQTT_JS.h" |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 41 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 42 | /** onSubscribeCallback |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 43 | * @brief onSubscribeCallback. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 44 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 45 | jerry_value_t MQTT_JS::onSubscribeCallback; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 46 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 47 | /** Constructor |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 48 | * @brief Constructor. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 49 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 50 | MQTT_JS::MQTT_JS(){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 51 | connack_rc = 0; // MQTT connack return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 52 | ip_addr = NULL; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 53 | netConnecting = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 54 | connectTimeout = 1000; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 55 | mqttConnecting = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 56 | netConnected = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 57 | connected = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 58 | retryAttempt = 0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 59 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 60 | client = NULL; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 61 | mqttNetwork = NULL; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 62 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 63 | onSubscribeCallback = NULL; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 64 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 65 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 66 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 67 | /** Destructor |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 68 | * @brief Destructor. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 69 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 70 | MQTT_JS::~MQTT_JS(){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 71 | if(client){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 72 | delete client; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 73 | client = NULL; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 74 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 75 | if(mqttNetwork){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 76 | delete mqttNetwork; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 77 | mqttNetwork = NULL; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 78 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 79 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 80 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 81 | /** subscribe_cb |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 82 | * @brief Connects the subscription callback. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 83 | * @param Message Data |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 84 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 85 | void MQTT_JS::subscribe_cb(MQTT::MessageData & msgMQTT) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 86 | char msg[MQTT_MAX_PAYLOAD_SIZE]; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 87 | msg[0]='\0'; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 88 | strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 89 | //printf ("--->>> subscribe_cb msg: %s\n\r", msg); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 90 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 91 | if (onSubscribeCallback && jerry_value_is_function(onSubscribeCallback)) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 92 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 93 | jerry_value_t this_val = jerry_create_undefined (); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 94 | const jerry_value_t args[1] = { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 95 | jerry_create_string ((const jerry_char_t *)msg) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 96 | //jerry_create_number(3) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 97 | }; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 98 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 99 | jerry_value_t ret_val = jerry_call_function (onSubscribeCallback, this_val, args, 1); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 100 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 101 | if (!jerry_value_has_error_flag (ret_val)) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 102 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 103 | // handle return value |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 104 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 105 | jerry_release_value(args[0]); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 106 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 107 | jerry_release_value (ret_val); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 108 | jerry_release_value (this_val); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 109 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 110 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 111 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 112 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 113 | /** onSubscribe |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 114 | * @brief Calls the subscription callback. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 115 | * @param Jerry Callback |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 116 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 117 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 118 | int MQTT_JS::onSubscribe(jerry_value_t cb){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 119 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 120 | if (jerry_value_is_function(cb)) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 121 | onSubscribeCallback = cb; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 122 | return 0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 123 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 124 | return 1; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 125 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 126 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 127 | /** subscribe |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 128 | * @brief Subscribes to the topic. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 129 | * @param Topic |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 130 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 131 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 132 | int MQTT_JS::subscribe (char *_topic) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 133 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 134 | strcpy(topic, _topic); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 135 | if(!topic){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 136 | return 1; // invalid topic |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 137 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 138 | return client->subscribe(topic, MQTT::QOS1, subscribe_cb); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 139 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 140 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 141 | /** unsubscribe |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 142 | * @brief Unsubscribes the callback |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 143 | * @param Topic |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 144 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 145 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 146 | int MQTT_JS::unsubscribe(char *pubTopic) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 147 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 148 | return client->unsubscribe(pubTopic); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 149 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 150 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 151 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 152 | /** init |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 153 | * @brief Initializes the MQTT. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 154 | * @param NetworkInterface |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 155 | * @param ID |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 156 | * @param Token |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 157 | * @param URL |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 158 | * @param Port |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 159 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 160 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 161 | int MQTT_JS::init(NetworkInterface* network, char* _id, char* _token, char* _url, char* _port) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 162 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 163 | sprintf (id, "%s", _id); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 164 | sprintf (auth_token, "%s", _token); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 165 | sprintf (hostname, "%s", _url); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 166 | sprintf (subscription_url, "%s", _url); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 167 | sprintf (port, "%s", _port); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 168 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 169 | if (!network) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 170 | printf ("Error easy_connect\n\r"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 171 | return -1; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 172 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 173 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 174 | mqttNetwork = new MQTTNetwork(network); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 175 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 176 | client = new MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>(*mqttNetwork); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 177 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 178 | return 0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 179 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 180 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 181 | /** connect |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 182 | * @brief Connects to the MQTT Server. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 183 | * @param NetworkInterface |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 184 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 185 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 186 | int MQTT_JS::connect(NetworkInterface* network) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 187 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 188 | netConnecting = true; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 189 | int rc = mqttNetwork->connect(hostname, atoi(port)); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 190 | if (rc != 0) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 191 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 192 | //WARN("IP Stack connect returned: %d\n", rc); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 193 | return rc; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 194 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 195 | printf ("--->TCP Connected\n\r"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 196 | netConnected = true; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 197 | netConnecting = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 198 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 199 | // MQTT Connect |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 200 | mqttConnecting = true; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 201 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 202 | data.MQTTVersion = 4; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 203 | data.struct_version=0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 204 | data.clientID.cstring = id; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 205 | data.username.cstring = id; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 206 | data.password.cstring = auth_token; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 207 | data.keepAliveInterval = 15; // in Sec |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 208 | if ((rc = client->connect(data)) == 0) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 209 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 210 | connected = true; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 211 | printf ("--->MQTT Connected\n\r"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 212 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 213 | else { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 214 | WARN("MQTT connect returned %d\n", rc); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 215 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 216 | if (rc >= 0) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 217 | connack_rc = rc; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 218 | mqttConnecting = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 219 | return rc; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 220 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 221 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 222 | /** getConnTimeout |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 223 | * @brief Returns the timeout in seconds. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 224 | * @param Attempt number |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 225 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 226 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 227 | int MQTT_JS::getConnTimeout(int attemptNumber) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 228 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 229 | // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 230 | // after 20 attempts, retry every 10 minutes |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 231 | return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 232 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 233 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 234 | /** attemptConnect |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 235 | * @brief Attempt connection to MQTT server. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 236 | * @param NetworkInterface |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 237 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 238 | void MQTT_JS::attemptConnect(NetworkInterface* network) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 239 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 240 | connected = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 241 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 242 | while (connect(network) != MQTT_CONNECTION_ACCEPTED) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 243 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 244 | if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 245 | printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 246 | return; // don't reattempt to connect if credentials are wrong |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 247 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 248 | int timeout = getConnTimeout(++retryAttempt); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 249 | WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 250 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 251 | // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 252 | // or maybe just add the proper members to do this disconnect and call attemptConnect(...) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 253 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 254 | // this works - reset the system when the retry count gets to a threshold |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 255 | if (retryAttempt == 5) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 256 | NVIC_SystemReset(); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 257 | else |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 258 | wait(timeout); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 259 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 260 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 261 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 262 | /** publish |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 263 | * @brief Publishes to the MQTT broker. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 264 | * @param Data |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 265 | * @param Optional: retry number |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 266 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 267 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 268 | int MQTT_JS::publish(char* buf, int n) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 269 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 270 | MQTT::Message message; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 271 | message.qos = MQTT::QOS0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 272 | message.retained = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 273 | message.dup = false; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 274 | message.payload = (void*)buf; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 275 | message.payloadlen = strlen(buf); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 276 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 277 | //LOG("Publishing %s\n\r", buf); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 278 | int result = client->publish(topic, message); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 279 | if(result != 0){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 280 | if(n < 2){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 281 | printf("\33[31mCould not publish message. Trying again...\33[0m\n"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 282 | return publish(buf, n+1); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 283 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 284 | else{ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 285 | printf("\33[31mError publishing message!\33[0m\n"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 286 | return result; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 287 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 288 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 289 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 290 | /* |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 291 | if(result == 0){ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 292 | client->yield(5000); // allow the MQTT client to receive messages |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 293 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 294 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 295 | return result; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 296 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 297 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 298 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 299 | /** yield |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 300 | * @brief Waits for the MQTT broker for subscription callback. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 301 | * @param Time to wait |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 302 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 303 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 304 | int MQTT_JS::yield(int time) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 305 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 306 | client->yield(time); // allow the MQTT client to receive messages |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 307 | return 0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 308 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 309 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 310 | /** start_mqtt |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 311 | * @brief Starts a demo for MQTT. |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 312 | * @param NetworkInterface |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 313 | * @return Return code |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 314 | */ |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 315 | int MQTT_JS::start_mqtt(NetworkInterface* network) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 316 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 317 | sprintf (id, "hsojbpev"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 318 | sprintf (auth_token, "4H5vbg1KAhYi"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 319 | sprintf (hostname, "m20.cloudmqtt.com"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 320 | sprintf (subscription_url, "m20.cloudmqtt.com"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 321 | sprintf (port, "10023"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 322 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 323 | if (!network) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 324 | printf ("Error easy_connect\n\r"); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 325 | return -1; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 326 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 327 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 328 | mqttNetwork = new MQTTNetwork(network); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 329 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 330 | client = new MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>(*mqttNetwork); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 331 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 332 | attemptConnect(network); |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 333 | if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 334 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 335 | while (true) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 336 | wait(1.0); // Permanent failures - don't retry |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 337 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 338 | |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 339 | int count = 0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 340 | while (true) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 341 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 342 | if (++count == 6) |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 343 | { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 344 | // Publish a message every ~3 second |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 345 | if (publish((char*)"TestTest") != 0) { |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 346 | attemptConnect(network); // if we have lost the connection |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 347 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 348 | count = 0; |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 349 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 350 | client->yield(500); // allow the MQTT client to receive messages |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 351 | } |
akhtar.syedzeeshan@gmail.com | 0:f4dbe435e64c | 352 | } |