Esempio n. 1
0
void messageArrived(MessageData* md)
{
	MQTTMessage* message = md->message;
	if (opts.showtopics)
		printf("topic  %.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data);
	if (opts.nodelimiter)
		printf("delimiter %.*s", (int)message->payloadlen, (char*)message->payload);
	else
		printf("delimiter is %.*s%s", (int)message->payloadlen, (char*)message->payload, opts.delimiter);
	//fflush(stdout);

    char *payload_type_c = strchr(md->topicName->lenstring.data, '/');
    uint16_t type = 0;
    
    if (payload_type_c == NULL)
    {
        printf("Found payload type failed.\n");
        return;
    }
    else
    {
        printf("\n%c, len %d\n", *(payload_type_c + 1), (int)message->payloadlen);
    }

    switch (*(payload_type_c + 1))
    {
        case 'c':
            type = PAYLOAD_TYPE_COMMAND;
            break;
        case 'e':
            type = PAYLOAD_TYPE_EVENT;
            break;
        case 'd':
            type = PAYLOAD_TYPE_DATA;
            break;
        default:
            printf("Wrong type of message: %c\n", *(payload_type_c + 1));
            return;
    }
    
    struct pando_buffer *msg_payload = NULL;
    msg_payload = pando_buffer_create(message->payloadlen,0);
    pd_memcpy(msg_payload->buffer, message->payload, msg_payload->buff_len);

    printf("before decode, %d\n", recv_count);
    show_package(msg_payload->buffer + msg_payload->offset,
        msg_payload->buff_len - msg_payload->offset);
    pando_protocol_decode(msg_payload, type);

    recv_count++;
    printf("after decode, %d\n", recv_count);
    show_package(msg_payload->buffer + msg_payload->offset,
        msg_payload->buff_len - msg_payload->offset);
    
}
void ICACHE_FLASH_ATTR
pando_subdevice_recv(uint8_t * buffer, uint16_t length)
{
	if(NULL == buffer)
	{
		return;
	}

	PRINTF("subdevive receive a package: \n");
	show_package(buffer, length);

	struct sub_device_buffer *device_buffer = (struct sub_device_buffer *)pd_malloc(sizeof(struct sub_device_buffer));
	device_buffer->buffer_length = length;
	device_buffer->buffer = (uint8 *)pd_malloc(length);

	pd_memcpy(device_buffer->buffer, buffer, length);

	uint16 payload_type = get_sub_device_payloadtype(device_buffer);

	switch (payload_type) {
	case PAYLOAD_TYPE_DATA:
		decode_data(device_buffer);
		break;
	case PAYLOAD_TYPE_COMMAND:
		decode_command(device_buffer);
		break;
	default:
		PRINTF("unsuported paload type : %d", payload_type);
		break;
	}

	delete_device_package(device_buffer);
}
Esempio n. 3
0
struct pando_buffer * FUNCTION_ATTRIBUTE construct_data_package_to_server(uint16_t *payload_type)
{
	struct pando_buffer *gateway_data_buffer = NULL;
	struct sub_device_buffer *device_data_buffer = NULL;
    uint16_t buf_len = 0;
    
	//构建子设备数据包
	device_data_buffer = construct_sub_device_data();

    buf_len = GATE_HEADER_LEN - DEV_HEADER_LEN + device_data_buffer->buffer_length;    
	gateway_data_buffer = pando_buffer_create(buf_len, GATE_HEADER_LEN - DEV_HEADER_LEN);
    
	if (gateway_data_buffer->buffer == NULL)
	{
		pd_printf("constuct_event_package_to_server malloc failed.\n");
		return NULL;
	}

    printf("len %d, offset %d\n", gateway_data_buffer->buff_len, gateway_data_buffer->offset);
	//复制子设备事件包内容,并释放
	pd_memcpy(
		gateway_data_buffer->buffer + gateway_data_buffer->offset,
		device_data_buffer->buffer, device_data_buffer->buffer_length);
    
	delete_device_package(device_data_buffer);
  
	if (pando_protocol_encode(gateway_data_buffer, payload_type))
	{
		pd_printf("pando_protocol_encode error.\n");
	}

	pando_protocol_set_sub_device_id(gateway_data_buffer, 112);
	show_package(gateway_data_buffer->buffer, gateway_data_buffer->buff_len);
	return gateway_data_buffer;
}
Esempio n. 4
0
/* event exactly the same as command */
void FUNCTION_ATTRIBUTE decode_command(struct pando_buffer *buf, uint16_t payload_type)
{
	// 网关解包
	pando_protocol_decode(buf, payload_type);

    // 网关向子设备传递数据包,如果是向子设备发包,请用对应的设备send函数
    struct sub_device_buffer *device_buffer = pd_malloc(sizeof(struct sub_device_buffer));
    device_buffer->buffer_length = pando_get_package_length(buf);
    device_buffer->buffer = pd_malloc(device_buffer->buffer_length);

 
    // 从网关数据包中获取子设备数据包
    pd_memcpy(device_buffer->buffer, pando_get_package_begin(buf), device_buffer->buffer_length);
 
    // 获取数据完成,释放网关缓冲区
    pando_buffer_delete(buf);




	/* 以下是子设备解析代码 */
	struct pando_command cmd_body;
	// 1.子设备解命令包, 返回参数区的起始位置 
	struct TLVs *cmd_params_block = get_sub_device_command(device_buffer, &cmd_body);
	pd_printf("sub id %02x, cmd num %02x, pri %02x, count: %d\n", 
        cmd_body.sub_device_id, cmd_body.command_num,
        cmd_body.priority, cmd_body.params->count);
	
	// 2.子设备获取命令参数
	uint16_t tlv_length;
    uint8_t *value = pd_malloc(100);

    uint8_t param1 = get_next_uint8(cmd_params_block);
    show_package(&param1, sizeof(param1));
    uint32_t param2 = get_next_uint32(cmd_params_block);
    show_package(&param2, sizeof(param2));
    char *param_bytes = get_next_bytes(cmd_params_block, &tlv_length);
    pd_memcpy(value, param_bytes, tlv_length);
    show_package(value, tlv_length);

    pd_free(value);
	// 3. 删除子设备缓冲区
	delete_device_package(device_buffer);
}
Esempio n. 5
0
// 创建事件包的步骤
// 1. 使用create_params_block添加第一个参数
// 2. add_next_param直到添加完全部参数
// 3. create_event_package创建数据包,并delete_params_block来释放params_block
struct sub_device_buffer * FUNCTION_ATTRIBUTE construct_sub_device_event()
{
	struct sub_device_buffer *event_buffer = NULL;
	struct TLVs *params_block = NULL;

	uint16_t event_num = 0x0911;
    uint16_t flag = 0x0011;
	uint32_t event_param1 = 0xa1b2c3d4;
	uint8_t event_param2 = 0xc1;
	char event_param3[] = "test data";

    event_buffer = create_event_package(flag);
    if (NULL == event_buffer)
	{
		pd_printf("Create event package failed.");
        return NULL;
	}
    
	params_block = create_params_block();

	if (params_block == NULL)
	{
		pd_printf("Create first tlv param failed.\n");
		return NULL;
	}
	
	if (add_next_param(params_block, TLV_TYPE_UINT8, sizeof(event_param2), &event_param2))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}

    if (add_next_param(params_block, TLV_TYPE_UINT32, sizeof(event_param1), &event_param1))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}

	if (add_next_param(params_block, TLV_TYPE_BYTES, sizeof(event_param3), event_param3))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}
	// 3. create event with flag, priority and tlv params
    add_event(event_buffer, event_num, 0, params_block);
	
	delete_params_block(params_block);
    finish_package(event_buffer);
    
	show_package(event_buffer->buffer, event_buffer->buffer_length);
	return event_buffer;
}
/******************************************************************************
 * FunctionName : zero_device_data_process.
 * Description  : process the received data of zero device(zero device is the gateway itself).
 * Parameters   : uint.
 * Returns      : none.
*******************************************************************************/
static void FUNCTION_ATTRIBUTE
zero_device_data_process(uint8_t * buffer, uint16_t length)
{
    struct pando_command cmd_body;
    uint16_t type = 0;
    uint16_t len = 0;
    struct sub_device_buffer * device_buffer = (struct sub_device_buffer *)pd_malloc(sizeof(struct sub_device_buffer));
    if(device_buffer == NULL)
    {
    	pd_printf("%s:malloc error!\n", __func__);
        return;
    }
    device_buffer->buffer = (uint8_t*)pd_malloc(length);
    if(device_buffer->buffer == NULL)
    {
    	pd_printf("%s:malloc error!\n", __func__);
    	pd_free(device_buffer);
        return;
    }
    pd_memcpy(device_buffer->buffer, buffer, length);
    device_buffer->buffer_length = length;
    struct TLVs *cmd_param = get_sub_device_command(device_buffer, &cmd_body);
    if(COMMON_COMMAND_SYN_TIME == cmd_body.command_num )
    {
    	pd_printf("PANDO: synchronize time\n");
        uint64_t time = get_next_uint64(cmd_param);
        show_package((uint8_t*)(&time), sizeof(time));
       // pando_set_system_time(time);
    }

    if( device_buffer->buffer != NULL)
    {
    	pd_free( device_buffer->buffer);
    	device_buffer->buffer = NULL;
    }

    if(device_buffer != NULL)
    {
    	pd_free(device_buffer);
    	device_buffer = NULL;
    }
}
static void ICACHE_FLASH_ATTR
send_current_status()
{
	struct sub_device_buffer* data_buffer;
	data_buffer = create_data_package(0);
	if(NULL == data_buffer)
	{
		PRINTF("create data package error\n");
		return;
	}

	pando_object* obj = NULL;
	pando_objects_iterator* it = create_pando_objects_iterator();
	while(obj = pando_objects_iterator_next(it)){
		PARAMS* params =  create_params_block();
		if (params == NULL)
		{
			PRINTF("Create params block failed.\n");
			return ;
		}
		obj->pack(params);
		int ret = add_next_property(data_buffer, obj->no, params);

		if (ret != 0)
		{
			PRINTF("add_next_property failed.");
		}


		delete_params_block(params);

	}
	delete_pando_objects_iterator(it);

	channel_send_to_device(PANDO_CHANNEL_PORT_1, data_buffer->buffer, data_buffer->buffer_length);
	show_package(data_buffer->buffer, data_buffer->buffer_length);
	delete_device_package(data_buffer);
}
Esempio n. 8
0
/**
  * @brief  Client received callback function.
  * @param  arg: contain the ip link information
  * @param  pdata: received data
  * @param  len: the lenght of received data
  * @retval None
  */
