/** * Serializes the supplied unsubscribe data into the supplied buffer, ready for sending * @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 * @param dup integer - the MQTT dup flag * @param packetid integer - the MQTT packet identifier * @param count - number of members in the topicFilters array * @param topicFilters - array of topic filter names * @return the length of the serialized data. <= 0 indicates error */ int ICACHE_FLASH_ATTR MQTTSerialize_unsubscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid, int count, MQTTString topicFilters[]) { unsigned char *ptr = buf; MQTTHeader header = {0}; int rem_len = 0; int rc = -1; int i = 0; FUNC_ENTRY; if (MQTTPacket_len(rem_len = MQTTSerialize_unsubscribeLength(count, topicFilters)) > buflen) { rc = MQTTPACKET_BUFFER_TOO_SHORT; goto exit; } header.byte = 0; header.bits.type = UNSUBSCRIBE; header.bits.dup = dup; header.bits.qos = 1; writeChar(&ptr, header.byte); /* write header */ ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */; writeInt(&ptr, packetid); for (i = 0; i < count; ++i) writeMQTTString(&ptr, topicFilters[i]); rc = ptr - buf; exit: FUNC_EXIT_RC(rc); return rc; }
/** * Serializes the supplied subscribe data into the supplied buffer, ready for sending * @param buf the buffer into which the packet will be serialized * @param buflen the length in bytes of the supplied bufferr * @param dup integer - the MQTT dup flag * @param packetid integer - the MQTT packet identifier * @param count - number of members in the topicFilters and reqQos arrays * @param topicFilters - array of topic filter names * @param requestedQoSs - array of requested QoS * @return the length of the serialized data. <= 0 indicates error */ int MQTTSerialize_subscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid, int count, MQTTString topicFilters[], int requestedQoSs[]) { unsigned char *ptr = buf; MQTTHeader header = {0}; int rem_len = 0; int rc = 0; int i = 0; if (MQTTPacket_len(rem_len = MQTTSerialize_subscribeLength(count, topicFilters)) > buflen) { rc = MQTTPACKET_BUFFER_TOO_SHORT; goto exit; } header.byte = 0; header.bits.type = SUBSCRIBE; header.bits.dup = dup; header.bits.qos = 1; writeChar(&ptr, header.byte); /* write header */ ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */; writeInt(&ptr, packetid); for (i = 0; i < count; ++i) { writeMQTTString(&ptr, topicFilters[i]); writeChar(&ptr, requestedQoSs[i]); } rc = ptr - buf; exit: return rc; }
/** * Serializes the supplied publish data into the supplied buffer, ready for sending * @param buf the buffer into which the packet will be serialized * @param buflen the length in bytes of the supplied buffer * @param dup integer - the MQTT dup flag * @param qos integer - the MQTT QoS value * @param retained integer - the MQTT retained flag * @param packetid integer - the MQTT packet identifier * @param topicName MQTTString - the MQTT topic in the publish * @param payload byte buffer - the MQTT publish payload * @param payloadlen integer - the length of the MQTT payload * @return the length of the serialized data. <= 0 indicates error */ int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, uint64_t packetid, MQTTString topicName, unsigned char* payload, int payloadlen) { unsigned char *ptr = buf; MQTTHeader header = {0}; int rem_len = 0; int rc = 0; FUNC_ENTRY; if (MQTTPacket_len(rem_len = MQTTSerialize_publishLength(qos, topicName, payloadlen)) > buflen) { rc = MQTTPACKET_BUFFER_TOO_SHORT; goto exit; } header.bits.type = PUBLISH; header.bits.dup = dup; header.bits.qos = qos; header.bits.retain = retained; writeChar(&ptr, header.byte); /* write header */ ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */; writeMQTTString(&ptr, topicName); if (qos > 0) writeInt64(&ptr, packetid); memcpy(ptr, payload, payloadlen); ptr += payloadlen; rc = ptr - buf; exit: FUNC_EXIT_RC(rc); return rc; }
/** * Serializes the connect options into the buffer. * @param buf the buffer into which the packet will be serialized * @param len the length in bytes of the supplied buffer * @param options the options to be used to build the connect packet * @return serialized length, or error if 0 */ int MQTTSerialize_connect(unsigned char* buf, int buflen, MQTTPacket_connectData* options) { unsigned char *ptr = buf; MQTTHeader header = {0}; MQTTConnectFlags flags = {0}; int len = 0; int rc = -1; FUNC_ENTRY; if (MQTTPacket_len(len = MQTTSerialize_connectLength(options)) > buflen) { rc = MQTTPACKET_BUFFER_TOO_SHORT; goto exit; } header.byte = 0; header.bits.type = CONNECT; writeChar(&ptr, header.byte); /* write header */ ptr += MQTTPacket_encode(ptr, len); /* write remaining length */ if (options->MQTTVersion == 4) { writeCString(&ptr, "MQTT"); writeChar(&ptr, (char) 4); } else { writeCString(&ptr, "MQIsdp"); writeChar(&ptr, (char) 3); } flags.all = 0; flags.bits.cleansession = options->cleansession; flags.bits.will = (options->willFlag) ? 1 : 0; if (flags.bits.will) { flags.bits.willQoS = options->will.qos; flags.bits.willRetain = options->will.retained; } if (options->username.cstring || options->username.lenstring.data) flags.bits.username = 1; if (options->password.cstring || options->password.lenstring.data) flags.bits.password = 1; writeChar(&ptr, flags.all); writeInt(&ptr, options->keepAliveInterval); writeMQTTString(&ptr, options->clientID); if (options->willFlag) { writeMQTTString(&ptr, options->will.topicName); writeMQTTString(&ptr, options->will.message); } if (flags.bits.username) writeMQTTString(&ptr, options->username); if (flags.bits.password) writeMQTTString(&ptr, options->password); rc = ptr - buf; exit: FUNC_EXIT_RC(rc); return rc; }