blob: 95272189d9cac91f7a2328e5813f336702cad59d [file] [log] [blame]
/*
* Copyright (c) 2018 Intel Corporation
* Copyright (c) 2023 Basalte bv
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(net_coap_service_sample);
#include <zephyr/sys/printk.h>
#include <zephyr/net/coap_service.h>
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,
});