void ICACHE_FLASH_ATTR
mqtt_tcpclient_recv(void *arg, char *pdata, unsigned short len)
{
	INFO("TCP: data received %d bytes\r\n", len);

	uint8_t msg_type;
	uint8_t msg_qos;
	uint16_t msg_id;

	struct espconn *pCon = (struct espconn*)arg;
	MQTT_Client *client = (MQTT_Client *)pCon->reverse;

	if(len > MQTT_BUF_SIZE || len == 0)
	{
		INFO("receive length is invalid.\n");
		return;
	}

	os_memcpy(client->mqtt_state.in_buffer + client->mqtt_state.message_length_read, pdata, len);
	client->mqtt_state.message_length_read += len;

READPACKET:
	if(client->mqtt_state.message_length_read == 1)
	{
		INFO("not enough data for read package length.\n!");
		return;
	}

	client->mqtt_state.message_length = mqtt_get_total_length(client->mqtt_state.in_buffer, client->mqtt_state.message_length_read);
	INFO("message length:%d\n", client->mqtt_state.message_length);

	show_package(client->mqtt_state.in_buffer, client->mqtt_state.message_length_read);

	if(client->mqtt_state.message_length > client->mqtt_state.message_length_read)
	{
		INFO("not enough data.\n");
		return;
	}

	msg_type = mqtt_get_type(client->mqtt_state.in_buffer);
	msg_qos = mqtt_get_qos(client->mqtt_state.in_buffer);
	msg_id = mqtt_get_id(client->mqtt_state.in_buffer, client->mqtt_state.message_length);
	INFO("client->connstate:%d, type:%d, Qos:%d, id:%d, message length:%d\n", client->connState, msg_type, msg_qos, \
			msg_id, client->mqtt_state.message_length);
	switch(client->connState)

	{
		case MQTT_CONNECT_SENDING:
		if(msg_type == MQTT_MSG_TYPE_CONNACK)
		{
			if(client->mqtt_state.pending_msg_type != MQTT_MSG_TYPE_CONNECT)
			{
				INFO("MQTT: Invalid packet\r\n");
				if(client->security)
				{
					espconn_secure_disconnect(client->pCon);
				}
				else
				{
					espconn_disconnect(client->pCon);
				}
			}

			else
			{
				INFO("MQTT: Connected to %s:%d\r\n", client->host, client->port);
				client->connState = MQTT_DATA;
				if(client->connectedCb)
					client->connectedCb((uint32_t*)client);
			}

		}
		break;

		case MQTT_DATA:
		switch(msg_type)
		{
			case MQTT_MSG_TYPE_SUBACK:
			if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_SUBSCRIBE && client->mqtt_state.pending_msg_id == msg_id)
			INFO("MQTT: Subscribe successful\r\n");
			break;

			case MQTT_MSG_TYPE_UNSUBACK:
			if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_UNSUBSCRIBE && client->mqtt_state.pending_msg_id == msg_id)
			INFO("MQTT: UnSubscribe successful\r\n");
			break;

			case MQTT_MSG_TYPE_PUBLISH:
			if(msg_qos == 1)
			client->mqtt_state.outbound_message = mqtt_msg_puback(&client->mqtt_state.mqtt_connection, msg_id);
			else if(msg_qos == 2)
			client->mqtt_state.outbound_message = mqtt_msg_pubrec(&client->mqtt_state.mqtt_connection, msg_id);
			if(msg_qos == 1 || msg_qos == 2)
			{
				INFO("MQTT: Queue response QoS: %d\r\n", msg_qos);
				if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data,\
						client->mqtt_state.outbound_message->length) == -1)
				{
					INFO("MQTT: Queue full\r\n");
				}
			}
			show_package(client->mqtt_state.in_buffer, client->mqtt_state.message_length);
			deliver_publish(client, client->mqtt_state.in_buffer, client->mqtt_state.message_length);
			break;

			case MQTT_MSG_TYPE_PUBACK:
			if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_PUBLISH && client->mqtt_state.pending_msg_id == msg_id)
			{
				INFO("MQTT: received MQTT_MSG_TYPE_PUBACK, finish QoS1 publish\r\n");
			}
			break;

			case MQTT_MSG_TYPE_PUBREC:
			client->mqtt_state.outbound_message = mqtt_msg_pubrel(&client->mqtt_state.mqtt_connection, msg_id);
			if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1)
			{
				INFO("MQTT: Queue full\r\n");
			}
			break;

			case MQTT_MSG_TYPE_PUBREL:
			client->mqtt_state.outbound_message = mqtt_msg_pubcomp(&client->mqtt_state.mqtt_connection, msg_id);
			if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1)
			{
				INFO("MQTT: Queue full\r\n");
			}
			break;

			case MQTT_MSG_TYPE_PUBCOMP:
			if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_PUBLISH && client->mqtt_state.pending_msg_id == msg_id)
			{
				INFO("MQTT: receive MQTT_MSG_TYPE_PUBCOMP, finish QoS2 publish\r\n");
			}
			break;

			case MQTT_MSG_TYPE_PINGREQ:
			client->mqtt_state.outbound_message = mqtt_msg_pingresp(&client->mqtt_state.mqtt_connection);
			if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1)
			{
				INFO("MQTT: Queue full\r\n");
			}
			break;

			case MQTT_MSG_TYPE_PINGRESP:
			INFO("receive a heart beat response!\n");
			client->heart_beat_flag  = 1;
			break;
		}

		break;
	}

	// process package adhesive.
	uint16_t remain_length = client->mqtt_state.message_length_read - client->mqtt_state.message_length;
	client->mqtt_state.message_length_read = remain_length;
	INFO("client->mqtt_state.message_length_read = %d\n", client->mqtt_state.message_length_read);
	INFO("client->mqtt_state.message_length = %d\n", client->mqtt_state.message_length);
	INFO("the package is\n");
	show_package(client->mqtt_state.in_buffer, client->mqtt_state.message_length);
	if(remain_length > 0)
	{
		int i = 0;
		for(i = 0; i< remain_length; i++)
		{
			client->mqtt_state.in_buffer[i] = \
					client->mqtt_state.in_buffer[client->mqtt_state.message_length_read - remain_length + i];
		}

		INFO("Get another published message\r\n");
		goto READPACKET;
	}

	system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client);
}
int8_t module_data_handler(void* data)
{

	uint8_t urc = 0;
	struct module_buf* module_data = (struct module_buf*)data;
	printf("module response:%s\n", module_data->buf);
	show_package(module_data->buf, module_data->length);
	if(module_data->length < 3)
	{
		printf("module response not enough length!");
		if(module_data != NULL)
		{
			if(module_data->buf != NULL)
			{
				free(module_data->buf);
				module_data->buf = NULL;
			}
			free(module_data);
			module_data = NULL;
		}
		return -1;
	}

	if(MODULE_START == s_module_status)
	{
		if((strstr(module_data->buf, "OK")))
		{
			printf("the \"at\" cmd response \"OK\"\n");
			s_module_status = MODULE_SYNC;
		}
	}
	if (MODULE_INIT ==s_module_status|| MODULE_INIT_DONE == s_module_status)
	{
		int i = 0;
		if (NULL != s_current_at_command)
	    {
			for (i = 0; i <sizeof(atCmdTable)/sizeof(atCmdTable[0]); i++)
	        {
				if(!strcmp(s_current_at_command->at_name, atCmdTable[i].name))
	            {

					s_at_status =atCmdTable[i].at_cmd_handle(&urc, module_data->buf);

	                if (ATC_RSP_FINISH ==s_at_status)
	                {
	                	myfree(s_current_at_command);
	                    s_current_at_command = NULL;
	                }

	                break;
	            }
	        }
		}
		else
		{
			if(data_process(module_data) == 1)
			{
				printf("%s\n", __func__);
				show_package(module_data->buf, module_data->length);
				if(tcp_recv_cb != NULL)
				{
					tcp_recv_cb(0, module_data->buf, module_data->length);
				}
			}

			else
			{
				printf("the data is urc\n");
			}

		}
	}

	if(module_data != NULL)
	{
		if(module_data->buf != NULL)
		{
			free(module_data->buf);
			module_data->buf = NULL;
		}
		free(module_data);
		module_data = NULL;
	}

	return 0;
}
Esempio n. 10
0
/**
  * @brief  Client received callback function.
  * @param  arg: contain the ip link information
  * @param  pdata: received data
  * @param  len: the lenght of received data
  * @retval None
  */
