rt_size_t douban_radio_read(struct douban_radio* douban, char *buffer, rt_size_t length) { rt_size_t rx_length; char* ptr; if (douban->current >= douban->size) { douban_radio_playlist_load(douban); printf("wrong\n"); return 0; } ptr = buffer; while (length > 32) //why > 32? { if (douban->session == 0) { /* create a http session */ // rt_kprintf("open session url[%d]: %s\n", douban->current, // douban->items[douban->current].url); douban->session = http_session_open(douban->items[douban->current].url); //printf("I am here\n"); if (douban->session == 0) { /* can't open this link */ douban->current ++; // rt_kprintf("open session failed, move to %d\n", douban->current); if (douban->current >= douban->size) { douban_radio_playlist_load(douban); break; } } } /* read http client data */ rx_length = http_session_read(douban->session, ptr, length); //printf("read data from the mp3 http_session\n"); if (rx_length <= 0) { /* close this session */ http_session_close(douban->session); douban->session = 0; douban->current ++; // rt_kprintf("close session, move to %d\n", douban->current); if (douban->current >= douban->size) { douban_radio_playlist_load(douban); break; } } else { ptr += rx_length; length -= rx_length; } } return ptr - buffer; }
int douban_radio_playlist_load(struct douban_radio* douban) { rt_uint32_t index; rt_size_t length; char *buffer, *url; char *ptr; struct http_session* session; for (index = 0; index < douban->size; index ++) { free(douban->items[index].artist); free(douban->items[index].title); free(douban->items[index].url); free(douban->items[index].picture); } url = (char*)malloc(URL_SIZE); snprintf(url, URL_SIZE,DOUBAN_RADIO_URL_CHANNEL, douban->channel); //在linux下面没有sprintf_s这个,但是可以用snprintf替代,参数都不用改 session = http_session_open(url); if (session == 0) goto __exit; buffer =(char*)malloc(session->size); ptr = buffer; do { length = http_session_read(session, ptr, buffer + session->size - ptr); if (length <= 0) break; ptr += length; } while (ptr < buffer + session->size); length = ptr - buffer; printf("total %d bytes\n", (int)length); http_session_close(session); session = 0; /* parse douban song list */ douban->current = douban->size = 0; douban_radio_parse(douban, buffer, length); return 0; __exit: //if (buffer != 0) free(buffer); if (url != 0) free(url); //if (session != 0) http_session_close(session); return -1; }
void http_test(char* url) { struct http_session* session; char buffer[80]; rt_size_t length; session = http_session_open(url); if (session == RT_NULL) { rt_kprintf("open http session failed\n"); return; } do { rt_memset(buffer, 0, sizeof(buffer)); length = http_session_read(session, (rt_uint8_t*)buffer, sizeof(buffer)); rt_kprintf(buffer);rt_kprintf("\n"); } while (length > 0); http_session_close(session); }
/************ 发送图片 *************/ int send_jpg(int uart_fd, struct douban_radio *douban) { rt_size_t length; struct http_session* session; char *buffer,*ptr; int index = 0; char index_buff[1] ={0}; char protocol_buff[5]={0}; char length_buff[10]={0}; tcflush(uart_fd, TCIOFLUSH); char command_buff[1] = {JPG_INDEX}; write(uart_fd, command_buff, 1); printf("JPG_INDEX is send \n"); if(uart_read(uart_fd, index_buff, 1, 1) > 0) { index = atoi(index_buff); printf("jpg index is read %d!\n", index); session=http_session_open(douban->items[index].picture); buffer =(char*)malloc(session->size); ptr=buffer; do { length = http_session_read(session, ptr, buffer + session->size - ptr); if (length <= 0) break; ptr += length; } while (ptr < buffer + session->size); tcflush(uart_fd, TCIOFLUSH); printf("begin to send jpg's length!\n"); sprintf(length_buff ,"%d",session->size); printf("length_buff is %s\n", length_buff); write(uart_fd, length_buff, 10); printf("length is send\n\n"); printf("wait for it's ready!\n"); if(uart_read(uart_fd, protocol_buff, 1 ,2) > 0) { if(protocol_buff[0] == JPG_LENGTH_END) { printf("ready to send jpg data!\n"); write(uart_fd, buffer, (int)session->size); printf("jpg data is send!\n"); printf("wait for it's ready!\n"); if( uart_read(uart_fd, protocol_buff, 1, 8) > 0) { if(protocol_buff[0] == JPG_END) { printf("jpg_end\n"); return 1; } else { printf("error 4!\n"); } } else { printf("error 3!\n"); } } else { printf("error 2!\n"); } } else { printf("error 1!\n"); } free(buffer); } }