コード例 #1
0
ファイル: mqttsn.c プロジェクト: Frank-KunLi/whsnbg
//--------------------------------------------
mqttsn_return_code_t mqttsn_subscribe_decode(mqttsn_fixed_header_t *fixhdr, mqttsn_subscribe_header_t *subscribe)
{
	mqttsn_flags_decode(&subscribe->flags, &fixhdr->rem_buf[0]);
	subscribe->msg_id = ntohs(*((uint16_t *)&fixhdr->rem_buf[1]));
	if (subscribe->flags.topic_id_type == MQTTSN_TOPIC_NAME)
	{
		subscribe->name_length = fixhdr->rem_len - 3;
		subscribe->name = &fixhdr->rem_buf[3];
		subscribe->sub_item = list_sub_add_replace(subscribe->sub_list, subscribe->name, subscribe->name_length, subscribe->flags.qos);
		if (list_sub_has_wildcard(subscribe->sub_item) == 0)
			subscribe->pub_item = list_pub_add_ignore(subscribe->pub_list, subscribe->name, subscribe->name_length, NULL, 0, 0);
#if 0
		// maybe it's not needed
		else
			subscribe->topic_id = 0;
#endif
	}
	if (subscribe->flags.topic_id_type == MQTTSN_PREDEF_TOPIC_ID)
	{
		subscribe->topic_id = ntohs(*((unsigned short *)&fixhdr->rem_buf[3]));
		subscribe->pub_item = list_pub_find_topic_id(subscribe->pub_list, subscribe->topic_id);
		if (subscribe->pub_item == NULL)
		{
			dprintf("invalid subtopic, topic_id:%d, qos:%d, msg_id:%d\n", subscribe->topic_id, subscribe->flags.qos, subscribe->msg_id);
			return MQTTSN_REFUSED_INVALID_TOPIC_ID;
		}
		subscribe->sub_item = list_sub_add_replace(subscribe->sub_list, subscribe->pub_item->name, subscribe->pub_item->name_len, subscribe->flags.qos);
	}
	if (subscribe->flags.topic_id_type == MQTTSN_SHORT_TOPIC_NAME)
		return MQTTSN_REFUSED_NOT_SUPPORTED;
	dprintf("subtopic:%.*s, topic_id:%d, qos:%d, msg_id:%d\n", subscribe->sub_item->name_len, subscribe->sub_item->name, subscribe->topic_id, subscribe->flags.qos, subscribe->msg_id);
	return MQTTSN_ACCEPTED;
}
コード例 #2
0
ファイル: mqtt.c プロジェクト: geffzhang/whsnbg
//--------------------------------------------
void mqtt_subscribe_decode(mqtt_fixed_header_t *fixhdr, mqtt_subscribe_header_t *subscribe)
{
	size_t len;

	subscribe->qos_size = 0;
	subscribe->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;
		uint8_t qos = *(fixhdr->rem_buf + 2 + len + 2 + name_len);
		list_sub_add_replace(subscribe->sub_list, name, name_len, qos/*, &changed*/);
		list_sub_add_replace(&subscribe->sub_item, name, name_len, qos/*, &changed*/);
		dprintf("subtopic:%.*s, qos:%d\n", name_len, name, qos);
		subscribe->qos_size++;
		len += name_len + 3;
	}

	assert(2 + len == fixhdr->rem_len);
}