6. Http client¶
6.1. 总览¶
本示例主要介绍如何创建一个socket并连接到指定的Http服务器获取数据的过程。
6.2. 准备和使用步骤¶
使用之前需要准备可用的URL以及网络。
使用步骤:
编译
customer_app/sdk_app_http_client_socket
工程并下载工程;在终端输入开启wifi的命令:
stack_wifi
,输入连接wifi的命令:wifi_sta_connect <name> <key>
,并确认wifi连接成功(如输入:wifi_sta_connect bl_test_005 12345678);使用
http
命令通过socket的方式进行下载。
6.3. 应用实例¶
通过
hostname
获取hostinfo
struct hostent *hostinfo = gethostbyname(hostname);
if (!hostinfo) {
printf("gethostbyname Failed\r\n");
return -1;
}
创建一个
socket
连接并发送http请求。
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Error in socket\r\n");
return -1;
}
/*---Initialize server address/port struct---*/
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(PORT);
dest.sin_addr = *((struct in_addr *) hostinfo->h_addr);
//char ip[16];
uint32_t address = dest.sin_addr.s_addr;
char *ip = inet_ntoa(address);
printf("Server ip Address : %s\r\n", ip);
/*---Connect to server---*/
if (connect(sockfd,
(struct sockaddr *)&dest,
sizeof(dest)) != 0) {
printf("Error in connect\r\n");
return -1;
}
/*---Get "Hello?"---*/
memset(buffer, 0, MAXBUF);
char wbuf[]
= "GET /ddm/ContentResource/music/204.mp3 HTTP/1.1\r\nHost: nf.cr.dandanman.com\r\nUser-Agent: wmsdk\r\nAccept: */*\r\n\r\n";
write(sockfd, wbuf, sizeof(wbuf) - 1);
获取http响应的数据,完成时打印获取数据花费的时间和传输的速度。
while (1) {
ret = read(sockfd, recv_buffer, BUFFER_SIZE);
if (ret == 0) {
printf("eof\n\r");
break;
} else if (ret < 0) {
printf("ret = %d, err = %d\n\r", ret, errno);
break;
} else {
total += ret;
/*use less debug*/
if (0 == ((debug_counter++) & 0xFF)) {
printf("total = %d, ret = %d\n\r", total, ret);
}
//vTaskDelay(2);
if (total > 82050000) {
ticks_end = xTaskGetTickCount();
time_consumed = ((uint32_t)(((int32_t)ticks_end) - ((int32_t)ticks_start))) / 1000;
printf("Download comlete, total time %u s, speed %u Kbps\r\n",
(unsigned int)time_consumed,
(unsigned int)(total / time_consumed * 8 / 1000)
);
break;
}
}
关闭
socket
。
close(sockfd);
在
customer_app/sdk_app_http_client_socket/sdk_app_http_client_socket/demo.c
中static void _cli_init()
的函数里调用http_client_cli_init()
初始化http命令