static uint8_t prv_write(lwm2m_uri_t * uriP, char * buffer, int length, lwm2m_object_t * objectP) { prv_instance_t * targetP; int64_t value; // for write, instance ID is always set targetP = (prv_instance_t *)lwm2m_list_find(objectP->instanceList, uriP->instanceId); if (NULL == targetP) return COAP_404_NOT_FOUND; if (!LWM2M_URI_IS_SET_INSTANCE(uriP)) return COAP_501_NOT_IMPLEMENTED; switch (uriP->resourceId) { case 1: if (1 == lwm2m_PlainTextToInt64(buffer, length, &value)) { if (value >= 0 && value <= 0xFF) { targetP->test = value; return COAP_204_CHANGED; } } return COAP_400_BAD_REQUEST; default: return COAP_404_NOT_FOUND; } }
static void prv_create_client(char * buffer, void * user_data) { lwm2m_context_t * lwm2mH = (lwm2m_context_t *) user_data; uint16_t clientId; lwm2m_uri_t uri; char * end = NULL; int result; int64_t value; uint8_t temp_buffer[MAX_PACKET_SIZE]; int temp_length = 0; lwm2m_media_type_t format = LWM2M_CONTENT_TEXT; //Get Client ID result = prv_read_id(buffer, &clientId); if (result != 1) goto syntax_error; //Get Uri buffer = get_next_arg(buffer, &end); if (buffer[0] == 0) goto syntax_error; result = lwm2m_stringToUri(buffer, end - buffer, &uri); if (result == 0) goto syntax_error; //Get Data to Post buffer = get_next_arg(end, &end); if (buffer[0] == 0) goto syntax_error; if (!check_end_of_args(end)) goto syntax_error; // TLV /* Client dependent part */ if (uri.objectId == 1024) { result = lwm2m_PlainTextToInt64((uint8_t *)buffer, end - buffer, &value); temp_length = lwm2m_intToTLV(LWM2M_TYPE_RESOURCE, value, (uint16_t) 1, temp_buffer, MAX_PACKET_SIZE); format = LWM2M_CONTENT_TLV; } /* End Client dependent part*/ //Create result = lwm2m_dm_create(lwm2mH, clientId, &uri, format, temp_buffer, temp_length, prv_result_callback, NULL); if (result == 0) { fprintf(stdout, "OK"); } else { prv_print_error(result); } return; syntax_error: fprintf(stdout, "Syntax error !"); }
static int prv_convertRecord(_record_t * recordArray, int count, lwm2m_data_t ** dataP) { int index; int tlvIndex; lwm2m_data_t * tlvP; // may be overkill tlvP = lwm2m_data_new(count); if (NULL == tlvP) return -1; tlvIndex = 0; for (index = 0 ; index < count ; index++) { lwm2m_data_t * targetP; if (recordArray[index].resInstId == LWM2M_MAX_ID) { targetP = tlvP + tlvIndex; targetP->type = LWM2M_TYPE_RESOURCE; targetP->id = recordArray[index].resId; tlvIndex++; } else { int resIndex; resIndex = 0; while (resIndex < tlvIndex && tlvP[resIndex].id != recordArray[index].resId) { resIndex++; } if (resIndex == tlvIndex) { targetP = lwm2m_data_new(1); if (NULL == targetP) goto error; tlvP[resIndex].type = LWM2M_TYPE_MULTIPLE_RESOURCE; tlvP[resIndex].id = recordArray[index].resId; tlvP[resIndex].length = 1; tlvP[resIndex].value = (uint8_t *)targetP; tlvIndex++; } else { targetP = lwm2m_data_new(tlvP[resIndex].length + 1); if (NULL == targetP) goto error; memcpy(targetP + 1, tlvP[resIndex].value, tlvP[resIndex].length * sizeof(lwm2m_data_t)); lwm2m_free(tlvP[resIndex].value); // do not use lwm2m_data_free() to preserve value pointers tlvP[resIndex].value = (uint8_t *)targetP; tlvP[resIndex].length++; } targetP->type = LWM2M_TYPE_RESOURCE_INSTANCE; targetP->id = recordArray[index].resInstId; } switch (recordArray[index].type) { case _TYPE_FALSE: lwm2m_data_encode_bool(false, targetP); break; case _TYPE_TRUE: lwm2m_data_encode_bool(true, targetP); break; case _TYPE_FLOAT: { size_t i; i = 0; while (i < recordArray[index].valueLen && recordArray[index].value[i] != '.') { i++; } if (i == recordArray[index].valueLen) { int64_t value; if ( 1 != lwm2m_PlainTextToInt64(recordArray[index].value, recordArray[index].valueLen, &value)) { goto error; } lwm2m_data_encode_int(value, targetP); } else { double value; if ( 1 != lwm2m_PlainTextToFloat64(recordArray[index].value, recordArray[index].valueLen, &value)) { goto error; } lwm2m_data_encode_float(value, targetP); } } break; // TODO: Copy string instead of pointing to it case _TYPE_STRING: targetP->flags = LWM2M_TLV_FLAG_STATIC_DATA | LWM2M_TLV_FLAG_TEXT_FORMAT; targetP->dataType = LWM2M_TYPE_STRING; // or opaque ? targetP->length = recordArray[index].valueLen; targetP->value = recordArray[index].value; break; case _TYPE_UNSET: default: goto error; } } *dataP = tlvP; return tlvIndex; error: lwm2m_data_free(count, tlvP); return -1; }
int main(int argc, char *argv[]) { int i; char * tests[]={"1", "-114" , "2", "0", "-2", "919293949596979899", "-98979969594939291", "999999999999999999999999999999", "1.2" , "0.134" , "432f.43" , "0.01", "1.00000000000002", NULL}; int64_t ints[]={12, -114 , 1 , 134 , 43243 , 0, -215025, 0xFF}; double floats[]={12, -114 , -30 , 1.02 , 134.000235 , 0.43243 , 0, -21.5025, -0.0925, 0.98765, 0xFF}; printf("lwm2m_PlainTextToInt64():\r\n"); for (i = 0 ; tests[i] != NULL ; i++) { int64_t res; printf("\"%s\" -> ", tests[i]); if (lwm2m_PlainTextToInt64(tests[i], strlen(tests[i]), &res) == 1) { printf("%" PRId64 "\r\n", res); } else { printf ("fail\r\n"); } } printf("\r\n\nlwm2m_PlainTextToFloat64():\r\n"); for (i = 0 ; tests[i] != NULL ; i++) { double res; printf("\"%s\" -> ", tests[i]); if (lwm2m_PlainTextToFloat64(tests[i], strlen(tests[i]), &res) == 1) { int j; printf("%.16g\r\n", res); } else { printf ("fail\r\n"); } } printf("\r\n\nlwm2m_int64ToPlainText():\r\n"); for (i = 0 ; ints[i] != 0xFF; i++) { char * res; int len; printf("%d -> ", ints[i]); len = lwm2m_int64ToPlainText(ints[i], &res); if (len > 0) { int j; printf("\""); for (j = 0 ; j < len ; j++) printf("%c", res[j]); printf("\" (%d chars)\r\n", len); lwm2m_free(res); } else { printf ("fail\r\n"); } } printf("\r\n\nlwm2m_float64ToPlainText():\r\n"); for (i = 0 ; floats[i] != 0xFF; i++) { char * res; int len; printf("%.16g -> ", floats[i]); len = lwm2m_float64ToPlainText(floats[i], &res); if (len > 0) { int j; printf("\""); for (j = 0 ; j < len ; j++) printf("%c", res[j]); printf("\" (%d chars)\r\n", len); lwm2m_free(res); } else { printf ("fail\r\n"); } } }