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); } }
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(¶m1, sizeof(param1)); param2 = get_next_uint8(property_block); show_package(¶m2, 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(¶m2, 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); }