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; }
END_TEST /* Packet->id */ START_TEST(test_packet_id) { fail_unless((packet_id(packet) == 1536), "packet_id did not return 1536"); }
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)); }