Handling Resources from a device application
This chapter describes how Device Management Client and the REST API process the different data types. It covers:
- How to pass the different data types to the API.
- How the API receives the data, and how it converts the data into the right type.
Passing data types to Device Management Client
You pass data from Device Management Client to Device Management Connect. The Device Management Client is based on the CoAP client, so the Resource values are always plain text. You must therefore convert different data type values into a plain text value. There can be used available setters, which take care of conversion. It is also possible to use setter for string value for every data type when value must be in plain text format. For example, an integer value 100
is passed in a text buffer format of 100
, and it appears on the web service side as 100
in text format. The service must then interpret this data back to its appropriate format.
Note: The Device Management Client message resending queue sn-coap-resending-queue-size-msgs
is by default only two messages long. The queue can fill up if your application sends more than two messages before the server has acknowledged the first message, which can happen in slow networks or if the messages are sent in quick succession (less than one second). You will need to define a longer queue to overcome this. More information is available in the Mbed Client API documentation.
Generic format
The generic format for passing a value is:
M2MResource* instance = object_instance->create_dynamic_resource(“5700", “IntegerType“, M2MResourceInstance::<DATA_TYPE>, true);
Passing an integer value
Integer (from the device application):
int value = 1;
M2MResource* instance = object_instance->create_dynamic_resource(“5700", “IntegerType“, M2MResourceInstance::INTEGER, true);
instance->set_value(value);
Response on the REST API:
{"async-response-id":...{ "id" : "1131895768#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/3303/0/5700", "status" : 200, "payload" : "MQ==", "ct" : "text/plain", "max-age" : 300 }
- Base64 encoded value of the payload ->
MQ==
- Base64 decoded value of the payload ->
1
Passing a float value
Float (from the device application):
float value = 1.0232f;
M2MResource* instance = object_instance->create_dynamic_resource(“5700", “IntegerType“, M2MResourceInstance::FLOAT, true);
instance->set_value_float(value);
Response on the REST API:
{"async-response-id":...{ "id" : "1132945328#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/3303/0/5700", "status" : 200, "payload" : "MS4wMjMyMDA=",
"ct" : "text/plain", "max-age" : 300 }
- Base64 encoded value of the payload ->
MS4wMjMyMDA=
- Base64 decoded value of the payload ->
1.023200
Passing a boolean value
Boolean (from the device application):
bool value = true;
M2MResource* instance = object_instance->create_dynamic_resource(“5700", “IntegerType“, M2MResourceInstance::BOOLEAN, true);
instance->set_value(value);
Response on the REST API:
{"async-response-id":….{ "id" : "1131895768#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/3303/0/5700", "status" : 200, "payload" : "MQ==", "ct" : "text/plain", "max-age" : 300 }
- Base64 encoded value of the payload ->
MQ==
- Base64 decoded value of the payload ->
1
Passing a string value
String (from the device application):
M2MResource* instance = object_instance->create_dynamic_resource(“5700", “IntegerType“, M2MResourceInstance::STRING, true);
char buffer[10] = “Test Data”;
instance->set_value((const uint8_t*)buffer, 10);
Response on the REST API:
{"async-response-id":... { "id" : "1133335779#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/3303/0/5700", "status" : 200, "payload" : "VGVzdCBEYXRh",
"ct" : "text/plain", "max-age" : 300 }
- Base64 encoded value of the payload ->
VGVzdCBEYXRh
- Base64 decoded value of the payload ->
Test Data
Passing an opaque value
Opaque (from the device application):
M2MResource* instance = object_instance->create_dynamic_resource(“5700", “IntegerType“, M2MResourceInstance::OPAQUE, true);
uint8_t buffer[12] = “Opaque Data”;
instance->set_value(buffer, 12);
Response on the REST API:
{"async-response-id":... { "id" : "1134045351#f4b93d6e-4652-4874-82e4-41a3ced0cd56@b02ac40a-a501-44d9-be29-e6e0e5303f85/3303/0/5700", "status" : 200, "payload" : "T3BhcXVlIERhdGEA",
"ct" : "application/octet-stream", "max-age" : 300 }
- Base64 encoded value of the payload ->
T3BhcXVlIERhdGEA
- Base64 decoded value of the payload ->
Opaque Data
Working with the server cache
If you store a Resource value in the server cache and it is still valid:
- GET /v2/endpoints/{device-id}/{resourcePath} returns the cached value in plain text format in the response body to the
HTTP GET
request. - POST /v2/device-requests/{device-id} with
GET
command defined in the body, returns the cached value as an event through the notification channel inJSON
format with Base64 encode.
To store the value of the Resource in the server cache, set the Resource's lifetime as the max_age
parameter. Subsequent requests to the same Resource receive the response directly from the cache:
instance->set_max_age(300) ; // This is the resource lifetime in the server cache (in seconds).
For more information about the cache, see the optimization section.