mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-16 17:06:51 +01:00
Publish acks
This commit is contained in:
@@ -33,7 +33,7 @@
|
|||||||
* @param buflen the length in bytes of the data in the supplied buffer
|
* @param buflen the length in bytes of the data in the supplied buffer
|
||||||
* @return error code. 1 is success
|
* @return error code. 1 is success
|
||||||
*/
|
*/
|
||||||
int MQTTSNDeserialize_publish(int* dup, int* qos, int* retained, int* packetid, MQTTSN_topicid* topic,
|
int MQTTSNDeserialize_publish(int* dup, int* qos, int* retained, unsigned short* packetid, MQTTSN_topicid* topic,
|
||||||
unsigned char** payload, int* payloadlen, unsigned char* buf, int buflen)
|
unsigned char** payload, int* payloadlen, unsigned char* buf, int buflen)
|
||||||
{
|
{
|
||||||
MQTTSNFlags flags;
|
MQTTSNFlags flags;
|
||||||
@@ -85,36 +85,27 @@ exit:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
/**
|
int MQTTSNDeserialize_puback(unsigned short* topicid, unsigned short* packetid,
|
||||||
* Deserializes the supplied (wire) buffer into an ack
|
unsigned char* returncode, unsigned char* buf, int buflen)
|
||||||
* @param type returned integer - the MQTT packet type
|
|
||||||
* @param dup returned integer - the MQTT dup flag
|
|
||||||
* @param packetid returned integer - the MQTT packet identifier
|
|
||||||
* @param buf the raw buffer data, of the correct length determined by the remaining length field
|
|
||||||
* @param buflen the length in bytes of the data in the supplied buffer
|
|
||||||
* @return error code. 1 is success, 0 is failure
|
|
||||||
*/
|
|
||||||
int MQTTDeserialize_ack(int* type, int* dup, int* packetid, char* buf, int buflen)
|
|
||||||
{
|
{
|
||||||
MQTTHeader header;
|
unsigned char* curdata = buf;
|
||||||
char* curdata = buf;
|
unsigned char* enddata = NULL;
|
||||||
char* enddata = NULL;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int mylen;
|
int mylen = 0;
|
||||||
|
|
||||||
FUNC_ENTRY;
|
FUNC_ENTRY;
|
||||||
header.byte = readChar(&curdata);
|
curdata += (rc = MQTTSNPacket_decodeBuf(curdata, &mylen)); /* read length */
|
||||||
*dup = header.bits.dup;
|
enddata = buf + mylen;
|
||||||
*type = header.bits.type;
|
if (enddata - curdata > buflen)
|
||||||
|
|
||||||
curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */
|
|
||||||
enddata = curdata + mylen;
|
|
||||||
|
|
||||||
if (enddata - curdata < 2)
|
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
if (readChar(&curdata) != MQTTSN_PUBACK)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
*topicid = readInt(&curdata);
|
||||||
*packetid = readInt(&curdata);
|
*packetid = readInt(&curdata);
|
||||||
|
*returncode = readChar(&curdata);
|
||||||
|
|
||||||
rc = 1;
|
rc = 1;
|
||||||
exit:
|
exit:
|
||||||
@@ -122,4 +113,36 @@ exit:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
/**
|
||||||
|
* Deserializes the supplied (wire) buffer into an ack
|
||||||
|
* @param type returned integer - the MQTT packet type
|
||||||
|
* @param packetid returned integer - the MQTT packet identifier
|
||||||
|
* @param buf the raw buffer data, of the correct length determined by the remaining length field
|
||||||
|
* @param buflen the length in bytes of the data in the supplied buffer
|
||||||
|
* @return error code. 1 is success, 0 is failure
|
||||||
|
*/
|
||||||
|
int MQTTSNDeserialize_ack(unsigned char* type, unsigned short* packetid, unsigned char* buf, int buflen)
|
||||||
|
{
|
||||||
|
unsigned char* curdata = buf;
|
||||||
|
unsigned char* enddata = NULL;
|
||||||
|
int rc = 0;
|
||||||
|
int mylen = 0;
|
||||||
|
|
||||||
|
FUNC_ENTRY;
|
||||||
|
curdata += (rc = MQTTSNPacket_decodeBuf(curdata, &mylen)); /* read length */
|
||||||
|
enddata = buf + mylen;
|
||||||
|
if (enddata - curdata > buflen)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
*type = readChar(&curdata);
|
||||||
|
if (*type != MQTTSN_PUBREL && *type != MQTTSN_PUBREC && *type != MQTTSN_PUBCOMP)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
|
*packetid = readInt(&curdata);
|
||||||
|
|
||||||
|
rc = 1;
|
||||||
|
exit:
|
||||||
|
FUNC_EXIT_RC(rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|||||||
@@ -14,17 +14,23 @@
|
|||||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#ifndef MQTTSNPUBLISH_H_
|
#if !defined(MQTTSNPUBLISH_H_)
|
||||||
#define MQTTSNPUBLISH_H_
|
#define MQTTSNPUBLISH_H_
|
||||||
|
|
||||||
int MQTTSNSerialize_publish(unsigned char* buf, int buflen, int dup, int qos, int retained, int packetid,
|
int MQTTSNSerialize_publish(unsigned char* buf, int buflen, int dup, int qos, int retained, unsigned short packetid,
|
||||||
MQTTSN_topicid topic, unsigned char* payload, int payloadlen);
|
MQTTSN_topicid topic, unsigned char* payload, int payloadlen);
|
||||||
|
int MQTTSNDeserialize_publish(int* dup, int* qos, int* retained, unsigned short* packetid,
|
||||||
int MQTTSNDeserialize_publish(int* dup, int* qos, int* retained, int* packetid,
|
|
||||||
MQTTSN_topicid* topic, unsigned char** payload, int* payloadlen, unsigned char* buf, int len);
|
MQTTSN_topicid* topic, unsigned char** payload, int* payloadlen, unsigned char* buf, int len);
|
||||||
|
|
||||||
int MQTTSerialize_puback(char* buf, int buflen, unsigned short packetid, unsigned short topicid, unsigned char returncode);
|
int MQTTSNSerialize_puback(unsigned char* buf, int buflen, unsigned short topicid, unsigned short packetid,
|
||||||
int MQTTSerialize_pubrel(char* buf, int buflen, int packetid);
|
unsigned char returncode);
|
||||||
int MQTTSerialize_pubcomp(char* buf, int buflen, int packetid);
|
int MQTTSNDeserialize_puback(unsigned short* topicid, unsigned short* packetid,
|
||||||
|
unsigned char* returncode, unsigned char* buf, int buflen);
|
||||||
|
|
||||||
|
int MQTTSNSerialize_pubrec(unsigned char* buf, int buflen, unsigned short packetid);
|
||||||
|
int MQTTSNSerialize_pubrel(unsigned char* buf, int buflen, int dup, unsigned short packetid);
|
||||||
|
int MQTTSNSerialize_pubcomp(unsigned char* buf, int buflen, unsigned short packetid);
|
||||||
|
|
||||||
|
int MQTTSNDeserialize_ack(unsigned char* packettype, unsigned short* packetid, unsigned char* buf, int buflen);
|
||||||
|
|
||||||
#endif /* MQTTSNPUBLISH_H_ */
|
#endif /* MQTTSNPUBLISH_H_ */
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ int MQTTSNSerialize_publishLength(int payloadlen, MQTTSN_topicid topic, int qos)
|
|||||||
* @param payloadlen integer - the length of the MQTT payload
|
* @param payloadlen integer - the length of the MQTT payload
|
||||||
* @return the length of the serialized data. <= 0 indicates error
|
* @return the length of the serialized data. <= 0 indicates error
|
||||||
*/
|
*/
|
||||||
int MQTTSNSerialize_publish(unsigned char* buf, int buflen, int dup, int qos, int retained, int packetid,
|
int MQTTSNSerialize_publish(unsigned char* buf, int buflen, int dup, int qos, int retained, unsigned short packetid,
|
||||||
MQTTSN_topicid topic, unsigned char* payload, int payloadlen)
|
MQTTSN_topicid topic, unsigned char* payload, int payloadlen)
|
||||||
{
|
{
|
||||||
unsigned char *ptr = buf;
|
unsigned char *ptr = buf;
|
||||||
@@ -103,7 +103,35 @@ exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
int MQTTSNSerialize_puback(unsigned char* buf, int buflen, unsigned short topicid, unsigned short packetid,
|
||||||
|
unsigned char returncode)
|
||||||
|
{
|
||||||
|
unsigned char *ptr = buf;
|
||||||
|
int len = 0;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
FUNC_ENTRY;
|
||||||
|
if ((len = MQTTSNPacket_len(6)) > buflen)
|
||||||
|
{
|
||||||
|
rc = MQTTSNPACKET_BUFFER_TOO_SHORT;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
ptr += MQTTSNPacket_encode(ptr, len); /* write length */
|
||||||
|
writeChar(&ptr, MQTTSN_PUBACK); /* write message type */
|
||||||
|
|
||||||
|
writeInt(&ptr, topicid);
|
||||||
|
writeInt(&ptr, packetid);
|
||||||
|
writeChar(&ptr, returncode);
|
||||||
|
|
||||||
|
rc = ptr - buf;
|
||||||
|
exit:
|
||||||
|
FUNC_EXIT_RC(rc);
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializes the ack packet into the supplied buffer.
|
* Serializes the ack packet into the supplied buffer.
|
||||||
* @param buf the buffer into which the packet will be serialized
|
* @param buf the buffer into which the packet will be serialized
|
||||||
@@ -113,25 +141,23 @@ exit:
|
|||||||
* @param packetid integer - the MQTT packet identifier
|
* @param packetid integer - the MQTT packet identifier
|
||||||
* @return serialized length, or error if 0
|
* @return serialized length, or error if 0
|
||||||
*/
|
*/
|
||||||
int MQTTSerialize_ack(char* buf, int buflen, int type, int dup, int packetid)
|
int MQTTSNSerialize_ack(unsigned char* buf, int buflen, unsigned short packet_type, int dup, unsigned short packetid)
|
||||||
{
|
{
|
||||||
MQTTHeader header;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
char *ptr = buf;
|
unsigned char *ptr = buf;
|
||||||
|
int len = 4; /* ack packet length */
|
||||||
|
|
||||||
FUNC_ENTRY;
|
FUNC_ENTRY;
|
||||||
if (buflen < 4)
|
if (len > buflen)
|
||||||
{
|
{
|
||||||
rc = MQTTPACKET_BUFFER_TOO_SHORT;
|
rc = MQTTSNPACKET_BUFFER_TOO_SHORT;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
header.bits.type = type;
|
ptr += MQTTSNPacket_encode(ptr, len); /* write length */
|
||||||
header.bits.dup = dup;
|
writeChar(&ptr, packet_type); /* write packet type */
|
||||||
header.bits.qos = 0;
|
|
||||||
writeChar(&ptr, header.byte); /* write header */
|
|
||||||
|
|
||||||
ptr += MQTTPacket_encode(ptr, 2); /* write remaining length */
|
|
||||||
writeInt(&ptr, packetid);
|
writeInt(&ptr, packetid);
|
||||||
|
|
||||||
rc = ptr - buf;
|
rc = ptr - buf;
|
||||||
exit:
|
exit:
|
||||||
FUNC_EXIT_RC(rc);
|
FUNC_EXIT_RC(rc);
|
||||||
@@ -146,9 +172,9 @@ exit:
|
|||||||
* @param packetid integer - the MQTT packet identifier
|
* @param packetid integer - the MQTT packet identifier
|
||||||
* @return serialized length, or error if 0
|
* @return serialized length, or error if 0
|
||||||
*/
|
*/
|
||||||
int MQTTSerialize_puback(char* buf, int buflen, int packetid)
|
int MQTTSNSerialize_pubrec(unsigned char* buf, int buflen, unsigned short packetid)
|
||||||
{
|
{
|
||||||
return MQTTSerialize_ack(buf, buflen, PUBACK, packetid, 0);
|
return MQTTSNSerialize_ack(buf, buflen, MQTTSN_PUBREC, 0, packetid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -160,9 +186,9 @@ int MQTTSerialize_puback(char* buf, int buflen, int packetid)
|
|||||||
* @param packetid integer - the MQTT packet identifier
|
* @param packetid integer - the MQTT packet identifier
|
||||||
* @return serialized length, or error if 0
|
* @return serialized length, or error if 0
|
||||||
*/
|
*/
|
||||||
int MQTTSerialize_pubrel(char* buf, int buflen, int dup, int packetid)
|
int MQTTSNSerialize_pubrel(unsigned char* buf, int buflen, int dup, unsigned short packetid)
|
||||||
{
|
{
|
||||||
return MQTTSerialize_ack(buf, buflen, PUBREL, packetid, dup);
|
return MQTTSNSerialize_ack(buf, buflen, MQTTSN_PUBREL, dup, packetid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -173,10 +199,7 @@ int MQTTSerialize_pubrel(char* buf, int buflen, int dup, int packetid)
|
|||||||
* @param packetid integer - the MQTT packet identifier
|
* @param packetid integer - the MQTT packet identifier
|
||||||
* @return serialized length, or error if 0
|
* @return serialized length, or error if 0
|
||||||
*/
|
*/
|
||||||
int MQTTSerialize_pubcomp(char* buf, int buflen, int packetid)
|
int MQTTSNSerialize_pubcomp(unsigned char* buf, int buflen, unsigned short packetid)
|
||||||
{
|
{
|
||||||
return MQTTSerialize_ack(buf, buflen, PUBCOMP, packetid, 0);
|
return MQTTSNSerialize_ack(buf, buflen, MQTTSN_PUBCOMP, 0, packetid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
23
test/test1.c
23
test/test1.c
@@ -343,7 +343,7 @@ int test2(struct Options options)
|
|||||||
int dup = 0;
|
int dup = 0;
|
||||||
int qos = 2;
|
int qos = 2;
|
||||||
int retained = 0;
|
int retained = 0;
|
||||||
int msgid = 23;
|
unsigned short msgid = 23;
|
||||||
MQTTSN_topicid topic;
|
MQTTSN_topicid topic;
|
||||||
unsigned char *payload = (unsigned char*)"kkhkhkjkj jkjjk jk jk ";
|
unsigned char *payload = (unsigned char*)"kkhkhkjkj jkjjk jk jk ";
|
||||||
int payloadlen = strlen((char*)payload);
|
int payloadlen = strlen((char*)payload);
|
||||||
@@ -351,10 +351,13 @@ int test2(struct Options options)
|
|||||||
int dup2 = 1;
|
int dup2 = 1;
|
||||||
int qos2 = 1;
|
int qos2 = 1;
|
||||||
int retained2 = 1;
|
int retained2 = 1;
|
||||||
int msgid2 = 3243;
|
unsigned short msgid2 = 3243;
|
||||||
MQTTSN_topicid topic2;
|
MQTTSN_topicid topic2;
|
||||||
unsigned char *payload2 = NULL;
|
unsigned char *payload2 = NULL;
|
||||||
int payloadlen2 = 0;
|
int payloadlen2 = 0;
|
||||||
|
unsigned char acktype;
|
||||||
|
|
||||||
|
unsigned char returncode = 3, returncode2 = -99;
|
||||||
|
|
||||||
fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\"");
|
fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\"");
|
||||||
global_start_time = start_clock();
|
global_start_time = start_clock();
|
||||||
@@ -388,6 +391,22 @@ int test2(struct Options options)
|
|||||||
assert("payloads should be the same",
|
assert("payloads should be the same",
|
||||||
memcmp(payload, payload2, payloadlen) == 0, "payloads were different %s\n", "");
|
memcmp(payload, payload2, payloadlen) == 0, "payloads were different %s\n", "");
|
||||||
|
|
||||||
|
rc = MQTTSNSerialize_puback(buf, buflen, topic.data.id, msgid, returncode);
|
||||||
|
assert("good rc from serialize puback", rc > 0, "rc was %d\n", rc);
|
||||||
|
|
||||||
|
rc = MQTTSNDeserialize_puback(&topic2.data.id, &msgid2, &returncode2, buf, buflen);
|
||||||
|
assert("good rc from deserialize puback", rc > 0, "rc was %d\n", rc);
|
||||||
|
assert("msgids should be the same", msgid == msgid2, "msgids were different %d\n", msgid2);
|
||||||
|
assert("return codes should be the same", returncode == returncode2, "return codes were different %d\n", returncode2);
|
||||||
|
|
||||||
|
rc = MQTTSNSerialize_pubrec(buf, buflen, msgid);
|
||||||
|
assert("good rc from serialize pubrec", rc > 0, "rc was %d\n", rc);
|
||||||
|
|
||||||
|
rc = MQTTSNDeserialize_ack(&acktype, &msgid2, buf, buflen);
|
||||||
|
assert("good rc from deserialize pubrec", rc == 1, "rc was %d\n", rc);
|
||||||
|
assert("Acktype should be MQTTSN_PUBREC", acktype == MQTTSN_PUBREC, "acktype was %d\n", acktype);
|
||||||
|
assert("msgids should be the same", msgid == msgid2, "msgids were different %d\n", msgid2);
|
||||||
|
|
||||||
/*exit:*/
|
/*exit:*/
|
||||||
MyLog(LOGA_INFO, "TEST2: test %s. %d tests run, %d failures.",
|
MyLog(LOGA_INFO, "TEST2: test %s. %d tests run, %d failures.",
|
||||||
(failures == 0) ? "passed" : "failed", tests, failures);
|
(failures == 0) ? "passed" : "failed", tests, failures);
|
||||||
|
|||||||
Reference in New Issue
Block a user