/* * 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 static int query_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_option options[4]; 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 i, 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); r = coap_find_options(request, COAP_OPTION_URI_QUERY, options, 4); if (r < 0) { return -EINVAL; } LOG_INF("*******"); LOG_INF("type: %u code %u id %u", type, code, id); LOG_INF("num queries: %d", r); for (i = 0; i < r; i++) { char str[16]; if (options[i].len + 1 > sizeof(str)) { LOG_INF("Unexpected length of query: " "%d (expected %zu)", options[i].len, sizeof(str)); break; } memcpy(str, options[i].value, options[i].len); str[options[i].len] = '\0'; LOG_INF("query[%d]: %s", i + 1, str); } LOG_INF("*******"); r = coap_packet_init(&response, data, sizeof(data), COAP_VERSION_1, COAP_TYPE_ACK, 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 const char * const query_path[] = { "query", NULL }; COAP_RESOURCE_DEFINE(query, coap_server, { .get = query_get, .path = query_path, });