/* * Copyright (c) 2018 Intel Corporation * Copyright (c) 2023 Basalte bv * * SPDX-License-Identifier: Apache-2.0 */ #include LOG_MODULE_DECLARE(net_coap_service_sample); #include #include #include "net_private.h" static int piggyback_get(struct coap_resource *resource, struct coap_packet *request, struct sockaddr *addr, socklen_t addr_len) { uint8_t data[CONFIG_COAP_SERVER_MESSAGE_SIZE]; struct coap_packet response; uint8_t payload[40]; uint8_t token[COAP_TOKEN_MAX_LEN]; uint16_t id; uint8_t code; uint8_t type; uint8_t tkl; int r; code = coap_header_get_code(request); type = coap_header_get_type(request); id = coap_header_get_id(request); tkl = coap_header_get_token(request, token); LOG_INF("*******"); LOG_INF("type: %u code %u id %u", type, code, id); LOG_INF("*******"); if (type == COAP_TYPE_CON) { type = COAP_TYPE_ACK; } else { type = COAP_TYPE_NON_CON; } r = coap_packet_init(&response, data, sizeof(data), COAP_VERSION_1, type, tkl, token, COAP_RESPONSE_CODE_CONTENT, id); if (r < 0) { return r; } r = coap_append_option_int(&response, COAP_OPTION_CONTENT_FORMAT, COAP_CONTENT_FORMAT_TEXT_PLAIN); if (r < 0) { return r; } r = coap_packet_append_payload_marker(&response); if (r < 0) { return r; } /* The response that coap-client expects */ r = snprintk((char *) payload, sizeof(payload), "Type: %u\nCode: %u\nMID: %u\n", type, code, id); if (r < 0) { return r; } r = coap_packet_append_payload(&response, (uint8_t *)payload, strlen(payload)); if (r < 0) { return r; } r = coap_resource_send(resource, &response, addr, addr_len, NULL); return r; } static int test_del(struct coap_resource *resource, struct coap_packet *request, struct sockaddr *addr, socklen_t addr_len) { uint8_t data[CONFIG_COAP_SERVER_MESSAGE_SIZE]; struct coap_packet response; uint8_t token[COAP_TOKEN_MAX_LEN]; uint8_t tkl; uint8_t code; uint8_t type; uint16_t id; int r; code = coap_header_get_code(request); type = coap_header_get_type(request); id = coap_header_get_id(request); tkl = coap_header_get_token(request, token); LOG_INF("*******"); LOG_INF("type: %u code %u id %u", type, code, id); LOG_INF("*******"); if (type == COAP_TYPE_CON) { type = COAP_TYPE_ACK; } else { type = COAP_TYPE_NON_CON; } r = coap_packet_init(&response, data, sizeof(data), COAP_VERSION_1, type, tkl, token, COAP_RESPONSE_CODE_DELETED, id); if (r < 0) { return r; } r = coap_resource_send(resource, &response, addr, addr_len, NULL); return r; } static int test_put(struct coap_resource *resource, struct coap_packet *request, struct sockaddr *addr, socklen_t addr_len) { uint8_t data[CONFIG_COAP_SERVER_MESSAGE_SIZE]; struct coap_packet response; uint8_t token[COAP_TOKEN_MAX_LEN]; const uint8_t *payload; uint16_t payload_len; uint8_t code; uint8_t type; uint8_t tkl; uint16_t id; int r; code = coap_header_get_code(request); type = coap_header_get_type(request); id = coap_header_get_id(request); tkl = coap_header_get_token(request, token); LOG_INF("*******"); LOG_INF("type: %u code %u id %u", type, code, id); LOG_INF("*******"); payload = coap_packet_get_payload(request, &payload_len); if (payload) { net_hexdump("PUT Payload", payload, payload_len); } if (type == COAP_TYPE_CON) { type = COAP_TYPE_ACK; } else { type = COAP_TYPE_NON_CON; } r = coap_packet_init(&response, data, sizeof(data), COAP_VERSION_1, type, tkl, token, COAP_RESPONSE_CODE_CHANGED, id); if (r < 0) { return r; } r = coap_resource_send(resource, &response, addr, addr_len, NULL); return r; } static int test_post(struct coap_resource *resource, struct coap_packet *request, struct sockaddr *addr, socklen_t addr_len) { static const char * const location_path[] = { "location1", "location2", "location3", NULL }; uint8_t data[CONFIG_COAP_SERVER_MESSAGE_SIZE]; const char * const *p; struct coap_packet response; uint8_t token[COAP_TOKEN_MAX_LEN]; const uint8_t *payload; uint16_t payload_len; uint8_t code; uint8_t type; uint8_t tkl; uint16_t id; int r; code = coap_header_get_code(request); type = coap_header_get_type(request); id = coap_header_get_id(request); tkl = coap_header_get_token(request, token); LOG_INF("*******"); LOG_INF("type: %u code %u id %u", type, code, id); LOG_INF("*******"); payload = coap_packet_get_payload(request, &payload_len); if (payload) { net_hexdump("POST Payload", payload, payload_len); } if (type == COAP_TYPE_CON) { type = COAP_TYPE_ACK; } else { type = COAP_TYPE_NON_CON; } r = coap_packet_init(&response, data, sizeof(data), COAP_VERSION_1, type, tkl, token, COAP_RESPONSE_CODE_CREATED, id); if (r < 0) { return r; } for (p = location_path; *p; p++) { r = coap_packet_append_option(&response, COAP_OPTION_LOCATION_PATH, *p, strlen(*p)); if (r < 0) { return r; } } r = coap_resource_send(resource, &response, addr, addr_len, NULL); return r; } static const char * const test_path[] = { "test", NULL }; COAP_RESOURCE_DEFINE(test, coap_server, { .get = piggyback_get, .post = test_post, .del = test_del, .put = test_put, .path = test_path, }); static const char * const segments_path[] = { "seg1", "seg2", "seg3", NULL }; COAP_RESOURCE_DEFINE(segments, coap_server, { .get = piggyback_get, .path = segments_path, }); #if defined(CONFIG_COAP_URI_WILDCARD) static const char * const wildcard1_path[] = { "wild1", "+", "wild3", NULL }; COAP_RESOURCE_DEFINE(wildcard1, coap_server, { .get = piggyback_get, .path = wildcard1_path, }); static const char * const wildcard2_path[] = { "wild2", "#", NULL }; COAP_RESOURCE_DEFINE(wildcard2, coap_server, { .get = piggyback_get, .path = wildcard2_path, }); #endif