//-------------------------------------------- void mqtt_unsubscribe_decode(mqtt_fixed_header_t *fixhdr, mqtt_unsubscribe_header_t *unsubscribe) { size_t len; unsubscribe->msg_id = ntohs(*((unsigned short *)&fixhdr->rem_buf[0])); for (len = 0; len < fixhdr->rem_len - 2;) { uint16_t name_len = ntohs(*((unsigned short *)(&fixhdr->rem_buf[2] + len))); uint8_t *name = fixhdr->rem_buf + 2 + len + 2; list_sub_remove_name(unsubscribe->sub_list, name, name_len); dprintf("subtopic:%.*s\n", name_len, name); len += name_len + 2; } assert(2 + len == fixhdr->rem_len); }
//-------------------------------------------- mqttsn_return_code_t mqttsn_unsubscribe_decode(mqttsn_fixed_header_t *fixhdr, mqttsn_unsubscribe_header_t *unsubscribe) { mqttsn_flags_decode(&unsubscribe->flags, &fixhdr->rem_buf[0]); unsubscribe->msg_id = ntohs(*((uint16_t *)&fixhdr->rem_buf[1])); if (unsubscribe->flags.topic_id_type == MQTTSN_TOPIC_NAME) { unsubscribe->name_length = fixhdr->rem_len - 3; unsubscribe->name = &fixhdr->rem_buf[3]; list_sub_remove_name(unsubscribe->sub_list, unsubscribe->name, unsubscribe->name_length); } if (unsubscribe->flags.topic_id_type == MQTTSN_PREDEF_TOPIC_ID) { unsubscribe->topic_id = ntohs(*((unsigned short *)&fixhdr->rem_buf[3])); list_sub_remove_topic_id(unsubscribe->sub_list, unsubscribe->topic_id); } if (unsubscribe->flags.topic_id_type == MQTTSN_SHORT_TOPIC_NAME) return MQTTSN_REFUSED_NOT_SUPPORTED; return MQTTSN_ACCEPTED; }