Provides Javascript wrappers for MQTT.

Dependencies:   mbed-http DEVI2C_JS MQTTPacket FP

Committer:
kajasu
Date:
Mon Feb 03 09:36:20 2020 +0000
Revision:
1:a8ffffd1beab
Parent:
0:f4dbe435e64c
TT

Who changed what in which revision?

UserRevisionLine numberNew 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>&copy; 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 }