Skip to content

HTTP连接服务器

本文档介绍了HTTP连接服务器的大致流程,通过demo_http.c举例演示

HTTP连接服务器流程

HTTP连接服务器的大致流程如下:

检查网络状态

循环检查网络注册状态,直到设备成功注册到本地网络或漫游网络。

调用接口:yopen_nw_get_reg_status(uint8_t nSim, yopen_nw_reg_status_info_s *reg_info);

参数:

nsim SIM卡卡槽

reg_info 网络状态

    do{
        yopen_nw_get_reg_status(0, &nw_status);//获取网络状态
        yopen_rtos_task_sleep_ms(1000);
        DEMO_HTTP_TRACE("==========nw_status old %d==========", nw_status.data_reg.state);
        if(nw_status.data_reg.state == YOPEN_NW_REG_STATE_DENIED)
        {
            DEMO_HTTP_TRACE("network reg denied exit !!!!");
            goto exit;//如果网络注册被拒绝,则打印错误信息并跳转到 exit 标签处退出任务
        }
    }while(!(nw_status.data_reg.state == YOPEN_NW_REG_STATE_HOME_NETWORK || nw_status.data_reg.state == YOPEN_NW_REG_STATE_ROAMING));//当网络成功连接后退出检测

初始化 HTTP 客户端上下文

HttpClientContext 结构体分配内存,并初始化其成员变量。设置发送和接收超时时间、套接字、PDP ID、内存保存标志和加密套件等参数。

    clientContext = malloc(sizeof(HttpClientContext));
    memset(clientContext, 0, sizeof(HttpClientContext));
    clientContext->timeout_s = 2;  //设置默认的发送超时时间为2秒,避免TCP长时间等待
    clientContext->timeout_r = 20;  //设置默认的接收超时时间为20秒
    clientContext->socket = -1; // 初始化套接字为-1,表示尚未建立连接
    clientContext->pdpId = 1; // 设置PDP ID为1
    clientContext->saveMem = 1; // 设置内存保存标志为1
    clientContext->ciphersuite[0] = 0xFFFF; // 初始化加密套件的第一个元素为0xFFFF

建立HTTP连接

调用 httpConnect 函数连接到指定的 URL,并检查连接是否成功。

调用接口:httpConnect(HttpClientContext context, const char url);

参数:context:HTTP 客户端配置信息

url:要连接的目标网址

    result = httpConnect(clientContext, HTTP_URL);// 调用httpConnect函数连接到指定的URL,返回连接结果
    if(result != HTTP_OK)
    {
        DEMO_HTTP_TRACE("httpConnect error %d!!!", result);
        goto exit;
    }
    DEMO_HTTP_TRACE("httpConnect URL %s OK", HTTP_URL);

发送 HTTP 请求

调用 httpSendRequest 函数发送 HTTP GET 请求,并检查请求发送是否成功。

调用接口: httpSendRequest(HttpClientContext context, const char url, HTTP_METH method, HttpClientData * data);

参数:context HTTP 客户端配置信息

url:目标网址

method:HTTP的请求方法

data:请求数据

    result = httpSendRequest(clientContext, HTTP_URL, HTTP_GET, clientData);// 调用httpSendRequest函数发送HTTP GET请求,返回请求发送结果
    if(result != HTTP_OK)
    {
        DEMO_HTTP_TRACE("httpSendRequest error %d!!!", result);
        goto exit;
    }
    DEMO_HTTP_TRACE("httpSendRequest OK");

接收 HTTP 响应

使用 do-while 循环调用 httpRecvResponse 函数接收 HTTP 响应,直到接收到完整的响应或出现错误。

调用接口:httpRecvResponse(HttpClientContext* context, HttpClientData * data);

参数: context HTTP 客户端配置信息

data 响应数据

    do {
        DEMO_HTTP_TRACE("httpRecvResponse loop.");
        memset(clientData->headerBuf, 0, clientData->headerBufLen);
        memset(clientData->respBuf, 0, clientData->respBufLen);
        result = httpRecvResponse(clientContext, clientData); // 调用httpRecvResponse函数接收HTTP响应,返回接收结果
        DEMO_HTTP_TRACE("httpRecvResponse loop.result %d", result);// 打印接收响应循环的结果,包含结果码
        if(result == HTTP_OK || result == HTTP_MOREDATA){// 如果接收结果为HTTP_OK或HTTP_MOREDATA,表示接收正常或还有更多数据
            headerLen = strlen(clientData->headerBuf);
            if(headerLen > 0)
            {
                DEMO_HTTP_TRACE("total content length=%d", clientData->recvContentLength);
            }
            count += clientData->blockContentLen;
            DEMO_HTTP_TRACE("has recv=%d", count);
            DEMO_HTTP_TRACE("body buf %s", clientData->respBuf);
        }
    } while (result == HTTP_MOREDATA || result == HTTP_CONN); // 当接收结果为HTTP_MOREDATA或HTTP_CONN时,继续循环接收响应

举例演示

demo_http.c通过调用以上接口实现连接HTTP服务器并进行GET操作。获取到的信息通过日志打印输出。