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}