#include "FreeRTOS.h" #include "task.h" #include "diag.h" #include "platform_stdlib.h" #include "wifi_constants.h" #include "wifi_conf.h" #include #include #include "sn_coap_protocol.h" #include "sn_coap_ameba_port.h" #define SERVER_HOST "coap.me" #define URI_PATH "/hello" #define SERVER_PORT 5683 #define BUF_LEN 1280 // Suggested is to keep packet size under 1280 bytes struct coap_s* coapHandle; coap_version_e coapVersion = COAP_VERSION_1; uint8_t coap_tx_cb(uint8_t *a, uint16_t b, sn_nsdl_addr_s *c, void *d) { printf("coap tx cb\n"); return 0; } int8_t coap_rx_cb(sn_coap_hdr_s *a, sn_nsdl_addr_s *b, void *c) { printf("coap rx cb\n"); return 0; } static void example_coap_thread(void *para){ printf("\nCoAP Client Example\n"); while(wifi_is_ready_to_transceive(RTW_STA_INTERFACE) != RTW_SUCCESS){ printf("Wait for WIFI connection ...\n"); vTaskDelay(1000); } // Initialize the CoAP protocol handle, pointing to local implementations on malloc/free/tx/rx functions coapHandle = coap_protocol_init(&coap_tx_cb, &coap_rx_cb); // See ns_coap_header.h sn_coap_hdr_s *coap_res_ptr = (sn_coap_hdr_s*)coap_calloc(1*sizeof(sn_coap_hdr_s)); coap_res_ptr->token_len = 0; coap_res_ptr->coap_status = COAP_STATUS_OK; coap_res_ptr->msg_code = COAP_MSG_CODE_REQUEST_GET; coap_res_ptr->msg_type = COAP_MSG_TYPE_CONFIRMABLE; coap_res_ptr->content_format = COAP_CT_TEXT_PLAIN; coap_res_ptr->msg_id = 7; coap_res_ptr->uri_path_len = strlen(URI_PATH); coap_res_ptr->payload_len = 0; coap_res_ptr->token_ptr = NULL; coap_res_ptr->uri_path_ptr = (uint8_t*)URI_PATH; coap_res_ptr->payload_ptr = NULL; coap_res_ptr->options_list_ptr = NULL; int socket = coap_sock_open(); //send CoAP message coap_send(SERVER_HOST, SERVER_PORT, socket, coap_res_ptr); coap_free(coap_res_ptr); //receive CoAP message struct sockaddr_in from_address; uint8_t* recv_buffer = (uint8_t*)coap_calloc(BUF_LEN); int ret; while((ret = coap_recv(socket, &from_address, recv_buffer, BUF_LEN)) >= 0) { uint32_t ip = from_address.sin_addr.s_addr; uint8_t bytes[4]; bytes[0] = ip & 0xFF; bytes[1] = (ip >> 8) & 0xFF; bytes[2] = (ip >> 16) & 0xFF; bytes[3] = (ip >> 24) & 0xFF; printf("\nReceived %d bytes from '%d.%d.%d.%d:%d'\n", ret, bytes[0], bytes[1], bytes[2], bytes[3], from_address.sin_port); sn_coap_hdr_s* parsed = sn_coap_parser(coapHandle, ret, recv_buffer, &coapVersion); coap_print_hdr(parsed); } coap_free(recv_buffer); coap_sock_close(socket); vTaskDelete(NULL); } void example_coap(void) { if(xTaskCreate(example_coap_thread, ((const char*)"example_coap_thread"), 2048, NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS) printf("\n\r%s xTaskCreate(init_thread) failed", __FUNCTION__); }