void ICACHE_FLASH_ATTR
mqtt_tcpclient_recv(void *arg, char *pdata, unsigned short len)
{
	uint8_t msg_type;
	uint8_t msg_qos;
	uint16_t msg_id;

	struct espconn *pCon = (struct espconn*)arg;
	MQTT_Client *client = (MQTT_Client *)pCon->reverse;

READPACKET:
	INFO("TCP: data received %d bytes:\r\n", len);
	show_package(pdata, len);
	if(len < MQTT_BUF_SIZE && len > 0){
		os_memcpy(client->mqtt_state.in_buffer, pdata, len);

		msg_type = mqtt_get_type(client->mqtt_state.in_buffer);
		msg_qos = mqtt_get_qos(client->mqtt_state.in_buffer);
		msg_id = mqtt_get_id(client->mqtt_state.in_buffer, client->mqtt_state.in_buffer_length);
		PRINTF("client->connstate:%d, type:%d, Qos:%d, id:%d\n", client->connState, msg_type, msg_qos, msg_id);
		switch(client->connState){
		case MQTT_CONNECT_SENDING:
			if(msg_type == MQTT_MSG_TYPE_CONNACK){
				if(client->mqtt_state.pending_msg_type != MQTT_MSG_TYPE_CONNECT){
					INFO("MQTT: Invalid packet\r\n");
					if(client->security){
						espconn_secure_disconnect(client->pCon);
					}
					else {
						espconn_disconnect(client->pCon);
					}
				} else {
					INFO("MQTT: Connected to %s:%d\r\n", client->host, client->port);
					client->connState = MQTT_DATA;
					if(client->connectedCb)
						client->connectedCb((uint32_t*)client);
				}

			}
			break;
		case MQTT_DATA:
			client->mqtt_state.message_length_read = len;
			client->mqtt_state.message_length = mqtt_get_total_length(client->mqtt_state.in_buffer, client->mqtt_state.message_length_read);
			INFO("mqtt actual length:%d\n", client->mqtt_state.message_length);

			switch(msg_type)
			{

			  case MQTT_MSG_TYPE_SUBACK:
				if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_SUBSCRIBE && client->mqtt_state.pending_msg_id == msg_id)
				  INFO("MQTT: Subscribe successful\r\n");
				break;
			  case MQTT_MSG_TYPE_UNSUBACK:
				if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_UNSUBSCRIBE && client->mqtt_state.pending_msg_id == msg_id)
				  INFO("MQTT: UnSubscribe successful\r\n");
				break;
			  case MQTT_MSG_TYPE_PUBLISH:
				if(msg_qos == 1)
					client->mqtt_state.outbound_message = mqtt_msg_puback(&client->mqtt_state.mqtt_connection, msg_id);
				else if(msg_qos == 2)
					client->mqtt_state.outbound_message = mqtt_msg_pubrec(&client->mqtt_state.mqtt_connection, msg_id);
				if(msg_qos == 1 || msg_qos == 2){
					INFO("MQTT: Queue response QoS: %d\r\n", msg_qos);
					if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1){
						INFO("MQTT: Queue full\r\n");
					}
				}

				deliver_publish(client, client->mqtt_state.in_buffer, client->mqtt_state.message_length_read);
				break;
			  case MQTT_MSG_TYPE_PUBACK:
				if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_PUBLISH && client->mqtt_state.pending_msg_id == msg_id){
				  INFO("MQTT: received MQTT_MSG_TYPE_PUBACK, finish QoS1 publish\r\n");
				}

				break;
			  case MQTT_MSG_TYPE_PUBREC:
				  client->mqtt_state.outbound_message = mqtt_msg_pubrel(&client->mqtt_state.mqtt_connection, msg_id);
				  if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1){
				  	INFO("MQTT: Queue full\r\n");
				  }
				break;
			  case MQTT_MSG_TYPE_PUBREL:
				  client->mqtt_state.outbound_message = mqtt_msg_pubcomp(&client->mqtt_state.mqtt_connection, msg_id);
				  if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1){
					INFO("MQTT: Queue full\r\n");
				  }
				break;
			  case MQTT_MSG_TYPE_PUBCOMP:
				if(client->mqtt_state.pending_msg_type == MQTT_MSG_TYPE_PUBLISH && client->mqtt_state.pending_msg_id == msg_id){
				  INFO("MQTT: receive MQTT_MSG_TYPE_PUBCOMP, finish QoS2 publish\r\n");
				}
				break;
			  case MQTT_MSG_TYPE_PINGREQ:
				  client->mqtt_state.outbound_message = mqtt_msg_pingresp(&client->mqtt_state.mqtt_connection);
				  if(QUEUE_Puts(&client->msgQueue, client->mqtt_state.outbound_message->data, client->mqtt_state.outbound_message->length) == -1){
					INFO("MQTT: Queue full\r\n");
				  }
				break;
			  case MQTT_MSG_TYPE_PINGRESP:
				// TODO : the heart beat ack, if not receive heart beat...
				break;
			}
			// NOTE: this is done down here and not in the switch case above
			// because the PSOCK_READBUF_LEN() won't work inside a switch
			// statement due to the way protothreads resume.
			if(msg_type == MQTT_MSG_TYPE_PUBLISH)
			{
			  INFO("PUBLISH MESSAGE,receive length:%d, actual length:%d\n",client->mqtt_state.message_length, client->mqtt_state.message_length_read);
			  len = client->mqtt_state.message_length_read;

			  if(client->mqtt_state.message_length < client->mqtt_state.message_length_read)
			  {
				  INFO("uu3\n");
				  //client->connState = MQTT_PUBLISH_RECV;
				  //Not Implement yet
				  len -= client->mqtt_state.message_length;
				  pdata += client->mqtt_state.message_length;

				  INFO("Get another published message\r\n");
				  goto READPACKET;
			  }

			}
			break;
		}
	} else {
		INFO("ERROR: Message too long\r\n");
	}
	system_os_post(MQTT_TASK_PRIO, 0, (os_param_t)client);
}
Esempio n. 11
0
void FUNCTION_ATTRIBUTE decode_data(struct pando_buffer *buf, uint16_t payload_type)
{
    // 网关解包
	pando_protocol_decode(buf, payload_type);

    
    // 网关向子设备传递数据包,如果是向子设备发包,请用对应的设备send函数
    struct sub_device_buffer *device_buffer = pd_malloc(sizeof(struct sub_device_buffer));
    device_buffer->buffer_length = pando_get_package_length(buf);
    device_buffer->buffer = pd_malloc(device_buffer->buffer_length);

 
    // 从网关数据包中获取子设备数据包
    pd_memcpy(device_buffer->buffer, pando_get_package_begin(buf), device_buffer->buffer_length);

    // 获取数据完成,释放网关缓冲区
    pando_buffer_delete(buf);

    show_package(device_buffer->buffer, device_buffer->buffer_length);

    

    /* 以下是子设备解析代码 */
	struct pando_property data_body;
    uint8_t *buf_end = device_buffer->buffer + device_buffer->buffer_length;
    int i = 0;
    uint16_t tlv_type, tlv_length;
    uint8_t *value = pd_malloc(100);
    struct TLV *param = NULL;
    
	struct TLVs *property_block;
	
	// 2.子设备获取命令参数	
    
    uint32_t param1 = 0;
    uint8_t param2 = 0;
    char *param_bytes = NULL;
	while(1)
	{
        property_block = get_sub_device_property(device_buffer, &data_body);

        if (property_block == NULL)
        {
            pd_printf("reach end of buffer\n");
            break;
        }
        pd_printf("count: %d\n", data_body.params->count);
        
        if (data_body.params->count == 3)
        {
            param1 = get_next_uint32(property_block);
            show_package(&param1, sizeof(param1));
            param2 = get_next_uint8(property_block);
            show_package(&param2, sizeof(param2));
            param_bytes = get_next_bytes(property_block, &tlv_length);
            pd_memcpy(value, param_bytes, tlv_length);
            show_package(value, tlv_length);
        }
        else if (data_body.params->count == 2)
        {
            param2 = get_next_uint8(property_block);
            show_package(&param2, sizeof(param2));
            param_bytes = get_next_bytes(property_block, &tlv_length);
            pd_memcpy(value, param_bytes, tlv_length);
            show_package(value, tlv_length);
        }
    }

    pd_free(value);
	// 3. 删除子设备缓冲区
	delete_device_package(device_buffer);
}
Esempio n. 12
0
struct sub_device_buffer * FUNCTION_ATTRIBUTE construct_sub_device_data()
{
	struct sub_device_buffer *data_buffer = NULL;
	struct TLVs *params_block = NULL;
    int ret = 0;

