diff --git a/src/mqtt.c b/src/mqtt.c index f0c0f60..b3ec0ce 100644 --- a/src/mqtt.c +++ b/src/mqtt.c @@ -9,6 +9,7 @@ #include "mqtt.h" #include "mqtt_internal.h" +#include "packet.h" #include "platform.h" #include "protocol.h" #include "debug.h" @@ -33,7 +34,7 @@ static inline void parse_packet(MQTTHandle *handle, MQTTPacket *packet) { case PacketTypeSubAck: case PacketTypeUnsubAck: if (!dispatch_packet(handle, packet)) { - DEBUG_LOG("Unexpected packet!"); + DEBUG_LOG("Unexpected packet! (type: %s, packet_id: %d)", get_packet_name(packet), get_packet_id(packet)); disconnect(handle); } break; diff --git a/src/packet.c b/src/packet.c index b2cb002..d80ba8c 100644 --- a/src/packet.c +++ b/src/packet.c @@ -662,3 +662,52 @@ Buffer *mqtt_packet_encode(MQTTPacket *packet) { return NULL; } + +/* + * Helper functions + */ + +uint16_t get_packet_id(MQTTPacket *packet) { + switch(packet->packet_type) { + case PacketTypePublish: + return ((PublishPayload *)packet->payload)->packet_id; + case PacketTypePubAck: + return ((PubAckPayload *)packet->payload)->packet_id; + case PacketTypePubRec: + return ((PubRecPayload *)packet->payload)->packet_id; + case PacketTypePubRel: + return ((PubRelPayload *)packet->payload)->packet_id; + case PacketTypePubComp: + return ((PubCompPayload *)packet->payload)->packet_id; + case PacketTypeSubscribe: + return ((SubscribePayload *)packet->payload)->packet_id; + case PacketTypeSubAck: + return ((SubAckPayload *)packet->payload)->packet_id; + case PacketTypeUnsubscribe: + return ((UnsubscribePayload *)packet->payload)->packet_id; + case PacketTypeUnsubAck: + return ((UnsubAckPayload *)packet->payload)->packet_id; + default: + return 0; // no packet id in payload + } +} + +char *get_packet_name(MQTTPacket *packet) { + switch (packet->packet_type) { + case PacketTypeConnect: return "CONNECT"; + case PacketTypeConnAck: return "CONNACK"; + case PacketTypePublish: return "PUBLISH"; + case PacketTypePubAck: return "PUBACK"; + case PacketTypePubRec: return "PUBREC"; + case PacketTypePubRel: return "PUBREL"; + case PacketTypePubComp: return "PUBCOMP"; + case PacketTypeSubscribe: return "SUBSCRIBE"; + case PacketTypeSubAck: return "SUBACK"; + case PacketTypeUnsubscribe: return "UNSUBSCRIBE"; + case PacketTypeUnsubAck: return "UNSUBACK"; + case PacketTypePingReq: return "PINGREQ"; + case PacketTypePingResp: return "PINGRESP"; + case PacketTypeDisconnect: return "DISCONNECT"; + } + return "[UNKNOWN]"; +} diff --git a/src/packet.h b/src/packet.h index 8f539bf..b43eed0 100644 --- a/src/packet.h +++ b/src/packet.h @@ -127,4 +127,11 @@ void free_MQTTPacket(MQTTPacket *packet); Buffer *mqtt_packet_encode(MQTTPacket *packet); MQTTPacket *allocate_MQTTPacket(MQTTControlPacketType type); +/* + * Utility + */ + +uint16_t get_packet_id(MQTTPacket *packet); +char *get_packet_name(MQTTPacket *packet); + #endif /* packet_h__included */ diff --git a/src/state_queue.c b/src/state_queue.c index 78c1f9a..f032b9c 100644 --- a/src/state_queue.c +++ b/src/state_queue.c @@ -31,31 +31,6 @@ void expect_packet(MQTTHandle *handle, MQTTControlPacketType type, uint16_t pack // dump_expected(handle); } -static uint16_t get_packet_id(MQTTPacket *packet) { - switch(packet->packet_type) { - case PacketTypePublish: - return ((PublishPayload *)packet->payload)->packet_id; - case PacketTypePubAck: - return ((PubAckPayload *)packet->payload)->packet_id; - case PacketTypePubRec: - return ((PubRecPayload *)packet->payload)->packet_id; - case PacketTypePubRel: - return ((PubRelPayload *)packet->payload)->packet_id; - case PacketTypePubComp: - return ((PubCompPayload *)packet->payload)->packet_id; - case PacketTypeSubscribe: - return ((SubscribePayload *)packet->payload)->packet_id; - case PacketTypeSubAck: - return ((SubAckPayload *)packet->payload)->packet_id; - case PacketTypeUnsubscribe: - return ((UnsubscribePayload *)packet->payload)->packet_id; - case PacketTypeUnsubAck: - return ((UnsubAckPayload *)packet->payload)->packet_id; - default: - return 0; // no packet id in payload - } -} - void remove_from_queue(MQTTHandle *handle, MQTTCallbackQueueItem *remove) { MQTTCallbackQueueItem *item = handle->queue.pending; MQTTCallbackQueueItem *prev_item = NULL;