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操作。获取到的信息通过日志打印输出。
- 编译demo_http.c后烧录至开发板,具体过程参考Yopen 入门篇开发入门
 - 打开EPAT工具查看打印log,工具使用方法请参考工具篇抓日志工具EPAT使用指南
 
