コード例 #1
0
static void ICACHE_FLASH_ATTR
decode_data(struct sub_device_buffer *device_buffer)
{
	struct pando_property data_body;
	uint8_t *buf_end = device_buffer->buffer + device_buffer->buffer_length;
	uint16_t tlv_type, tlv_length;
	uint8_t *value = NULL;

	PARAMS *object_param = NULL;
	while(object_param = get_sub_device_property(device_buffer, &data_body)){
		pando_object* obj = find_pando_object(data_body.property_num);
		if( NULL == obj )
		{
			PRINTF("object [%d] not found in list\n", data_body.property_num);
		}

		obj->unpack(object_param);
	}

}
コード例 #2
0
ファイル: stdoutsub.c プロジェクト: DenisZheng/pando-protocol
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);
}