예제 #1
0
bool PubSubClient::_process_message(MQTT::Message* msg, uint8_t match_type, uint16_t match_pid) {
  lastInActivity = millis();
  if (msg->type() == match_type) {
    if (match_pid)
      return msg->packet_id() == match_pid;
    return true;
  }

  switch (msg->type()) {
  case MQTTPUBLISH:
    {
      auto pub = (MQTT::Publish*)msg;

      if (_callback)
	_callback(*pub);

      if (pub->qos() == 1) {
	MQTT::PublishAck puback(pub->packet_id());
	puback.send(_client);
	lastOutActivity = millis();

      } else if (pub->qos() == 2) {
	uint8_t retries = 0;

	{
	  MQTT::PublishRec pubrec(pub->packet_id());
	  if (!send_reliably(&pubrec))
	    return false;
	}

	{
	  MQTT::PublishComp pubcomp(pub->packet_id());
	  pubcomp.send(_client);
	  lastOutActivity = millis();
	}
      }
    }
    break;

  case MQTTPINGREQ:
    {
      MQTT::PingResp pr;
      pr.send(_client);
      lastOutActivity = millis();
    }
    break;

  case MQTTPINGRESP:
    pingOutstanding = false;
  }

  return false;
}
예제 #2
0
END_TEST

/* Packet->id */
START_TEST(test_packet_id)
{
    fail_unless((packet_id(packet) == 1536),
        "packet_id did not return 1536");
}
예제 #3
0
void Connection::_incoming(const std::string& packet) {
  // data packet: '\0',rid,pktid, [data type, data](A'<>B')
  std::string nonce(packet.substr(1,8+8));
  std::string packet_id(packet.substr(1+8,8));
  assert(_nonces);
  if ( ! _nonces->open(packet_id) ) return; // out of order / replay / ours
  nonce.resize(crypto_box_NONCEBYTES,'\0');

  std::string m;
  if ( ! _naclsession.decrypt( packet.substr(1+8+8)
                             , nonce
                               , m ) ) return;
  _ch(_their_id, m[0], m.substr(1));
}