void output_data(FILE * stream, lwm2m_media_type_t format, uint8_t * data, int dataLength, int indent) { int i; if (data == NULL) return; print_indent(stream, indent); fprintf(stream, "%d bytes received of type ", dataLength); switch (format) { case LWM2M_CONTENT_TEXT: fprintf(stream, "text/plain:\r\n"); output_buffer(stream, data, dataLength, indent); break; case LWM2M_CONTENT_OPAQUE: fprintf(stream, "application/octet-stream:\r\n"); output_buffer(stream, data, dataLength, indent); break; case LWM2M_CONTENT_TLV: fprintf(stream, "application/vnd.oma.lwm2m+tlv:\r\n"); output_tlv(stream, data, dataLength, indent); break; case LWM2M_CONTENT_JSON: fprintf(stream, "application/vnd.oma.lwm2m+json:\r\n"); print_indent(stream, indent); for (i = 0 ; i < dataLength ; i++) { fprintf(stream, "%c", data[i]); } fprintf(stream, "\n"); break; case LWM2M_CONTENT_LINK: fprintf(stream, "application/link-format:\r\n"); print_indent(stream, indent); for (i = 0 ; i < dataLength ; i++) { fprintf(stream, "%c", data[i]); } fprintf(stream, "\n"); break; default: fprintf(stream, "Unknown (%d):\r\n", format); output_buffer(stream, data, dataLength, indent); break; } }
static void output_tlv(uint8_t * buffer, size_t buffer_len, int indent) { lwm2m_tlv_type_t type; uint16_t id; size_t dataIndex; size_t dataLen; int length = 0; int result; while (0 != (result = lwm2m_decodeTLV((uint8_t*)buffer + length, buffer_len - length, &type, &id, &dataIndex, &dataLen))) { print_indent(indent); fprintf(stdout, "ID: %d", id); fprintf(stdout, " type: "); switch (type) { case LWM2M_TYPE_OBJECT_INSTANCE: fprintf(stdout, "Object Instance"); break; case LWM2M_TYPE_RESOURCE_INSTANCE: fprintf(stdout, "Resource Instance"); break; case LWM2M_TYPE_MULTIPLE_RESOURCE: fprintf(stdout, "Multiple Instances"); break; case LWM2M_TYPE_RESOURCE: fprintf(stdout, "Resource"); break; default: printf("unknown (%d)", (int)type); break; } fprintf(stdout, "\n"); print_indent(indent); fprintf(stdout, "{\n"); if (type == LWM2M_TYPE_OBJECT_INSTANCE || type == LWM2M_TYPE_MULTIPLE_RESOURCE) { output_tlv(buffer + length + dataIndex, dataLen, indent+2); } else { int64_t intValue; double floatValue; print_indent(indent+2); fprintf(stdout, "data (%ld bytes): ", dataLen); if (dataLen >= 16) fprintf(stdout, "\n"); output_buffer(stdout, (uint8_t*)buffer + length + dataIndex, dataLen); if (0 < lwm2m_opaqueToInt(buffer + length + dataIndex, dataLen, &intValue)) { print_indent(indent+2); fprintf(stdout, "data as Integer: %" PRId64 "\r\n", intValue); } if (0 < lwm2m_opaqueToFloat(buffer + length + dataIndex, dataLen, &floatValue)) { print_indent(indent+2); fprintf(stdout, "data as Float: %.16g\r\n", floatValue); } } print_indent(indent); fprintf(stdout, "}\n"); length += result; } }
void output_tlv(FILE * stream, uint8_t * buffer, size_t buffer_len, int indent) { lwm2m_data_type_t type; uint16_t id; size_t dataIndex; size_t dataLen; int length = 0; int result; while (0 != (result = lwm2m_decode_TLV((uint8_t*)buffer + length, buffer_len - length, &type, &id, &dataIndex, &dataLen))) { print_indent(stream, indent); fprintf(stream, "{\r\n"); print_indent(stream, indent+1); fprintf(stream, "ID: %d", id); fprintf(stream, " type: "); switch (type) { case LWM2M_TYPE_OBJECT_INSTANCE: fprintf(stream, "Object Instance"); break; case LWM2M_TYPE_MULTIPLE_RESOURCE: fprintf(stream, "Multiple Instances"); break; case LWM2M_TYPE_OPAQUE: fprintf(stream, "Resource Value"); break; default: printf("unknown (%d)", (int)type); break; } fprintf(stream, "\n"); print_indent(stream, indent+1); fprintf(stream, "{\n"); if (type == LWM2M_TYPE_OBJECT_INSTANCE || type == LWM2M_TYPE_MULTIPLE_RESOURCE) { output_tlv(stream, buffer + length + dataIndex, dataLen, indent+1); } else { int64_t intValue; double floatValue; uint8_t tmp; print_indent(stream, indent+2); fprintf(stream, "data (%ld bytes):\r\n", dataLen); output_buffer(stream, (uint8_t*)buffer + length + dataIndex, dataLen, indent+2); tmp = buffer[length + dataIndex + dataLen]; buffer[length + dataIndex + dataLen] = 0; if (0 < sscanf(buffer + length + dataIndex, "%"PRId64, &intValue)) { print_indent(stream, indent+2); fprintf(stream, "data as Integer: %" PRId64 "\r\n", intValue); } if (0 < sscanf(buffer + length + dataIndex, "%g", &floatValue)) { print_indent(stream, indent+2); fprintf(stream, "data as Float: %.16g\r\n", floatValue); } buffer[length + dataIndex + dataLen] = tmp; } print_indent(stream, indent+1); fprintf(stream, "}\r\n"); length += result; print_indent(stream, indent); fprintf(stream, "}\r\n"); } }