lwmqtt_err_t lwmqtt_read_string(uint8_t **buf, const uint8_t *buf_end, lwmqtt_string_t *str) { // read length uint16_t len; lwmqtt_err_t err = lwmqtt_read_num(buf, buf_end, &len); if (err != LWMQTT_SUCCESS) { return err; } // read data err = lwmqtt_read_data(buf, buf_end, (uint8_t **)&str->data, len); if (err != LWMQTT_SUCCESS) { return err; } // set length str->len = len; return LWMQTT_SUCCESS; }
lwmqtt_err_t lwmqtt_decode_publish(uint8_t *buf, size_t buf_len, bool *dup, uint16_t *packet_id, lwmqtt_string_t *topic, lwmqtt_message_t *msg) { // prepare pointer uint8_t *buf_ptr = buf; uint8_t *buf_end = buf + buf_len; // read header uint8_t header; lwmqtt_err_t err = lwmqtt_read_byte(&buf_ptr, buf_end, &header); if (err != LWMQTT_SUCCESS) { return err; } // check packet type if (lwmqtt_read_bits(header, 4, 4) != LWMQTT_PUBLISH_PACKET) { return LWMQTT_MISSING_OR_WRONG_PACKET; } // get dup *dup = lwmqtt_read_bits(header, 3, 1) == 1; // get retained msg->retained = lwmqtt_read_bits(header, 0, 1) == 1; // get qos switch (lwmqtt_read_bits(header, 1, 2)) { case 0: msg->qos = LWMQTT_QOS0; break; case 1: msg->qos = LWMQTT_QOS1; break; case 2: msg->qos = LWMQTT_QOS2; break; default: msg->qos = LWMQTT_QOS0; break; } // read remaining length uint32_t rem_len; err = lwmqtt_read_varnum(&buf_ptr, buf_end, &rem_len); if (err != LWMQTT_SUCCESS) { return err; } // check remaining length (topic length) if (rem_len < 2) { return LWMQTT_REMAINING_LENGTH_MISMATCH; } // check buffer capacity if ((uint32_t)(buf_end - buf_ptr) < rem_len) { return LWMQTT_BUFFER_TOO_SHORT; } // reset buf end buf_end = buf_ptr + rem_len; // read topic err = lwmqtt_read_string(&buf_ptr, buf_end, topic); if (err != LWMQTT_SUCCESS) { return err; } // read packet id if qos is at least 1 if (msg->qos > 0) { err = lwmqtt_read_num(&buf_ptr, buf_end, packet_id); if (err != LWMQTT_SUCCESS) { return err; } } else { *packet_id = 0; } // set payload length msg->payload_len = buf_end - buf_ptr; // read payload err = lwmqtt_read_data(&buf_ptr, buf_end, &msg->payload, buf_end - buf_ptr); if (err != LWMQTT_SUCCESS) { return err; } return LWMQTT_SUCCESS; }