/** implementation for all read-able resources */ static uint8_t prv_res2tlv(lwm2m_data_t* dataP, location_data_t* locDataP) { //-------------------------------------------------------------------- JH -- uint8_t ret = COAP_205_CONTENT; switch (dataP->id) // location resourceId { case RES_M_LATITUDE: lwm2m_data_encode_float(locDataP->latitude, dataP); break; case RES_M_LONGITUDE: lwm2m_data_encode_float(locDataP->longitude, dataP); break; case RES_O_ALTITUDE: lwm2m_data_encode_float(locDataP->altitude, dataP); break; case RES_O_RADIUS: lwm2m_data_encode_float(locDataP->radius, dataP); break; case RES_O_VELOCITY: lwm2m_data_encode_string((const char*)locDataP->velocity, dataP); break; case RES_M_TIMESTAMP: lwm2m_data_encode_int(locDataP->timestamp, dataP); break; case RES_O_SPEED: lwm2m_data_encode_float(locDataP->speed, dataP); break; default: ret = COAP_404_NOT_FOUND; break; } return ret; }
static uint8_t prv_get_value(lwm2m_data_t * dataP, security_instance_t * targetP) { switch (dataP->id) { case LWM2M_SECURITY_URI_ID: lwm2m_data_encode_string(targetP->uri, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_BOOTSTRAP_ID: lwm2m_data_encode_bool(targetP->isBootstrap, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SECURITY_ID: lwm2m_data_encode_int(targetP->securityMode, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_PUBLIC_KEY_ID: lwm2m_data_encode_opaque(targetP->publicIdentity, targetP->publicIdLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID: lwm2m_data_encode_opaque(targetP->serverPublicKey, targetP->serverPublicKeyLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SECRET_KEY_ID: lwm2m_data_encode_opaque(targetP->secretKey, targetP->secretKeyLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECURITY_ID: lwm2m_data_encode_int(targetP->smsSecurityMode, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_KEY_PARAM_ID: lwm2m_data_encode_opaque(targetP->smsParams, targetP->smsParamsLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECRET_KEY_ID: lwm2m_data_encode_opaque(targetP->smsSecret, targetP->smsSecretLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID: lwm2m_data_encode_int(0, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SHORT_SERVER_ID: lwm2m_data_encode_int(targetP->shortID, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_HOLD_OFF_ID: lwm2m_data_encode_int(targetP->clientHoldOffTime, dataP); return COAP_205_CONTENT; default: return COAP_404_NOT_FOUND; } }
static int prv_add_server(bs_info_t * infoP, read_server_t * dataP) { lwm2m_data_t * tlvP; int size; bs_server_tlv_t * serverP; lwm2m_media_type_t format; switch (dataP->securityMode) { case LWM2M_SECURITY_MODE_NONE: size = 4; break; case LWM2M_SECURITY_MODE_PRE_SHARED_KEY: size = 6; break; case LWM2M_SECURITY_MODE_RAW_PUBLIC_KEY: case LWM2M_SECURITY_MODE_CERTIFICATE: size = 7; break; default: return -1; } serverP = (bs_server_tlv_t *)lwm2m_malloc(sizeof(bs_server_tlv_t)); if (serverP == NULL) return -1; memset(serverP, 0, sizeof(bs_server_tlv_t)); serverP->id = dataP->id; tlvP = lwm2m_data_new(size); if (tlvP == NULL) goto error; // LWM2M Server URI tlvP[0].id = LWM2M_SECURITY_URI_ID; lwm2m_data_encode_string(dataP->uri, tlvP); // Bootstrap Server tlvP[1].id = LWM2M_SECURITY_BOOTSTRAP_ID; lwm2m_data_encode_bool(dataP->isBootstrap, tlvP + 1); // Short Server ID tlvP[2].id = LWM2M_SECURITY_SHORT_SERVER_ID; lwm2m_data_encode_int(dataP->id, tlvP + 2); // Security Mode tlvP[3].id = LWM2M_SECURITY_SECURITY_ID; lwm2m_data_encode_int(dataP->securityMode, tlvP + 3); if (size > 4) { tlvP[4].id = LWM2M_SECURITY_PUBLIC_KEY_ID; lwm2m_data_encode_opaque(dataP->publicKey, dataP->publicKeyLen, tlvP + 4); tlvP[5].id = LWM2M_SECURITY_SECRET_KEY_ID; lwm2m_data_encode_opaque(dataP->secretKey, dataP->secretKeyLen, tlvP + 5); if (size == 7) { tlvP[6].id = LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID; lwm2m_data_encode_opaque(dataP->serverKey, dataP->serverKeyLen, tlvP + 5); } } format = LWM2M_CONTENT_TLV; serverP->securityLen = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->securityData)); if (serverP->securityLen <= 0) goto error; lwm2m_data_free(size, tlvP); if (dataP->isBootstrap == false) { size = 4; tlvP = lwm2m_data_new(size); if (tlvP == NULL) goto error; // Short Server ID tlvP[0].id = LWM2M_SERVER_SHORT_ID_ID; lwm2m_data_encode_int(dataP->id, tlvP); // Lifetime tlvP[1].id = LWM2M_SERVER_LIFETIME_ID; lwm2m_data_encode_int(dataP->lifetime, tlvP + 1); // Notification Storing tlvP[2].id = LWM2M_SERVER_STORING_ID; lwm2m_data_encode_bool(false, tlvP + 2); // Binding tlvP[3].id = LWM2M_SERVER_BINDING_ID; lwm2m_data_encode_string("U", tlvP + 3); serverP->serverLen = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->serverData)); if (serverP->serverLen <= 0) goto error; lwm2m_data_free(size, tlvP); } infoP->serverList = (bs_server_tlv_t *)LWM2M_LIST_ADD(infoP->serverList, serverP); return 0; error: if (tlvP != NULL) lwm2m_data_free(size, tlvP); if (serverP->securityData != NULL) lwm2m_free(serverP->securityData); if (serverP->serverData != NULL) lwm2m_free(serverP->serverData); lwm2m_free(serverP); return -1; }
static uint8_t prv_firmware_read(uint16_t instanceId, int * numDataP, lwm2m_data_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_data_new(3); if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; *numDataP = 6; (*dataArrayP)[0].id = 3; (*dataArrayP)[1].id = 5; (*dataArrayP)[2].id = 6; (*dataArrayP)[3].id = 7; (*dataArrayP)[4].id = 8; (*dataArrayP)[5].id = 9; } i = 0; do { switch ((*dataArrayP)[i].id) { case RES_M_PACKAGE: case RES_M_PACKAGE_URI: case RES_M_UPDATE: result = COAP_405_METHOD_NOT_ALLOWED; break; case RES_M_STATE: // firmware update state (int) lwm2m_data_encode_int(data->state, *dataArrayP + i); result = COAP_205_CONTENT; break; case RES_M_UPDATE_RESULT: lwm2m_data_encode_int(data->result, *dataArrayP + i); result = COAP_205_CONTENT; break; case RES_O_PKG_NAME: lwm2m_data_encode_string(data->pkg_name, *dataArrayP + i); result = COAP_205_CONTENT; break; case RES_O_PKG_VERSION: lwm2m_data_encode_string(data->pkg_version, *dataArrayP + i); result = COAP_205_CONTENT; break; case RES_O_UPDATE_PROTOCOL: { int ri; int num = 0; lwm2m_data_t* subTlvP = NULL; while ((num < LWM2M_FIRMWARE_PROTOCOL_NUM) && (data->protocol_support[num] != LWM2M_FIRMWARE_PROTOCOL_NULL)) num++; if (num) { subTlvP = lwm2m_data_new(num); for (ri = 0; ri<num; ri++) { subTlvP[ri].id = ri; lwm2m_data_encode_int(data->protocol_support[ri], subTlvP + ri); } } else { /* If no protocol is provided, use CoAP as default (per spec) */ num = 1; subTlvP = lwm2m_data_new(num); subTlvP[0].id = 0; lwm2m_data_encode_int(0, subTlvP); } lwm2m_data_encode_instances(subTlvP, num, *dataArrayP + i); result = COAP_205_CONTENT; break; } case RES_M_UPDATE_METHOD: lwm2m_data_encode_int(data->delivery_method, *dataArrayP + i); result = COAP_205_CONTENT; break; default: result = COAP_404_NOT_FOUND; } i++; } while (i < *numDataP && result == COAP_205_CONTENT); return result; }
static uint8_t prv_get_value(lwm2m_data_t * dataP, server_instance_t * targetP) { switch (dataP->id) { case LWM2M_SERVER_SHORT_ID_ID: lwm2m_data_encode_int(targetP->shortServerId, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_LIFETIME_ID: lwm2m_data_encode_int(targetP->lifetime, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_MIN_PERIOD_ID: lwm2m_data_encode_int(targetP->defaultMinPeriod, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_MAX_PERIOD_ID: lwm2m_data_encode_int(targetP->defaultMaxPeriod, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_DISABLE_ID: return COAP_405_METHOD_NOT_ALLOWED; case LWM2M_SERVER_TIMEOUT_ID: lwm2m_data_encode_int(targetP->disableTimeout, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_STORING_ID: lwm2m_data_encode_bool(targetP->storing, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_BINDING_ID: lwm2m_data_encode_string(targetP->binding, dataP); return COAP_205_CONTENT; case LWM2M_SERVER_UPDATE_ID: return COAP_405_METHOD_NOT_ALLOWED; #ifndef LWM2M_VERSION_1_0 case LWM2M_SERVER_REG_ORDER_ID: if (targetP->registrationPriorityOrder >= 0) { lwm2m_data_encode_uint(targetP->registrationPriorityOrder, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_INITIAL_REG_DELAY_ID: if (targetP->initialRegistrationDelayTimer >= 0) { lwm2m_data_encode_uint(targetP->initialRegistrationDelayTimer, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_REG_FAIL_BLOCK_ID: if (targetP->registrationFailureBlock >= 0) { lwm2m_data_encode_bool(targetP->registrationFailureBlock > 0, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_REG_FAIL_BOOTSTRAP_ID: if (targetP->bootstrapOnRegistrationFailure >= 0) { lwm2m_data_encode_bool(targetP->bootstrapOnRegistrationFailure > 0, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_COMM_RETRY_COUNT_ID: if (targetP->communicationRetryCount >= 0) { lwm2m_data_encode_uint(targetP->communicationRetryCount, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_COMM_RETRY_TIMER_ID: if (targetP->communicationRetryTimer >= 0) { lwm2m_data_encode_uint(targetP->communicationRetryTimer, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_SEQ_DELAY_TIMER_ID: if (targetP->communicationSequenceDelayTimer >= 0) { lwm2m_data_encode_uint(targetP->communicationSequenceDelayTimer, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } case LWM2M_SERVER_SEQ_RETRY_COUNT_ID: if (targetP->communicationSequenceRetryCount >= 0) { lwm2m_data_encode_uint(targetP->communicationSequenceRetryCount, dataP); return COAP_205_CONTENT; } else { return COAP_404_NOT_FOUND; } #endif default: return COAP_404_NOT_FOUND; } }
static uint8_t prv_set_value(lwm2m_data_t * dataP, conn_m_data_t * connDataP) { switch (dataP->id) { case RES_M_NETWORK_BEARER: lwm2m_data_encode_int(VALUE_NETWORK_BEARER_GSM, dataP); return COAP_205_CONTENT; case RES_M_AVL_NETWORK_BEARER: { int riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_data_t * subTlvP; subTlvP = lwm2m_data_new(riCnt); subTlvP[0].id = 0; lwm2m_data_encode_int(VALUE_AVL_NETWORK_BEARER_1, subTlvP); lwm2m_data_encode_instances(subTlvP, riCnt, dataP); return COAP_205_CONTENT ; } case RES_M_RADIO_SIGNAL_STRENGTH: //s-int lwm2m_data_encode_int(connDataP->signalStrength, dataP); return COAP_205_CONTENT; case RES_O_LINK_QUALITY: //s-int lwm2m_data_encode_int(connDataP->linkQuality, dataP); return COAP_205_CONTENT ; case RES_M_IP_ADDRESSES: { int ri, riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_data_t* subTlvP = lwm2m_data_new(riCnt); for (ri = 0; ri < riCnt; ri++) { subTlvP[ri].id = ri; lwm2m_data_encode_string(connDataP->ipAddresses[ri], subTlvP + ri); } lwm2m_data_encode_instances(subTlvP, riCnt, dataP); 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_data_t* subTlvP = lwm2m_data_new(riCnt); for (ri=0; ri<riCnt; ri++) { subTlvP[ri].id = ri; lwm2m_data_encode_string(connDataP->routerIpAddresses[ri], subTlvP + ri); } lwm2m_data_encode_instances(subTlvP, riCnt, dataP); return COAP_205_CONTENT ; } break; case RES_O_LINK_UTILIZATION: lwm2m_data_encode_int(connDataP->linkUtilization, dataP); return COAP_205_CONTENT; case RES_O_APN: { int riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_data_t * subTlvP; subTlvP = lwm2m_data_new(riCnt); subTlvP[0].id = 0; lwm2m_data_encode_string(VALUE_APN_1, subTlvP); lwm2m_data_encode_instances(subTlvP, riCnt, dataP); return COAP_205_CONTENT; } break; case RES_O_CELL_ID: lwm2m_data_encode_int(connDataP->cellId, dataP); return COAP_205_CONTENT ; case RES_O_SMNC: lwm2m_data_encode_int(VALUE_SMNC, dataP); return COAP_205_CONTENT ; case RES_O_SMCC: lwm2m_data_encode_int(VALUE_SMCC, dataP); return COAP_205_CONTENT ; default: return COAP_404_NOT_FOUND ; } }