You've already forked Adafruit_MQTT_Library
							
							
				mirror of
				https://github.com/adafruit/Adafruit_MQTT_Library.git
				synced 2025-11-03 11:53:11 +03:00 
			
		
		
		
	Merge pull request #170 from Fapiko/better-ping-handling
Better ping handling
This commit is contained in:
		@@ -152,10 +152,12 @@ int8_t Adafruit_MQTT::connect() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Read connect response packet and verify it
 | 
					  // Read connect response packet and verify it
 | 
				
			||||||
  len = readFullPacket(buffer, MAXBUFFERSIZE, CONNECT_TIMEOUT_MS);
 | 
					  len = readFullPacket(buffer, MAXBUFFERSIZE, CONNECT_TIMEOUT_MS);
 | 
				
			||||||
  if (len != 4)
 | 
					  if (len != 4) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
  if ((buffer[0] != (MQTT_CTRL_CONNECTACK << 4)) || (buffer[1] != 2))
 | 
					  }
 | 
				
			||||||
 | 
					  if ((buffer[0] != (MQTT_CTRL_CONNECTACK << 4)) || (buffer[1] != 2)) {
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  if (buffer[3] != 0)
 | 
					  if (buffer[3] != 0)
 | 
				
			||||||
    return buffer[3];
 | 
					    return buffer[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -182,7 +184,6 @@ int8_t Adafruit_MQTT::connect() {
 | 
				
			|||||||
      // the Subscription before the Server sends the SUBACK Packet. (will
 | 
					      // the Subscription before the Server sends the SUBACK Packet. (will
 | 
				
			||||||
      // really need to use callbacks - ada)
 | 
					      // really need to use callbacks - ada)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Serial.println("\t**looking for suback");
 | 
					 | 
				
			||||||
      if (processPacketsUntil(buffer, MQTT_CTRL_SUBACK, SUBACK_TIMEOUT_MS)) {
 | 
					      if (processPacketsUntil(buffer, MQTT_CTRL_SUBACK, SUBACK_TIMEOUT_MS)) {
 | 
				
			||||||
        success = true;
 | 
					        success = true;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@@ -213,12 +214,17 @@ uint16_t Adafruit_MQTT::processPacketsUntil(uint8_t *buffer,
 | 
				
			|||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((buffer[0] >> 4) == waitforpackettype) {
 | 
					    uint8_t packetType = (buffer[0] >> 4);
 | 
				
			||||||
 | 
					    if (packetType == waitforpackettype) {
 | 
				
			||||||
      return len;
 | 
					      return len;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      if (packetType == MQTT_CTRL_PUBLISH) {
 | 
				
			||||||
 | 
					        handleSubscriptionPacket(len);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        ERROR_PRINTLN(F("Dropped a packet"));
 | 
					        ERROR_PRINTLN(F("Dropped a packet"));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -432,30 +438,21 @@ void Adafruit_MQTT::processPackets(int16_t timeout) {
 | 
				
			|||||||
  while (elapsed < (uint32_t)timeout) {
 | 
					  while (elapsed < (uint32_t)timeout) {
 | 
				
			||||||
    Adafruit_MQTT_Subscribe *sub = readSubscription(timeout - elapsed);
 | 
					    Adafruit_MQTT_Subscribe *sub = readSubscription(timeout - elapsed);
 | 
				
			||||||
    if (sub) {
 | 
					    if (sub) {
 | 
				
			||||||
      // Serial.println("**** sub packet received");
 | 
					 | 
				
			||||||
      if (sub->callback_uint32t != NULL) {
 | 
					      if (sub->callback_uint32t != NULL) {
 | 
				
			||||||
        // huh lets do the callback in integer mode
 | 
					        // huh lets do the callback in integer mode
 | 
				
			||||||
        uint32_t data = 0;
 | 
					        uint32_t data = 0;
 | 
				
			||||||
        data = atoi((char *)sub->lastread);
 | 
					        data = atoi((char *)sub->lastread);
 | 
				
			||||||
        // Serial.print("*** calling int callback with : ");
 | 
					 | 
				
			||||||
        // Serial.println(data);
 | 
					 | 
				
			||||||
        sub->callback_uint32t(data);
 | 
					        sub->callback_uint32t(data);
 | 
				
			||||||
      } else if (sub->callback_double != NULL) {
 | 
					      } else if (sub->callback_double != NULL) {
 | 
				
			||||||
        // huh lets do the callback in doublefloat mode
 | 
					        // huh lets do the callback in doublefloat mode
 | 
				
			||||||
        double data = 0;
 | 
					        double data = 0;
 | 
				
			||||||
        data = atof((char *)sub->lastread);
 | 
					        data = atof((char *)sub->lastread);
 | 
				
			||||||
        // Serial.print("*** calling double callback with : ");
 | 
					 | 
				
			||||||
        // Serial.println(data);
 | 
					 | 
				
			||||||
        sub->callback_double(data);
 | 
					        sub->callback_double(data);
 | 
				
			||||||
      } else if (sub->callback_buffer != NULL) {
 | 
					      } else if (sub->callback_buffer != NULL) {
 | 
				
			||||||
        // huh lets do the callback in buffer mode
 | 
					        // huh lets do the callback in buffer mode
 | 
				
			||||||
        // Serial.print("*** calling buffer callback with : ");
 | 
					 | 
				
			||||||
        // Serial.println((char *)sub->lastread);
 | 
					 | 
				
			||||||
        sub->callback_buffer((char *)sub->lastread, sub->datalen);
 | 
					        sub->callback_buffer((char *)sub->lastread, sub->datalen);
 | 
				
			||||||
      } else if (sub->callback_io != NULL) {
 | 
					      } else if (sub->callback_io != NULL) {
 | 
				
			||||||
        // huh lets do the callback in io mode
 | 
					        // huh lets do the callback in io mode
 | 
				
			||||||
        // Serial.print("*** calling io instance callback with : ");
 | 
					 | 
				
			||||||
        // Serial.println((char *)sub->lastread);
 | 
					 | 
				
			||||||
        ((sub->io_mqtt)->*(sub->callback_io))((char *)sub->lastread,
 | 
					        ((sub->io_mqtt)->*(sub->callback_io))((char *)sub->lastread,
 | 
				
			||||||
                                              sub->datalen);
 | 
					                                              sub->datalen);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -469,23 +466,29 @@ void Adafruit_MQTT::processPackets(int16_t timeout) {
 | 
				
			|||||||
    elapsed += (endtime - starttime);
 | 
					    elapsed += (endtime - starttime);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
Adafruit_MQTT_Subscribe *Adafruit_MQTT::readSubscription(int16_t timeout) {
 | 
					Adafruit_MQTT_Subscribe *Adafruit_MQTT::readSubscription(int16_t timeout) {
 | 
				
			||||||
  uint16_t i, topiclen, datalen;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Check if data is available to read.
 | 
					  // Check if data is available to read.
 | 
				
			||||||
  uint16_t len =
 | 
					  uint16_t len =
 | 
				
			||||||
      readFullPacket(buffer, MAXBUFFERSIZE, timeout); // return one full packet
 | 
					      readFullPacket(buffer, MAXBUFFERSIZE, timeout); // return one full packet
 | 
				
			||||||
  if (!len)
 | 
					  return handleSubscriptionPacket(len);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Adafruit_MQTT_Subscribe *Adafruit_MQTT::handleSubscriptionPacket(uint16_t len) {
 | 
				
			||||||
 | 
					  uint16_t i, topiclen, datalen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!len) {
 | 
				
			||||||
    return NULL; // No data available, just quit.
 | 
					    return NULL; // No data available, just quit.
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  DEBUG_PRINT("Packet len: ");
 | 
					  DEBUG_PRINT("Packet len: ");
 | 
				
			||||||
  DEBUG_PRINTLN(len);
 | 
					  DEBUG_PRINTLN(len);
 | 
				
			||||||
  DEBUG_PRINTBUFFER(buffer, len);
 | 
					  DEBUG_PRINTBUFFER(buffer, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (len < 3)
 | 
					  if (len < 3) {
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
  if ((buffer[0] & 0xF0) != (MQTT_CTRL_PUBLISH) << 4)
 | 
					  }
 | 
				
			||||||
 | 
					  if ((buffer[0] & 0xF0) != (MQTT_CTRL_PUBLISH) << 4) {
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Parse out length of packet.
 | 
					  // Parse out length of packet.
 | 
				
			||||||
  topiclen = buffer[3];
 | 
					  topiclen = buffer[3];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -206,6 +206,10 @@ public:
 | 
				
			|||||||
  // messages!
 | 
					  // messages!
 | 
				
			||||||
  Adafruit_MQTT_Subscribe *readSubscription(int16_t timeout = 0);
 | 
					  Adafruit_MQTT_Subscribe *readSubscription(int16_t timeout = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Handle any data coming in for subscriptions and fires them off to the
 | 
				
			||||||
 | 
					  // appropriate callback
 | 
				
			||||||
 | 
					  Adafruit_MQTT_Subscribe *handleSubscriptionPacket(uint16_t len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void processPackets(int16_t timeout);
 | 
					  void processPackets(int16_t timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Ping the server to ensure the connection is still alive.
 | 
					  // Ping the server to ensure the connection is still alive.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,6 +55,10 @@ uint16_t Adafruit_MQTT_Client::readPacket(uint8_t *buffer, uint16_t maxlen,
 | 
				
			|||||||
  uint16_t len = 0;
 | 
					  uint16_t len = 0;
 | 
				
			||||||
  int16_t t = timeout;
 | 
					  int16_t t = timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (maxlen == 0) { // handle zero-length packets
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (client->connected() && (timeout >= 0)) {
 | 
					  while (client->connected() && (timeout >= 0)) {
 | 
				
			||||||
    // DEBUG_PRINT('.');
 | 
					    // DEBUG_PRINT('.');
 | 
				
			||||||
    while (client->available()) {
 | 
					    while (client->available()) {
 | 
				
			||||||
@@ -65,10 +69,6 @@ uint16_t Adafruit_MQTT_Client::readPacket(uint8_t *buffer, uint16_t maxlen,
 | 
				
			|||||||
      // DEBUG_PRINTLN((uint8_t)c, HEX);
 | 
					      // DEBUG_PRINTLN((uint8_t)c, HEX);
 | 
				
			||||||
      len++;
 | 
					      len++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (maxlen == 0) { // handle zero-length packets
 | 
					 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (len == maxlen) { // we read all we want, bail
 | 
					      if (len == maxlen) { // we read all we want, bail
 | 
				
			||||||
        DEBUG_PRINT(F("Read data:\t"));
 | 
					        DEBUG_PRINT(F("Read data:\t"));
 | 
				
			||||||
        DEBUG_PRINTBUFFER(buffer, len);
 | 
					        DEBUG_PRINTBUFFER(buffer, len);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
name=Adafruit MQTT Library
 | 
					name=Adafruit MQTT Library
 | 
				
			||||||
version=2.0.0
 | 
					version=2.1.0
 | 
				
			||||||
author=Adafruit
 | 
					author=Adafruit
 | 
				
			||||||
maintainer=Adafruit <info@adafruit.com>
 | 
					maintainer=Adafruit <info@adafruit.com>
 | 
				
			||||||
sentence=MQTT library that supports the FONA, ESP8266, Yun, and generic Arduino Client hardware.
 | 
					sentence=MQTT library that supports the FONA, ESP8266, Yun, and generic Arduino Client hardware.
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user