CoAP server ported from Arduino microcoap
Dependencies: EthernetInterface Socket mbed-rtos mbed
endpoints.cpp
- Committer:
- rfrenken
- Date:
- 2017-03-23
- Revision:
- 0:64df7fc091da
File content as of revision 0:64df7fc091da:
#include "mbed.h" #include <stdbool.h> #include <string.h> #include "coap.h" static char light = '0'; static char led0 = '0'; static char led1 = '0'; static char led2 = '0'; static char led3 = '0'; DigitalOut myled(LED1); DigitalOut myled1(LED2); DigitalOut myled2(LED3); DigitalOut myled3(LED4); const uint16_t rsplen = 1500; static char rsp[1500] = ""; void build_rsp(void); #include <stdio.h> void endpoint_setup(void) { build_rsp(); } static const coap_endpoint_path_t path_well_known_core = {2, {".well-known", "core"}}; static int handle_get_well_known_core(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { return coap_make_response(scratch, outpkt, (const uint8_t *)rsp, strlen(rsp), id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_APPLICATION_LINKFORMAT); } static const coap_endpoint_path_t path_light = {1, {"light"}}; static const coap_endpoint_path_t path_led0 = {2, {"led", "0"}}; static const coap_endpoint_path_t path_led1 = {2, {"led", "1"}}; static const coap_endpoint_path_t path_led2 = {2, {"led", "2"}}; static const coap_endpoint_path_t path_led3 = {2, {"led", "3"}}; static int handle_get_light(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { return coap_make_response(scratch, outpkt, (const uint8_t *)&light, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_TEXT_PLAIN); } static int handle_get_led0(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { return coap_make_response(scratch, outpkt, (const uint8_t *)&led0, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_TEXT_PLAIN); } static int handle_get_led1(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { return coap_make_response(scratch, outpkt, (const uint8_t *)&led1, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_TEXT_PLAIN); } static int handle_get_led2(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { return coap_make_response(scratch, outpkt, (const uint8_t *)&led2, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_TEXT_PLAIN); } static int handle_get_led3(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { return coap_make_response(scratch, outpkt, (const uint8_t *)&led3, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CONTENT, COAP_CONTENTTYPE_TEXT_PLAIN); } static int handle_put_light(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { if (inpkt->payload.len == 0) return coap_make_response(scratch, outpkt, NULL, 0, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_BAD_REQUEST, COAP_CONTENTTYPE_TEXT_PLAIN); if (inpkt->payload.p[0] == '1') { light = '1'; #ifdef ARDUINO digitalWrite(led, HIGH); #else myled = 1; printf("ON\n"); #endif return coap_make_response(scratch, outpkt, (const uint8_t *)&light, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } else { light = '0'; #ifdef ARDUINO digitalWrite(led, LOW); #else myled = 0; printf("OFF\n"); #endif return coap_make_response(scratch, outpkt, (const uint8_t *)&light, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } } static int handle_put_led0(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { if (inpkt->payload.len == 0) return coap_make_response(scratch, outpkt, NULL, 0, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_BAD_REQUEST, COAP_CONTENTTYPE_TEXT_PLAIN); if (inpkt->payload.p[0] == '1') { led0 = '1'; myled = 1; printf("ON\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led0, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } else { led0 = '0'; myled = 0; printf("OFF\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led0, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } } static int handle_put_led1(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { if (inpkt->payload.len == 0) return coap_make_response(scratch, outpkt, NULL, 0, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_BAD_REQUEST, COAP_CONTENTTYPE_TEXT_PLAIN); if (inpkt->payload.p[0] == '1') { led1 = '1'; myled1 = 1; printf("ON\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led1, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } else { led1 = '0'; myled1 = 0; printf("OFF\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led1, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } } static int handle_put_led2(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { if (inpkt->payload.len == 0) return coap_make_response(scratch, outpkt, NULL, 0, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_BAD_REQUEST, COAP_CONTENTTYPE_TEXT_PLAIN); if (inpkt->payload.p[0] == '1') { led2 = '1'; myled2 = 1; printf("ON\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led2, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } else { led2 = '0'; myled2 = 0; printf("OFF\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led2, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } } static int handle_put_led3(coap_rw_buffer_t *scratch, const coap_packet_t *inpkt, coap_packet_t *outpkt, uint8_t id_hi, uint8_t id_lo) { if (inpkt->payload.len == 0) return coap_make_response(scratch, outpkt, NULL, 0, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_BAD_REQUEST, COAP_CONTENTTYPE_TEXT_PLAIN); if (inpkt->payload.p[0] == '1') { led3 = '1'; myled3 = 1; printf("ON\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led3, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } else { led3 = '0'; myled3 = 0; printf("OFF\n"); return coap_make_response(scratch, outpkt, (const uint8_t *)&led3, 1, id_hi, id_lo, &inpkt->tok, COAP_RSPCODE_CHANGED, COAP_CONTENTTYPE_TEXT_PLAIN); } } const coap_endpoint_t endpoints[] = { {COAP_METHOD_GET, handle_get_well_known_core, &path_well_known_core, "ct=40"}, {COAP_METHOD_GET, handle_get_light, &path_light, "ct=0"}, {COAP_METHOD_PUT, handle_put_light, &path_light, NULL}, {COAP_METHOD_GET, handle_get_led0, &path_led0, "ct=0"}, {COAP_METHOD_PUT, handle_put_led0, &path_led0, NULL}, {COAP_METHOD_GET, handle_get_led1, &path_led1, "ct=0"}, {COAP_METHOD_PUT, handle_put_led1, &path_led1, NULL}, {COAP_METHOD_GET, handle_get_led2, &path_led2, "ct=0"}, {COAP_METHOD_PUT, handle_put_led2, &path_led2, NULL}, {COAP_METHOD_GET, handle_get_led3, &path_led3, "ct=0"}, {COAP_METHOD_PUT, handle_put_led3, &path_led3, NULL}, {(coap_method_t)0, NULL, NULL, NULL} }; void build_rsp(void) { uint16_t len = rsplen; const coap_endpoint_t *ep = endpoints; int i; len--; // Null-terminated string while(NULL != ep->handler) { if (NULL == ep->core_attr) { ep++; continue; } if (0 < strlen(rsp)) { strncat(rsp, ",", len); len--; } strncat(rsp, "<", len); len--; for (i = 0; i < ep->path->count; i++) { strncat(rsp, "/", len); len--; strncat(rsp, ep->path->elems[i], len); len -= strlen(ep->path->elems[i]); } strncat(rsp, ">;", len); len -= 2; strncat(rsp, ep->core_attr, len); len -= strlen(ep->core_attr); ep++; } }