10a7ce71fSopenharmony_ci/* 20a7ce71fSopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED. 30a7ce71fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40a7ce71fSopenharmony_ci * you may not use this file except in compliance with the License. 50a7ce71fSopenharmony_ci * You may obtain a copy of the License at 60a7ce71fSopenharmony_ci * 70a7ce71fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80a7ce71fSopenharmony_ci * 90a7ce71fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100a7ce71fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110a7ce71fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120a7ce71fSopenharmony_ci * See the License for the specific language governing permissions and 130a7ce71fSopenharmony_ci * limitations under the License. 140a7ce71fSopenharmony_ci */ 150a7ce71fSopenharmony_ci 160a7ce71fSopenharmony_ci#include "coap.h" 170a7ce71fSopenharmony_ci#include "net.h" 180a7ce71fSopenharmony_ci#include "los_task.h" 190a7ce71fSopenharmony_ci#include "lwip/tcpip.h" 200a7ce71fSopenharmony_ci#include "lwip/udp.h" 210a7ce71fSopenharmony_ci 220a7ce71fSopenharmony_ci 230a7ce71fSopenharmony_ci#define TEST_IPV4 1 240a7ce71fSopenharmony_cistatic u32_t g_coapTestTaskid = -1; 250a7ce71fSopenharmony_cistatic int g_servRunning = 0; 260a7ce71fSopenharmony_cistatic coap_context_t *g_servCtx = NULL; 270a7ce71fSopenharmony_ci/* 280a7ce71fSopenharmony_ci * The resource 'hello' GET method handler 290a7ce71fSopenharmony_ci */ 300a7ce71fSopenharmony_cistatic void HelloHandler(coap_context_t *ctx, struct coap_resource_t *resource, coap_session_t *session, 310a7ce71fSopenharmony_ci coap_pdu_t *request, coap_binary_t *token, coap_string_t *query, coap_pdu_t *response) 320a7ce71fSopenharmony_ci{ 330a7ce71fSopenharmony_ci unsigned char buf[3]; 340a7ce71fSopenharmony_ci /* response with text "Hello World!" */ 350a7ce71fSopenharmony_ci const char* responseData = "Hello World! CoAP"; 360a7ce71fSopenharmony_ci size_t len = 0; 370a7ce71fSopenharmony_ci unsigned char *data = NULL; 380a7ce71fSopenharmony_ci (void)ctx; 390a7ce71fSopenharmony_ci (void)resource; 400a7ce71fSopenharmony_ci (void)session; 410a7ce71fSopenharmony_ci response->code = COAP_RESPONSE_CODE(205); /* 返回值205,代表连接成功 */ 420a7ce71fSopenharmony_ci coap_add_option(response, COAP_OPTION_CONTENT_TYPE, 430a7ce71fSopenharmony_ci coap_encode_var_safe(buf, 3, COAP_MEDIATYPE_TEXT_PLAIN), buf); /* 3个字节长度 */ 440a7ce71fSopenharmony_ci coap_add_data(response, strlen(responseData), (unsigned char *)responseData); 450a7ce71fSopenharmony_ci if (coap_get_data(request, &len, &data)) { 460a7ce71fSopenharmony_ci printf("Hello World! CoAP\n"); 470a7ce71fSopenharmony_ci } 480a7ce71fSopenharmony_ci} 490a7ce71fSopenharmony_civoid CoapServerThread(UINT32 uwParam1, UINT32 uwParam2, UINT32 uwParam3, UINT32 uwParam4) 500a7ce71fSopenharmony_ci{ 510a7ce71fSopenharmony_ci coap_context_t* ctx; 520a7ce71fSopenharmony_ci (void)uwParam2; 530a7ce71fSopenharmony_ci (void)uwParam3; 540a7ce71fSopenharmony_ci (void)uwParam4; 550a7ce71fSopenharmony_ci printf("[%s][%d] thread running\n", __FUNCTION__, __LINE__); 560a7ce71fSopenharmony_ci ctx = (coap_context_t*)uwParam1; 570a7ce71fSopenharmony_ci while (g_servRunning == 1) { 580a7ce71fSopenharmony_ci hi_sleep(1000); /* 休眠1000ms */ 590a7ce71fSopenharmony_ci coap_check_notify_lwip(ctx); 600a7ce71fSopenharmony_ci } 610a7ce71fSopenharmony_ci if (g_servCtx != NULL) { 620a7ce71fSopenharmony_ci coap_free_context_lwip(g_servCtx); 630a7ce71fSopenharmony_ci g_servCtx = NULL; 640a7ce71fSopenharmony_ci } 650a7ce71fSopenharmony_ci printf("[%s][%d] thread exit\n", __FUNCTION__, __LINE__); 660a7ce71fSopenharmony_ci return; 670a7ce71fSopenharmony_ci} 680a7ce71fSopenharmony_ciint CoapServerStart(void) 690a7ce71fSopenharmony_ci{ 700a7ce71fSopenharmony_ci TSK_INIT_PARAM_S stappTask; 710a7ce71fSopenharmony_ci UINT32 ret; 720a7ce71fSopenharmony_ci coap_address_t serv_addr; 730a7ce71fSopenharmony_ci coap_resource_t* hello_resource; 740a7ce71fSopenharmony_ci if (g_servRunning == 1) { 750a7ce71fSopenharmony_ci return 0; 760a7ce71fSopenharmony_ci } 770a7ce71fSopenharmony_ci g_servRunning = 1; 780a7ce71fSopenharmony_ci /* Prepare the CoAP server socket */ 790a7ce71fSopenharmony_ci coap_address_init(&serv_addr); 800a7ce71fSopenharmony_ci#if TEST_IPV4 810a7ce71fSopenharmony_ci#else 820a7ce71fSopenharmony_ci ip_addr_set_any(true, &(serv_addr.addr)); 830a7ce71fSopenharmony_ci#endif 840a7ce71fSopenharmony_ci serv_addr.port = COAP_DEFAULT_PORT; 850a7ce71fSopenharmony_ci g_servCtx = coap_new_context_lwip(&serv_addr); 860a7ce71fSopenharmony_ci if (!g_servCtx) { 870a7ce71fSopenharmony_ci return -1; 880a7ce71fSopenharmony_ci } 890a7ce71fSopenharmony_ci /* Initialize the hello resource */ 900a7ce71fSopenharmony_ci hello_resource = coap_resource_init(coap_make_str_const("hello"), 0); 910a7ce71fSopenharmony_ci coap_register_handler(hello_resource, COAP_REQUEST_GET, HelloHandler); 920a7ce71fSopenharmony_ci coap_add_resource(g_servCtx, hello_resource); 930a7ce71fSopenharmony_ci /* create a thread task */ 940a7ce71fSopenharmony_ci stappTask.pfnTaskEntry = (TSK_ENTRY_FUNC)CoapServerThread; 950a7ce71fSopenharmony_ci stappTask.uwStackSize = 10 * LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; /* task为10 */ 960a7ce71fSopenharmony_ci stappTask.pcName = "coap_test_task"; 970a7ce71fSopenharmony_ci stappTask.usTaskPrio = 11; /* task为11 */ 980a7ce71fSopenharmony_ci stappTask.uwResved = LOS_TASK_STATUS_DETACHED; 990a7ce71fSopenharmony_ci stappTask.auwArgs[0] = (UINT32)g_servCtx; 1000a7ce71fSopenharmony_ci printf("task create CoapServerThread\n"); 1010a7ce71fSopenharmony_ci ret = LOS_TaskCreate(&g_coapTestTaskid, &stappTask); 1020a7ce71fSopenharmony_ci if (ret != 0) { 1030a7ce71fSopenharmony_ci dprintf("CoapServerThread create failed ! \n"); 1040a7ce71fSopenharmony_ci return -1; 1050a7ce71fSopenharmony_ci } 1060a7ce71fSopenharmony_ci return 0; 1070a7ce71fSopenharmony_ci} 1080a7ce71fSopenharmony_civoid CoapServerStop(void) 1090a7ce71fSopenharmony_ci{ 1100a7ce71fSopenharmony_ci if (g_servRunning == 0) { 1110a7ce71fSopenharmony_ci printf("[%s][%d] not running\n", __FUNCTION__, __LINE__); 1120a7ce71fSopenharmony_ci return; 1130a7ce71fSopenharmony_ci } 1140a7ce71fSopenharmony_ci if (g_servCtx != NULL) { 1150a7ce71fSopenharmony_ci coap_free_context_lwip(g_servCtx); 1160a7ce71fSopenharmony_ci g_servCtx = NULL; 1170a7ce71fSopenharmony_ci } 1180a7ce71fSopenharmony_ci g_servRunning = 0; 1190a7ce71fSopenharmony_ci printf("[%s][%d] stopped\n", __FUNCTION__, __LINE__); 1200a7ce71fSopenharmony_ci return; 1210a7ce71fSopenharmony_ci} 1220a7ce71fSopenharmony_civoid NetDemoTest(void) 1230a7ce71fSopenharmony_ci{ 1240a7ce71fSopenharmony_ci printf("coapserviceTest start\r\n"); 1250a7ce71fSopenharmony_ci CoapServerStart(); 1260a7ce71fSopenharmony_ci}