void init_resources(coap_context_t *ctx) { coap_resource_t *r; r = coap_resource_init(RD_ROOT_STR, RD_ROOT_SIZE, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_rd); coap_register_handler(r, COAP_REQUEST_POST, hnd_post_rd); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"40", 2, 0); coap_add_attr(r, (unsigned char *)"rt", 2, (unsigned char *)"\"core-rd\"", 9, 0); coap_add_attr(r, (unsigned char *)"ins", 2, (unsigned char *)"\"default\"", 9, 0); coap_add_resource(ctx, r); }
void init_resources(coap_context_t *ctx) { coap_resource_t *r; r = coap_resource_init(NULL, 0, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_index); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_attr(r, (unsigned char *)"title", 5, (unsigned char *)"\"General Info\"", 14, 0); coap_add_resource(ctx, r); /* store clock base to use in /time */ my_clock_base = clock_offset; r = coap_resource_init((unsigned char *)"time", 4, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_time); coap_register_handler(r, COAP_REQUEST_PUT, hnd_put_time); coap_register_handler(r, COAP_REQUEST_DELETE, hnd_delete_time); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_attr(r, (unsigned char *)"title", 5, (unsigned char *)"\"Internal Clock\"", 16, 0); coap_add_attr(r, (unsigned char *)"rt", 2, (unsigned char *)"\"Ticks\"", 7, 0); r->observable = 1; coap_add_attr(r, (unsigned char *)"if", 2, (unsigned char *)"\"clock\"", 7, 0); coap_add_resource(ctx, r); time_resource = r; #ifndef WITHOUT_ASYNC r = coap_resource_init((unsigned char *)"async", 5, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_async); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_resource(ctx, r); #endif /* WITHOUT_ASYNC */ }
void* CoAPWrapper::CreateResource(std::string uri, CoAP_Attr& attr, CoAPResource::method_handler_t& method_handler, CoAPResource *app_context) { coap_resource_t *r; str copy = {0, NULL}; copy.s = (unsigned char*)coap_malloc(uri.length()); copy.length = uri.length(); memcpy(copy.s, uri.c_str(), copy.length); r = coap_resource_init_with_app_context(copy.s, copy.length, COAP_ATTR_FLAGS_RELEASE_NAME, (void*)app_context); if (r == 0 ) { ACE_DEBUG((LM_DEBUG, "Failed to allocate %s resource\n", uri.c_str())); return 0; } coap_register_handler(r, COAP_REQUEST_GET, (coap_method_handler_t)method_handler.handler_get); coap_register_handler(r, COAP_REQUEST_POST, (coap_method_handler_t)method_handler.handler_post); coap_register_handler(r, COAP_REQUEST_PUT, (coap_method_handler_t)method_handler.handler_put); coap_register_handler(r, COAP_REQUEST_DELETE, (coap_method_handler_t)method_handler.handler_delete); CoAP_Attr::iterator e = attr.begin(); for (; e != attr.end(); ++e) { str k = {0, NULL}, v={0, NULL}; std::string key = e->first; std::string value = e->second; k.s = (unsigned char*)coap_malloc(key.length()); k.length = key.length(); v.s = (unsigned char*)coap_malloc(value.length()); v.length = value.length(); memcpy(k.s, key.c_str(), k.length); memcpy(v.s, value.c_str(), v.length); coap_add_attr(r, k.s, k.length, v.s, v.length, COAP_ATTR_FLAGS_RELEASE_NAME); } coap_add_resource(coap_ctx_, r); return r; }
void add_source_address(struct coap_resource_t *resource, coap_address_t *peer) { #define BUFSIZE 64 char *buf; size_t n = 1; buf = (char *)coap_malloc(BUFSIZE); if (!buf) return; buf[0] = '"'; switch(peer->addr.sa.sa_family) { case AF_INET: /* FIXME */ break; case AF_INET6: n += snprintf(buf + n, BUFSIZE - n, "[%02x%02x:%02x%02x:%02x%02x:%02x%02x" \ ":%02x%02x:%02x%02x:%02x%02x:%02x%02x]", peer->addr.sin6.sin6_addr.s6_addr[0], peer->addr.sin6.sin6_addr.s6_addr[1], peer->addr.sin6.sin6_addr.s6_addr[2], peer->addr.sin6.sin6_addr.s6_addr[3], peer->addr.sin6.sin6_addr.s6_addr[4], peer->addr.sin6.sin6_addr.s6_addr[5], peer->addr.sin6.sin6_addr.s6_addr[6], peer->addr.sin6.sin6_addr.s6_addr[7], peer->addr.sin6.sin6_addr.s6_addr[8], peer->addr.sin6.sin6_addr.s6_addr[9], peer->addr.sin6.sin6_addr.s6_addr[10], peer->addr.sin6.sin6_addr.s6_addr[11], peer->addr.sin6.sin6_addr.s6_addr[12], peer->addr.sin6.sin6_addr.s6_addr[13], peer->addr.sin6.sin6_addr.s6_addr[14], peer->addr.sin6.sin6_addr.s6_addr[15]); if (peer->addr.sin6.sin6_port != htons(COAP_DEFAULT_PORT)) { n += snprintf(buf + n, BUFSIZE - n, ":%d", peer->addr.sin6.sin6_port); } break; default: ; } if (n < BUFSIZE) buf[n++] = '"'; coap_add_attr(resource, (unsigned char *)"A", 1, (unsigned char *)buf, n, COAP_ATTR_FLAGS_RELEASE_VALUE); #undef BUFSIZE }
void init_resources(coap_context_t *ctx) { coap_resource_t *r; coap_payload_t *test_payload; test_payload = coap_new_payload(200); if (!test_payload) coap_log(LOG_CRIT, "cannot allocate resource /test"); else { test_payload->length = 13; memcpy(test_payload->data, "put data here", test_payload->length); /* test_payload->media_type is 0 anyway */ r = coap_resource_init((unsigned char *)"test", 4, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_resource); coap_register_handler(r, COAP_REQUEST_POST, hnd_post_test); coap_register_handler(r, COAP_REQUEST_PUT, hnd_put_test); coap_register_handler(r, COAP_REQUEST_DELETE, hnd_delete_test); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_attr(r, (unsigned char *)"rt", 2, (unsigned char *)"test", 4, 0); coap_add_attr(r, (unsigned char *)"if", 2, (unsigned char *)"core#b", 6, 0); #if 0 coap_add_attr(r, (unsigned char *)"obs", 3, NULL, 0, 0); #endif coap_add_resource(ctx, r); coap_add_payload(r->key, test_payload, NULL); } /* TD_COAP_BLOCK_01 * TD_COAP_BLOCK_02 */ test_payload = make_large("etsi_iot_01_largedata.txt"); if (!test_payload) coap_log(LOG_CRIT, "cannot allocate resource /large\n"); else { r = coap_resource_init((unsigned char *)"large", 5, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_resource); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"41", 2, 0); coap_add_attr(r, (unsigned char *)"rt", 2, (unsigned char *)"large", 5, 0); coap_add_resource(ctx, r); test_payload->flags |= REQUIRE_ETAG; coap_add_payload(r->key, test_payload, NULL); } /* For TD_COAP_CORE_12 */ test_payload = coap_new_payload(20); if (!test_payload) coap_log(LOG_CRIT, "cannot allocate resource /seg1/seg2/seg3\n"); else { test_payload->length = 10; memcpy(test_payload->data, "segsegseg!", test_payload->length); /* test_payload->media_type is 0 anyway */ r = coap_resource_init((unsigned char *)"seg1/seg2/seg3", 14, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_resource); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_resource(ctx, r); coap_add_payload(r->key, test_payload, NULL); } /* For TD_COAP_CORE_13 */ r = coap_resource_init((unsigned char *)"query", 5, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_query); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_resource(ctx, r); /* For TD_COAP_CORE_16 */ r = coap_resource_init((unsigned char *)"separate", 8, 0); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_separate); coap_add_attr(r, (unsigned char *)"ct", 2, (unsigned char *)"0", 1, 0); coap_add_attr(r, (unsigned char *)"rt", 2, (unsigned char *)"separate", 8, 0); coap_add_resource(ctx, r); }
void hnd_post_rd(coap_context_t *ctx, struct coap_resource_t *resource, const coap_endpoint_t *local_interface, coap_address_t *peer, coap_pdu_t *request, str *token, coap_pdu_t *response) { size_t len=0; unsigned char *databuf; unsigned char strBuf[100]; unsigned char s[100]; coap_print_addr(peer, s, 100); if (coap_get_data(request, &len, &databuf)){ memcpy(strBuf, databuf, len); strBuf[len]='\0'; fprintf(stdout, "%s %s\n", s, strBuf); }else{ fprintf(stdout, "%s\n", s); } fflush(stdout); coap_resource_t *r; coap_opt_iterator_t opt_iter; coap_opt_t *query; #define LOCSIZE 68 unsigned char *loc; size_t loc_size; str h = {0, NULL}, ins = {0, NULL}, rt = {0, NULL}, lt = {0, NULL}; /* store query parameters */ unsigned char *buf; loc = (unsigned char *)coap_malloc(LOCSIZE); if (!loc) { response->hdr->code = COAP_RESPONSE_CODE(500); return; } memcpy(loc, RD_ROOT_STR, RD_ROOT_SIZE); loc_size = RD_ROOT_SIZE; loc[loc_size++] = '/'; /* store query parameters for later use */ query = coap_check_option(request, COAP_OPTION_URI_QUERY, &opt_iter); if (query) { parse_param((unsigned char *)"h", 1, COAP_OPT_VALUE(query), COAP_OPT_LENGTH(query), &h); parse_param((unsigned char *)"ins", 3, COAP_OPT_VALUE(query), COAP_OPT_LENGTH(query), &ins); parse_param((unsigned char *)"lt", 2, COAP_OPT_VALUE(query), COAP_OPT_LENGTH(query), <); parse_param((unsigned char *)"rt", 2, COAP_OPT_VALUE(query), COAP_OPT_LENGTH(query), &rt); } if (h.length) { /* client has specified a node name */ memcpy(loc + loc_size, h.s, min(h.length, LOCSIZE - loc_size - 1)); loc_size += min(h.length, LOCSIZE - loc_size - 1); if (ins.length && loc_size > 1) { loc[loc_size++] = '-'; memcpy((char *)(loc + loc_size), ins.s, min(ins.length, LOCSIZE - loc_size - 1)); loc_size += min(ins.length, LOCSIZE - loc_size - 1); } } else { /* generate node identifier */ loc_size += snprintf((char *)(loc + loc_size), LOCSIZE - loc_size - 1, "%x", request->hdr->id); if (loc_size > 1) { if (ins.length) { loc[loc_size++] = '-'; memcpy((char *)(loc + loc_size), ins.s, min(ins.length, LOCSIZE - loc_size - 1)); loc_size += min(ins.length, LOCSIZE - loc_size - 1); } else { coap_tick_t now; coap_ticks(&now); loc_size += snprintf((char *)(loc + loc_size), LOCSIZE - loc_size - 1, "-%x", now); } } } /* TODO: * - use lt to check expiration */ r = coap_resource_init(loc, loc_size, COAP_RESOURCE_FLAGS_RELEASE_URI); coap_register_handler(r, COAP_REQUEST_GET, hnd_get_resource); coap_register_handler(r, COAP_REQUEST_PUT, hnd_put_resource); coap_register_handler(r, COAP_REQUEST_DELETE, hnd_delete_resource); if (ins.s) { buf = (unsigned char *)coap_malloc(ins.length + 2); if (buf) { /* add missing quotes */ buf[0] = '"'; memcpy(buf + 1, ins.s, ins.length); buf[ins.length + 1] = '"'; coap_add_attr(r, (unsigned char *)"ins", 3, buf, ins.length + 2, COAP_ATTR_FLAGS_RELEASE_VALUE); } } if (rt.s) { buf = (unsigned char *)coap_malloc(rt.length + 2); if (buf) { /* add missing quotes */ buf[0] = '"'; memcpy(buf + 1, rt.s, rt.length); buf[rt.length + 1] = '"'; coap_add_attr(r, (unsigned char *)"rt", 2, buf, rt.length + 2, COAP_ATTR_FLAGS_RELEASE_VALUE); } } add_source_address(r, peer); { rd_t *rd; rd = make_rd(peer, request); if (rd) { coap_hash_path(loc, loc_size, rd->key); HASH_ADD(hh, resources, key, sizeof(coap_key_t), rd); } else { /* FIXME: send error response and delete r */ } } coap_add_resource(ctx, r); /* create response */ response->hdr->code = COAP_RESPONSE_CODE(201); { /* split path into segments and add Location-Path options */ unsigned char _b[LOCSIZE]; unsigned char *b = _b; size_t buflen = sizeof(_b); int nseg; nseg = coap_split_path(loc, loc_size, b, &buflen); while (nseg--) { coap_add_option(response, COAP_OPTION_LOCATION_PATH, COAP_OPT_LENGTH(b), COAP_OPT_VALUE(b)); b += COAP_OPT_SIZE(b); } } }