void handle_bootstrap_response(lwm2m_context_t * context, coap_packet_t * message, void * fromSessionH) { if (COAP_204_CHANGED == message->code) { context->bsState = BOOTSTRAP_PENDING; LOG("[BOOTSTRAP] Received ACK/2.04, Bootstrap pending, waiting for DEL/PUT from BS server...\r\n"); reset_bootstrap_timer(context); } else { bootstrap_failed(context); } }
// start a device initiated bootstrap int bootstrap_initiating_request(lwm2m_context_t * context) { char query[PRV_QUERY_BUFFER_LENGTH]; int query_length = 0; lwm2m_transaction_t * transaction = NULL; query_length = snprintf(query, sizeof(query), "?ep=%s", context->endpointName); if (query_length <= 1) { return INTERNAL_SERVER_ERROR_5_00; } // find the first bootstrap server lwm2m_server_t * bootstrapServer = context->bootstrapServerList; while (bootstrapServer != NULL) { if (bootstrapServer->sessionH == NULL) { bootstrapServer->sessionH = context->connectCallback(bootstrapServer->secObjInstID, context->userData); } if (bootstrapServer->sessionH != NULL) { LOG("[BOOTSTRAP] Bootstrap session starting...\r\n"); transaction = transaction_new(COAP_TYPE_CON, COAP_POST, NULL, NULL, context->nextMID++, 4, NULL, ENDPOINT_SERVER, (void *)bootstrapServer); if (transaction == NULL) { return INTERNAL_SERVER_ERROR_5_00; } coap_set_header_uri_path(transaction->message, "/"URI_BOOTSTRAP_SEGMENT); coap_set_header_uri_query(transaction->message, query); transaction->callback = prv_handleBootstrapReply; transaction->userData = (void *)context; context->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(context->transactionList, transaction); if (transaction_send(context, transaction) == 0) { LOG("[BOOTSTRAP] DI bootstrap requested to BS server\r\n"); context->bsState = BOOTSTRAP_INITIATED; reset_bootstrap_timer(context); } } else { LOG("No bootstrap session handler found\r\n"); } bootstrapServer = bootstrapServer->next; } return NO_ERROR; }
void bootstrap_failed(lwm2m_context_t * context) { reset_bootstrap_timer(context); context->bsState = BOOTSTRAP_FAILED; LOG("[BOOTSTRAP] Bootstrap failed\r\n"); }
coap_status_t ICACHE_FLASH_ATTR object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length) { coap_status_t result = NO_ERROR; lwm2m_object_t * targetP; lwm2m_data_t * dataP = NULL; int size = 0; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { result = NOT_FOUND_4_04; } else if (NULL == targetP->writeFunc) { result = METHOD_NOT_ALLOWED_4_05; } else { if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { size = 1; dataP = lwm2m_data_new(size); if (dataP == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } dataP->flags = LWM2M_TLV_FLAG_TEXT_FORMAT | LWM2M_TLV_FLAG_STATIC_DATA; dataP->type = LWM2M_TYPE_RESOURCE; dataP->id = uriP->resourceId; dataP->length = length; dataP->value = (uint8_t *)buffer; } else { size = lwm2m_data_parse(buffer, length, format, &dataP); if (size == 0) { result = COAP_500_INTERNAL_SERVER_ERROR; } } } if (result == NO_ERROR) { #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) { dataP->flags |= LWM2M_TLV_FLAG_BOOTSTRAPPING; } #endif result = targetP->writeFunc(uriP->instanceId, size, dataP, targetP); lwm2m_data_free(size, dataP); } #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) { if (result == COAP_204_CHANGED) { reset_bootstrap_timer(contextP); } else { bootstrap_failed(contextP); } } #endif return result; }