	uint16_t property_num = 0x1516;
    uint16_t property_num2 = 0x1122;
    uint16_t flag = 0;

	uint32_t data_param1 = 0xa1b2c3d4;
	uint8_t data_param2 = 0xc1;
	char data_param3[] = "test data";


    //create buffer, remember delete
	data_buffer = create_data_package(flag);
	if (data_buffer == NULL)
	{
		pd_printf("Create data package failed.");
	}

    
	params_block = create_params_block();

	if (params_block == NULL)
	{
		pd_printf("Create first tlv param failed.\n");
		return NULL;
	}

    if (add_next_uint32(params_block, data_param1))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}
    
	if (add_next_uint8(params_block, data_param2))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}

    if (add_next_bytes(params_block, strlen(data_param3), data_param3))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}
	
	add_next_property(data_buffer, property_num, params_block);

    // once the params block has been added to data package
    //you must delete it even you are going to add another block to the package
	delete_params_block(params_block);

    //add different property    
    params_block = create_params_block();
    if (params_block == NULL)
	{
		pd_printf("Create first tlv param failed.\n");
		return NULL;
	}
    
	if (add_next_uint8(params_block, data_param2))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}

    if (add_next_bytes(params_block, strlen(data_param3), data_param3))
	{
		delete_params_block(params_block);
		pd_printf("Add next tlv param failed.\n");
		return NULL;
	}

    ret = add_next_property(data_buffer, property_num2, params_block);
    
    if (ret != 0)
    {
        delete_params_block(params_block);
        pd_printf("add_next_property failed.");
        return NULL;
    }

    //do not forget to delete params block again
    delete_params_block(params_block);
    finish_package(data_buffer);
    
    show_package(data_buffer->buffer, data_buffer->buffer_length);
	return data_buffer;
}