static uint8_t prv_set_tlv(lwm2m_data_t* dataP, acc_ctrl_oi_t* accCtrlOiP) { switch (dataP->id) { case RES_M_OBJECT_ID: lwm2m_data_encode_int(accCtrlOiP->objectId, dataP); return COAP_205_CONTENT; case RES_M_OBJECT_INSTANCE_ID: lwm2m_data_encode_int(accCtrlOiP->objectInstId, dataP); return COAP_205_CONTENT; case RES_O_ACL: { int ri; acc_ctrl_ri_t* accCtrlRiP; for (accCtrlRiP =accCtrlOiP->accCtrlValList, ri=0; accCtrlRiP!=NULL; accCtrlRiP = accCtrlRiP->next, ri++); if (ri==0) // no values! { return COAP_404_NOT_FOUND; } else { lwm2m_data_t* subTlvP = lwm2m_data_new(ri); if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; for (accCtrlRiP = accCtrlOiP->accCtrlValList, ri = 0; accCtrlRiP!= NULL; accCtrlRiP = accCtrlRiP->next, ri++) { subTlvP[ri].id = accCtrlRiP->resInstId; lwm2m_data_encode_int(accCtrlRiP->accCtrlValue, &subTlvP[ri]); } lwm2m_data_encode_instances(subTlvP, 2, dataP); return COAP_205_CONTENT; } } case RES_M_ACCESS_CONTROL_OWNER: lwm2m_data_encode_int(accCtrlOiP->accCtrlOwner, dataP); return COAP_205_CONTENT; default: return COAP_404_NOT_FOUND ; } }
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_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 ; } }