example: fix CI error of coap server demo

This commit is contained in:
Wu Jian Gang 2017-01-06 18:42:46 +08:00
parent 6ca2934843
commit 4491dd0e2a
3 changed files with 85 additions and 128 deletions

View File

@ -1,12 +1,5 @@
menu "Example Configuration" menu "Example Configuration"
config LOCAL_PORT_NUMBER
int "Local port number"
range 0 65535
default 5683
help
Local port number for the example to use.
config WIFI_SSID config WIFI_SSID
string "WiFi SSID" string "WiFi SSID"
default "myssid" default "myssid"

View File

@ -6,9 +6,9 @@
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. CONDITIONS OF ANY KIND, either express or implied.
*/ */
#include "coap_server.h"
#include <string.h> #include <string.h>
#include <sys/socket.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
@ -19,12 +19,20 @@
#include "esp_event_loop.h" #include "esp_event_loop.h"
#include "nvs_flash.h" #include "nvs_flash.h"
#include <sys/socket.h>
#include "coap_config.h"
#include "resource.h"
#include "coap.h" #include "coap.h"
/* The examples use simple WiFi configuration that you can set via
'make menuconfig'.
If you'd rather not, just change the below entries to strings with
the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
#define COAP_DEFAULT_TIME_SEC 5
#define COAP_DEFAULT_TIME_USEC 0
static EventGroupHandle_t wifi_event_group; static EventGroupHandle_t wifi_event_group;
@ -33,32 +41,32 @@ static EventGroupHandle_t wifi_event_group;
to the AP with an IP? */ to the AP with an IP? */
const static int CONNECTED_BIT = BIT0; const static int CONNECTED_BIT = BIT0;
const static char *TAG = "CoAP_demo"; const static char *TAG = "CoAP_server";
static coap_async_state_t *async = NULL; static coap_async_state_t *async = NULL;
static void static void
send_async_response(coap_context_t *ctx, const coap_endpoint_t *local_if) send_async_response(coap_context_t *ctx, const coap_endpoint_t *local_if)
{ {
coap_pdu_t *response; coap_pdu_t *response;
unsigned char buf[3]; unsigned char buf[3];
const char* response_data = "Hello World!"; const char* response_data = "Hello World!";
size_t size = sizeof(coap_hdr_t) + 20; size_t size = sizeof(coap_hdr_t) + 20;
response = coap_pdu_init(async->flags & COAP_MESSAGE_CON, COAP_RESPONSE_CODE(205), 0, size); response = coap_pdu_init(async->flags & COAP_MESSAGE_CON, COAP_RESPONSE_CODE(205), 0, size);
response->hdr->id = coap_new_message_id(ctx); response->hdr->id = coap_new_message_id(ctx);
if (async->tokenlen) if (async->tokenlen)
coap_add_token(response, async->tokenlen, async->token); coap_add_token(response, async->tokenlen, async->token);
coap_add_option(response, COAP_OPTION_CONTENT_TYPE, coap_encode_var_bytes(buf, COAP_MEDIATYPE_TEXT_PLAIN), buf); coap_add_option(response, COAP_OPTION_CONTENT_TYPE, coap_encode_var_bytes(buf, COAP_MEDIATYPE_TEXT_PLAIN), buf);
coap_add_data (response, strlen(response_data), (unsigned char *)response_data); coap_add_data (response, strlen(response_data), (unsigned char *)response_data);
if (coap_send(ctx, local_if, &async->peer, response) == COAP_INVALID_TID) { if (coap_send(ctx, local_if, &async->peer, response) == COAP_INVALID_TID) {
} }
coap_delete_pdu(response); coap_delete_pdu(response);
coap_async_state_t *tmp; coap_async_state_t *tmp;
coap_remove_async(ctx, async->id, &tmp); coap_remove_async(ctx, async->id, &tmp);
coap_free_async(async); coap_free_async(async);
async = NULL; async = NULL;
} }
/* /*
@ -69,76 +77,70 @@ async_handler(coap_context_t *ctx, struct coap_resource_t *resource,
const coap_endpoint_t *local_interface, coap_address_t *peer, const coap_endpoint_t *local_interface, coap_address_t *peer,
coap_pdu_t *request, str *token, coap_pdu_t *response) coap_pdu_t *request, str *token, coap_pdu_t *response)
{ {
async = coap_register_async(ctx, peer, request, COAP_ASYNC_SEPARATE | COAP_ASYNC_CONFIRM, (void*)"no data"); async = coap_register_async(ctx, peer, request, COAP_ASYNC_SEPARATE | COAP_ASYNC_CONFIRM, (void*)"no data");
} }
static void coap_demo_thread(void *p) static void coap_demo_thread(void *p)
{ {
coap_context_t* ctx = NULL; coap_context_t* ctx = NULL;
coap_address_t serv_addr; coap_address_t serv_addr;
coap_resource_t* resource = NULL; coap_resource_t* resource = NULL;
fd_set readfds; fd_set readfds;
struct timeval tv; struct timeval tv;
int flags = 0; int flags = 0;
/* Prepare the CoAP server socket */
coap_address_init(&serv_addr);
serv_addr.addr.sin.sin_family = AF_INET;
serv_addr.addr.sin.sin_addr.s_addr = INADDR_ANY;
serv_addr.addr.sin.sin_port = htons(COAP_DEFAULT_PORT);
ctx = coap_new_context(&serv_addr);
if (ctx) {
flags = fcntl(ctx->sockfd, F_GETFL, 0);
fcntl(ctx->sockfd, F_SETFL, flags|O_NONBLOCK);
tv.tv_usec = COAP_DEFAULT_TIME_USEC; while (1) {
tv.tv_sec = COAP_DEFAULT_TIME_SEC; /* Wait for the callback to set the CONNECTED_BIT in the
/* Initialize the resource */ event group.
resource = coap_resource_init((unsigned char *)"Espressif", 9, 0); */
if (resource){ xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT,
coap_register_handler(resource, COAP_REQUEST_GET, async_handler); false, true, portMAX_DELAY);
coap_add_resource(ctx, resource); ESP_LOGI(TAG, "Connected to AP");
/*For incoming connections*/
for (;;) {
FD_ZERO(&readfds);
FD_CLR( ctx->sockfd, &readfds);
FD_SET( ctx->sockfd, &readfds);
int result = select( FD_SETSIZE, &readfds, 0, 0, &tv ); /* Prepare the CoAP server socket */
if (result > 0){ coap_address_init(&serv_addr);
if (FD_ISSET( ctx->sockfd, &readfds )) serv_addr.addr.sin.sin_family = AF_INET;
coap_read(ctx); serv_addr.addr.sin.sin_addr.s_addr = INADDR_ANY;
} else if (result < 0){ serv_addr.addr.sin.sin_port = htons(COAP_DEFAULT_PORT);
break; ctx = coap_new_context(&serv_addr);
} else { if (ctx) {
printf("select timeout\n"); flags = fcntl(ctx->sockfd, F_GETFL, 0);
} fcntl(ctx->sockfd, F_SETFL, flags|O_NONBLOCK);
if (async) tv.tv_usec = COAP_DEFAULT_TIME_USEC;
send_async_response(ctx, ctx->endpoint); tv.tv_sec = COAP_DEFAULT_TIME_SEC;
} /* Initialize the resource */
} resource = coap_resource_init((unsigned char *)"Espressif", 9, 0);
if (resource){
coap_register_handler(resource, COAP_REQUEST_GET, async_handler);
coap_add_resource(ctx, resource);
/*For incoming connections*/
for (;;) {
FD_ZERO(&readfds);
FD_CLR( ctx->sockfd, &readfds);
FD_SET( ctx->sockfd, &readfds);
coap_free_context(ctx); int result = select( FD_SETSIZE, &readfds, 0, 0, &tv );
} if (result > 0){
if (FD_ISSET( ctx->sockfd, &readfds ))
coap_read(ctx);
} else if (result < 0){
break;
} else {
ESP_LOGE(TAG, "select timeout");
}
vTaskDelete(NULL); if (async) {
} send_async_response(ctx, ctx->endpoint);
}
}
}
static void coap_server_init(void) coap_free_context(ctx);
{ }
int ret = pdPASS;
xTaskHandle coap_handle = NULL;
ret = xTaskCreate(coap_demo_thread,
COAP_DEMO_THREAD_NAME,
COAP_DEMO_THREAD_STACK_WORDS,
NULL,
COAP_DEMO_THREAD_PRORIOTY,
&coap_handle);
if (ret != pdPASS) {
ESP_LOGI(TAG, "create thread %s failed", COAP_DEMO_THREAD_NAME);
} }
vTaskDelete(NULL);
} }
static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
@ -149,7 +151,6 @@ static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
break; break;
case SYSTEM_EVENT_STA_GOT_IP: case SYSTEM_EVENT_STA_GOT_IP:
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
coap_server_init();
break; break;
case SYSTEM_EVENT_STA_DISCONNECTED: case SYSTEM_EVENT_STA_DISCONNECTED:
/* This is a workaround as ESP32 WiFi libs don't currently /* This is a workaround as ESP32 WiFi libs don't currently
@ -179,7 +180,6 @@ static void wifi_conn_init(void)
}; };
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) ); ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); ESP_ERROR_CHECK( esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
ESP_ERROR_CHECK( esp_wifi_start() ); ESP_ERROR_CHECK( esp_wifi_start() );
} }
@ -187,4 +187,6 @@ void app_main(void)
{ {
nvs_flash_init(); nvs_flash_init();
wifi_conn_init(); wifi_conn_init();
xTaskCreate(coap_demo_thread, "coap", 2048, NULL, 5, NULL);
} }

View File

@ -1,38 +0,0 @@
/* CoAP server Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#ifndef _COAP_SERVER_H_
#define _COAP_SERVER_H_
#include <sdkconfig.h>
/* The examples use simple WiFi configuration that you can set via
'make menuconfig'.
If you'd rather not, just change the below entries to strings with
the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
#define COAP_DEMO_THREAD_NAME "CoAP_demo"
#define COAP_DEMO_THREAD_STACK_WORDS 10240
#define COAP_DEMO_THREAD_PRORIOTY 8
/* The examples use local port number of 5683 that you can set via 'make menuconfig'.
If you'd rather not, just change the below entries to strings with
the config you want - ie #define OPENSSL_DEMO_TARGET_TCP_PORT 5683
*/
#define COAP_DEFAULT_PORT CONFIG_LOCAL_PORT_NUMBER
#define COAP_DEFAULT_TIME_SEC 5
#define COAP_DEFAULT_TIME_USEC 0
#endif