不能直接拷贝截图,真是麻烦
草
/*
* GetFile.c
*
* Created on: 2015年9月22日
* Author: Administrator
*/
#include "GetFile.h"
static unsigned int S_DestinationIP;
static unsigned char G_Buff[6000];
static unsigned char G_BuffLen = 6000;
static int readGetResponse(HTTPCli_Handle httpClient) {
long lRetVal = 0;
int readByteLen;
int allReadByte;
int oneReadByte;
int bytesRead = 0;
int id = 0;
unsigned long len = 0;
int json = 0;
char *dataBuffer = NULL;
bool moreFlags = 1;
int i;
//设置的是响应头
//这个就是一个过滤器,过滤出我们想要的响应头的信息
const char *ids[6] = {
HTTPCli_FIELD_NAME_CONTENT_LENGTH,
HTTPCli_FIELD_NAME_CONTENT_TYPE,
HTTPCli_FIELD_NAME_DATE,
HTTPCli_FIELD_NAME_SERVER,
HTTPCli_FIELD_NAME_TRANSFER_ENCODING,
NULL };
/* Read HTTP POST request status code */
lRetVal = 0;
//获取相应状态
//成功是200,其他的不做考虑
G_BuffLen = 0;
lRetVal = HTTPCli_getResponseStatus(httpClient);
if (lRetVal > 0) {
switch (lRetVal) {
case 200:
UART_PRINT("HTTP Status 200\n\r");
//把过滤器跟httpClient关联起来
HTTPCli_setResponseFields(httpClient, (const char **) ids);
//用一个循环来处理响应头
//如果有对应的响应头字段的话,id等于ids的索引
while ((id = HTTPCli_getResponseField(httpClient, (char *) G_Buff,
sizeof(G_Buff), &moreFlags)) != HTTPCli_FIELD_ID_END) {
switch (id) {
case 0: { //HTTPCli_FIELD_NAME_CONTENT_LENGTH
//获取到Content-Length的信息,这个就是主体的长度
//请注意这个不一定是有的,。请注意,而且我们后面是需要这个字段的值
//抓包又抓不到,网上又没有好的调试用具,最后模拟post的数据提交,才发现
//我的服务器一直不发出这个字段。。。导致我很伤心
readByteLen = strtoul((char *) G_Buff, NULL, 10);
UART_PRINT("\r\n%s", HTTPCli_FIELD_NAME_CONTENT_LENGTH);
UART_PRINT(" : %d\r\n", readByteLen);
}
break;
case 1: /* HTTPCli_FIELD_NAME_CONTENT_TYPE */
{
UART_PRINT("\r\n%s", HTTPCli_FIELD_NAME_CONTENT_TYPE);
UART_PRINT(" : %s\r\n", G_Buff);
}
break;
case 2: /* HTTPCli_FIELD_NAME_DATE */
{
UART_PRINT("\r\n%s", HTTPCli_FIELD_NAME_DATE);
UART_PRINT(" : %s\r\n", G_Buff);
}
break;
case 3: /* HTTPCli_FIELD_NAME_SERVER */
{
UART_PRINT("\r\n%s", HTTPCli_FIELD_NAME_SERVER);
UART_PRINT(" : %s\r\n", G_Buff);
}
break;
case 4: {/* HTTPCli_FIELD_NAME_TRANSFER_ENCODING */
UART_PRINT("\r\n%s", HTTPCli_FIELD_NAME_TRANSFER_ENCODING);
UART_PRINT(" : %s\r\n", G_Buff);
}
break;
default: {
UART_PRINT("Wrong filter id = %d\r\n", id);
lRetVal = -1;
goto end;
}
}
}
//如果你能获取长度,那么就能使用这个函数获取到主体部分
//不然你得用HTTPCli_readRawResponseBody这个来获取,这个大概 就是获取原始的主体的内容
//HTTPCli_readResponseBody获取到的是经过处理过的主体的内容
moreFlags = 1;
while(moreFlags) {
oneReadByte = HTTPCli_readResponseBody(httpClient, (char *) G_Buff,
sizeof(G_Buff) -1 , &moreFlags);
if (oneReadByte < 0) {
UART_PRINT("Failed to received response body\n\r");
lRetVal = bytesRead;
goto end;
} else {
for(i = 0; i < oneReadByte;i++){
UART_PRINT("%c",G_Buff[i]);
}
allReadByte = allReadByte + oneReadByte;
}
}
UART_PRINT("HTTP Status 200 end \r\n");
break;
case 404:
UART_PRINT("File not found. \r\n");
/* Handle response body as per requirement.
Note:
Developers are advised to take appopriate action for HTTP
return status code else flush the response body.
In this example we are flushing response body in default
case for all other than 200 HTTP Status code.
*/
default:
/* Note:
Need to flush received buffer explicitly as library will not do
for next request.Apllication is responsible for reading all the
data.
*/
UART_PRINT("HTTP Status %d\n\r", lRetVal);
break;
}
} else {
UART_PRINT("Failed to receive data from server.\r\n");
lRetVal = -1;
goto end;
}
end:
return lRetVal;
}
extern signed int siIp_StrToInt(char *cpIp, unsigned int *uipIp);
static int ConnectToHTTPServer(HTTPCli_Handle httpClient) {
long lRetVal = -1;
struct sockaddr_in addr;
//转化IP
siIp_StrToInt("103.44.145.245", &S_DestinationIP);
/* Set up the input parameters for HTTP Connection */
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = sl_Htonl(S_DestinationIP);
/* Testing HTTPCli open call: handle, address params only */
//初始化httpClient
HTTPCli_construct(httpClient);
//连接服务器
lRetVal = HTTPCli_connect(httpClient, (struct sockaddr *) &addr, 0, NULL);
if (lRetVal < 0) {
UART_PRINT("Connection to server failed. error(%d)\n\r", lRetVal);
ASSERT_ON_ERROR(-3);
} else {
UART_PRINT("Connection to server created successfully\r\n");
}
return 0;
}
static int HTTPGetMethod(HTTPCli_Handle httpClient) {
bool moreFlags = 1;
bool lastFlag = 1;
char tmpBuf[8];
long lRetVal = 0;
char *str, *strOut;
//设置头部
//头部就是名跟值的对应关系、
//
HTTPCli_Field fields[4] = {
{ HTTPCli_FIELD_NAME_HOST, "hytgab.oicp.net" }, {
HTTPCli_FIELD_NAME_ACCEPT, "*/*" },
{HTTPCli_FIELD_NAME_CONTENT_LENGTH, "0"},{
NULL, NULL } };
/* Set request header fields to be send for HTTP request. */
//设置头部到httpClient
HTTPCli_setRequestFields(httpClient, fields);
moreFlags = 0;
//发送头部信息
//当moreFlags = 1,表明我们需要发送更多的字段
lRetVal = HTTPCli_sendRequest(httpClient, HTTPCli_METHOD_GET,
"/smarthw_bae/test.img", moreFlags);
if (lRetVal < 0) {
UART_PRINT("Failed to send HTTP POST request header.\n\r");
return lRetVal;
}
//处理响应
lRetVal = readGetResponse(httpClient);
HTTPCli_disconnect(httpClient);
HTTPCli_delete(httpClient);
return lRetVal;
}
void vGetFileTestTask(void *pvParameters) {
int tick = 0;
HTTPCli_Struct httpClient;
scNetStaInit();
osi_Sleep(1000);
UART_PRINT("vHttpToServer\r\n");
//连接到服务器,httpClient就是内部需要的一个结构体,
ConnectToHTTPServer(&httpClient);
HTTPGetMethod(&httpClient);
while (1) {
osi_Sleep(1000);
}
}
/*
* Ge