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使用指南