/** implementation for all read-able resources */ static uint8_t prv_res2tlv(lwm2m_tlv_t* tlvP, location_data_t* locDataP) { //-------------------------------------------------------------------- JH -- uint8_t ret = COAP_205_CONTENT; switch (tlvP->id) // location resourceId { case RES_M_LATITUDE: tlvP->value = (uint8_t*)locDataP->latitude; tlvP->length = strlen(locDataP->latitude); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESOURCE; tlvP->dataType = LWM2M_TYPE_STRING; break; case RES_M_LONGITUDE: tlvP->value = (uint8_t*)locDataP->longitude; tlvP->length = strlen(locDataP->latitude); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESOURCE; tlvP->dataType = LWM2M_TYPE_STRING; break; case RES_O_ALTITUDE: tlvP->value = (uint8_t*)locDataP->altitude; tlvP->length = strlen(locDataP->altitude); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESOURCE; tlvP->dataType = LWM2M_TYPE_STRING; break; case RES_O_UNCERTAINTY: tlvP->value = (uint8_t*)locDataP->uncertainty; tlvP->length = strlen(locDataP->uncertainty); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESOURCE; tlvP->dataType = LWM2M_TYPE_STRING; break; case RES_O_VELOCITY: tlvP->value = locDataP->velocity; tlvP->length = VELOCITY_OCTETS; tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESOURCE; tlvP->dataType = LWM2M_TYPE_OPAQUE; break; case RES_M_TIMESTAMP: lwm2m_tlv_encode_int(locDataP->timestamp, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; tlvP->dataType = LWM2M_TYPE_TIME; break; default: ret = COAP_404_NOT_FOUND; break; } return ret; }
static uint8_t prv_get_value(lwm2m_tlv_t * tlvP, server_instance_t * targetP) { // There are no multiple instance resources tlvP->type = LWM2M_TYPE_RESOURCE; switch (tlvP->id) { case LWM2M_SERVER_SHORT_ID_ID: lwm2m_tlv_encode_int(targetP->shortServerId, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SERVER_LIFETIME_ID: lwm2m_tlv_encode_int(targetP->lifetime, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SERVER_DISABLE_ID: return COAP_405_METHOD_NOT_ALLOWED; case LWM2M_SERVER_STORING_ID: lwm2m_tlv_encode_bool(targetP->storing, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SERVER_BINDING_ID: tlvP->value = (uint8_t*)targetP->binding; tlvP->length = strlen(targetP->binding); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_STRING; return COAP_205_CONTENT; case LWM2M_SERVER_UPDATE_ID: return COAP_405_METHOD_NOT_ALLOWED; default: return COAP_404_NOT_FOUND; } }
static uint8_t prv_get_value(lwm2m_tlv_t * tlvP, security_instance_t * targetP) { // There are no multiple instance ressources tlvP->type = LWM2M_TYPE_RESOURCE; switch (tlvP->id) { case LWM2M_SECURITY_URI_ID: tlvP->value = (uint8_t*)targetP->uri; tlvP->length = strlen(targetP->uri); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_STRING; return COAP_205_CONTENT; case LWM2M_SECURITY_BOOTSTRAP_ID: lwm2m_tlv_encode_bool(targetP->isBootstrap, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SECURITY_SECURITY_ID: lwm2m_tlv_encode_int(LWM2M_SECURITY_MODE_NONE, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SECURITY_PUBLIC_KEY_ID: // Here we return an opaque of 1 byte containing 0 tlvP->value = (uint8_t*)""; tlvP->length = 1; tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_OPAQUE; return COAP_205_CONTENT; case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID: // Here we return an opaque of 1 byte containing 0 tlvP->value = (uint8_t*)""; tlvP->length = 1; tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_OPAQUE; return COAP_205_CONTENT; case LWM2M_SECURITY_SECRET_KEY_ID: // Here we return an opaque of 1 byte containing 0 tlvP->value = (uint8_t*)""; tlvP->length = 1; tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_OPAQUE; return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECURITY_ID: lwm2m_tlv_encode_int(LWM2M_SECURITY_MODE_NONE, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SECURITY_SMS_KEY_PARAM_ID: // Here we return an opaque of 6 bytes containing a buggy value tlvP->value = (uint8_t*)"12345"; tlvP->length = 6; tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_OPAQUE; return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECRET_KEY_ID: // Here we return an opaque of 32 bytes containing a buggy value tlvP->value = (uint8_t*)"1234567890abcdefghijklmnopqrstu"; tlvP->length = 32; tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->dataType = LWM2M_TYPE_OPAQUE; return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID: lwm2m_tlv_encode_int(0, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SECURITY_SHORT_SERVER_ID: lwm2m_tlv_encode_int(targetP->shortID, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case LWM2M_SECURITY_HOLD_OFF_ID: lwm2m_tlv_encode_int(targetP->clientHoldOffTime, tlvP); if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; default: return COAP_404_NOT_FOUND; } }
static uint8_t prv_set_value(lwm2m_tlv_t * tlvP, device_data_t * devDataP) { // a simple switch structure is used to respond at the specified resource asked switch (tlvP->id) { case 0: tlvP->value = PRV_MANUFACTURER; tlvP->length = strlen(PRV_MANUFACTURER); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; return COAP_205_CONTENT; case 1: tlvP->value = PRV_MODEL_NUMBER; tlvP->length = strlen(PRV_MODEL_NUMBER); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; return COAP_205_CONTENT; case 2: tlvP->value = PRV_SERIAL_NUMBER; tlvP->length = strlen(PRV_SERIAL_NUMBER); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; return COAP_205_CONTENT; case 3: tlvP->value = PRV_FIRMWARE_VERSION; tlvP->length = strlen(PRV_FIRMWARE_VERSION); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; return COAP_205_CONTENT; case 4: return COAP_405_METHOD_NOT_ALLOWED; case 5: return COAP_405_METHOD_NOT_ALLOWED; case 6: { lwm2m_tlv_t * subTlvP; subTlvP = lwm2m_tlv_new(2); subTlvP[0].flags = 0; subTlvP[0].id = 0; subTlvP[0].type = LWM2M_TYPE_RESSOURCE_INSTANCE; lwm2m_tlv_encode_int(PRV_POWER_SOURCE_1, subTlvP); if (0 == subTlvP[0].length) { lwm2m_tlv_free(2, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR; } subTlvP[1].flags = 0; subTlvP[1].id = 1; subTlvP[1].type = LWM2M_TYPE_RESSOURCE_INSTANCE; lwm2m_tlv_encode_int(PRV_POWER_SOURCE_2, subTlvP + 1); if (0 == subTlvP[1].length) { lwm2m_tlv_free(2, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR; } tlvP->flags = 0; tlvP->type = LWM2M_TYPE_MULTIPLE_RESSOURCE; tlvP->length = 2; tlvP->value = (uint8_t *)subTlvP; return COAP_205_CONTENT; } case 7: { lwm2m_tlv_t * subTlvP; subTlvP = lwm2m_tlv_new(2); subTlvP[0].flags = 0; subTlvP[0].id = 0; subTlvP[0].type = LWM2M_TYPE_RESSOURCE_INSTANCE; lwm2m_tlv_encode_int(PRV_POWER_VOLTAGE_1, subTlvP); if (0 == subTlvP[0].length) { lwm2m_tlv_free(2, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR; } subTlvP[1].flags = 0; subTlvP[1].id = 1; subTlvP[1].type = LWM2M_TYPE_RESSOURCE_INSTANCE; lwm2m_tlv_encode_int(PRV_POWER_VOLTAGE_2, subTlvP + 1); if (0 == subTlvP[1].length) { lwm2m_tlv_free(2, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR; } tlvP->flags = 0; tlvP->type = LWM2M_TYPE_MULTIPLE_RESSOURCE; tlvP->length = 2; tlvP->value = (uint8_t *)subTlvP; return COAP_205_CONTENT; } case 8: { lwm2m_tlv_t * subTlvP; subTlvP = lwm2m_tlv_new(2); subTlvP[0].flags = 0; subTlvP[0].id = 0; subTlvP[0].type = LWM2M_TYPE_RESSOURCE_INSTANCE; lwm2m_tlv_encode_int(PRV_POWER_CURRENT_1, subTlvP); if (0 == subTlvP[0].length) { lwm2m_tlv_free(2, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR; } subTlvP[1].flags = 0; subTlvP[1].id = 1; subTlvP[1].type = LWM2M_TYPE_RESSOURCE_INSTANCE; lwm2m_tlv_encode_int(PRV_POWER_CURRENT_2, subTlvP + 1); if (0 == subTlvP[1].length) { lwm2m_tlv_free(2, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR; } tlvP->flags = 0; tlvP->type = LWM2M_TYPE_MULTIPLE_RESSOURCE; tlvP->length = 2; tlvP->value = (uint8_t *)subTlvP; return COAP_205_CONTENT; } case 9: lwm2m_tlv_encode_int(PRV_BATTERY_LEVEL, tlvP); tlvP->type = LWM2M_TYPE_RESSOURCE; if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case 10: lwm2m_tlv_encode_int(PRV_MEMORY_FREE, tlvP); tlvP->type = LWM2M_TYPE_RESSOURCE; if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case 11: lwm2m_tlv_encode_int(PRV_ERROR_CODE, tlvP); tlvP->type = LWM2M_TYPE_RESSOURCE; if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case 12: return COAP_405_METHOD_NOT_ALLOWED; case 13: lwm2m_tlv_encode_int(devDataP->time, tlvP); tlvP->type = LWM2M_TYPE_RESSOURCE; if (0 != tlvP->length) return COAP_205_CONTENT; else return COAP_500_INTERNAL_SERVER_ERROR; case 14: tlvP->value = devDataP->time_offset; tlvP->length = strlen(devDataP->time_offset); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; return COAP_205_CONTENT; case 15: tlvP->value = PRV_BINDING_MODE; tlvP->length = strlen(PRV_BINDING_MODE); tlvP->flags = LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; return COAP_205_CONTENT; default: return COAP_404_NOT_FOUND; } }
static uint8_t prv_firmware_read(uint16_t instanceId, int * numDataP, lwm2m_tlv_t ** dataArrayP, lwm2m_object_t * objectP) { int i; uint8_t result; firmware_data_t * data = (firmware_data_t*)(objectP->userData); // this is a single instance object if (instanceId != 0) { return COAP_404_NOT_FOUND; } // is the server asking for the full object ? if (*numDataP == 0) { *dataArrayP = lwm2m_tlv_new(3); if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; *numDataP = 3; (*dataArrayP)[0].id = 3; (*dataArrayP)[1].id = 4; (*dataArrayP)[2].id = 5; } i = 0; do { switch ((*dataArrayP)[i].id) { case 0: case 1: case 2: result = COAP_405_METHOD_NOT_ALLOWED; break; case 3: // firmware update state (int) lwm2m_tlv_encode_int(data->state, *dataArrayP + i); (*dataArrayP)[i].type = LWM2M_TYPE_RESSOURCE; if (0 != (*dataArrayP)[i].length) result = COAP_205_CONTENT; else result = COAP_500_INTERNAL_SERVER_ERROR; break; case 4: lwm2m_tlv_encode_int(data->supported, *dataArrayP + i); (*dataArrayP)[i].type = LWM2M_TYPE_RESSOURCE; if (0 != (*dataArrayP)[i].length) result = COAP_205_CONTENT; else result = COAP_500_INTERNAL_SERVER_ERROR; break; case 5: lwm2m_tlv_encode_int(data->result, *dataArrayP + i); (*dataArrayP)[i].type = LWM2M_TYPE_RESSOURCE; if (0 != (*dataArrayP)[i].length) result = COAP_205_CONTENT; else result = COAP_500_INTERNAL_SERVER_ERROR; break; default: result = COAP_404_NOT_FOUND; } i++; } while (i < *numDataP && result == COAP_205_CONTENT); return result; }
static uint8_t prv_set_value(lwm2m_tlv_t * tlvP, conn_m_data_t * connDataP) { switch (tlvP->id) { case RES_M_NETWORK_BEARER: lwm2m_tlv_encode_int(VALUE_NETWORK_BEARER_GSM, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; case RES_M_AVL_NETWORK_BEARER: { int riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_tlv_t * subTlvP; subTlvP = lwm2m_tlv_new(riCnt); subTlvP[0].flags = 0; subTlvP[0].id = 0; subTlvP[0].type = LWM2M_TYPE_RESOURCE_INSTANCE; lwm2m_tlv_encode_int(VALUE_AVL_NETWORK_BEARER_1, subTlvP); if (0 == subTlvP[0].length) { lwm2m_tlv_free(riCnt, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR ; } lwm2m_tlv_include(subTlvP, riCnt, tlvP); return COAP_205_CONTENT ; } break; case RES_M_RADIO_SIGNAL_STRENGTH: //s-int lwm2m_tlv_encode_int(connDataP->signalStrength, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; case RES_O_LINK_QUALITY: //s-int lwm2m_tlv_encode_int(connDataP->linkQuality, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; case RES_M_IP_ADDRESSES: { int ri, riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_tlv_t* subTlvP = lwm2m_tlv_new(riCnt); for (ri=0; ri<riCnt; ri++) { subTlvP[ri].flags = LWM2M_TLV_FLAG_STATIC_DATA; subTlvP[ri].id = 0; subTlvP[ri].type = LWM2M_TYPE_RESOURCE_INSTANCE; subTlvP[ri].dataType = LWM2M_TYPE_STRING; subTlvP[ri].value = (uint8_t*) connDataP->ipAddresses[ri]; subTlvP[ri].length = strlen(connDataP->ipAddresses[ri]); if (subTlvP[ri].length == 0) { lwm2m_tlv_free(riCnt, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR ; } } lwm2m_tlv_include(subTlvP, riCnt, tlvP); return COAP_205_CONTENT ; } break; case RES_O_ROUTER_IP_ADDRESS: { int ri, riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_tlv_t* subTlvP = lwm2m_tlv_new(riCnt); for (ri=0; ri<riCnt; ri++) { subTlvP[ri].flags = LWM2M_TLV_FLAG_STATIC_DATA; subTlvP[ri].id = 0; subTlvP[ri].type = LWM2M_TYPE_RESOURCE_INSTANCE; subTlvP[ri].dataType = LWM2M_TYPE_STRING; subTlvP[ri].value = (uint8_t*) connDataP->routerIpAddresses[ri]; subTlvP[ri].length = strlen(connDataP->routerIpAddresses[ri]); if (subTlvP[ri].length == 0) { lwm2m_tlv_free(riCnt, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR ; } } lwm2m_tlv_include(subTlvP, riCnt, tlvP); return COAP_205_CONTENT ; } break; case RES_O_LINK_UTILIZATION: lwm2m_tlv_encode_int(connDataP->linkUtilization, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; case RES_O_APN: { int riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_tlv_t * subTlvP; subTlvP = lwm2m_tlv_new(riCnt); subTlvP[0].flags = LWM2M_TLV_FLAG_STATIC_DATA; subTlvP[0].id = 0; subTlvP[0].type = LWM2M_TYPE_RESOURCE_INSTANCE; subTlvP[0].dataType = LWM2M_TYPE_STRING; subTlvP[0].value = (uint8_t*) VALUE_APN_1; subTlvP[0].length = strlen(VALUE_APN_1); if (0 == subTlvP[0].length) { lwm2m_tlv_free(riCnt, subTlvP); return COAP_500_INTERNAL_SERVER_ERROR ; } lwm2m_tlv_include(subTlvP, riCnt, tlvP); return COAP_205_CONTENT; } break; case RES_O_CELL_ID: lwm2m_tlv_encode_int(connDataP->cellId, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; case RES_O_SMNC: lwm2m_tlv_encode_int(VALUE_SMNC, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; case RES_O_SMCC: lwm2m_tlv_encode_int(VALUE_SMCC, tlvP); tlvP->type = LWM2M_TYPE_RESOURCE; if (0 != tlvP->length) return COAP_205_CONTENT ; else return COAP_500_INTERNAL_SERVER_ERROR ; break; default: return COAP_404_NOT_FOUND ; } }