当前位置: 首页 > 科技观察

Hi3861实现HTTPResponse数据分析

时间:2023-03-12 04:13:19 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.comHi3861的代码示例库中,介绍了http的连接,但是没有说明如何解析。当然,解析http的返回值的方法是通用的方法,不限于在openharmony中使用。1、http_parser库http-parser是一个用C语言编写的HTTP消息解析器,可以解析请求和响应,专为高性能HTTP应用而设计。它不进行任何系统调用或内存分配,不缓冲数据,并且可以随时中断。2、源码/**Copyright(c)2020海思半导体(上海)科技有限公司.*根据Apache许可证2.0版(“许可证”)获得许可;*除非遵守许可证,否则您不得使用此文件。*您可以在**http://www.apache.org/licenses/LICENSE-2.0获得许可证副本**除非适用法律要求或书面同意,否则根据许可证分发的软件*分发于“按原样”为基础,*不提供任何明示或暗示的保证或条件。*有关特定语言的管理权限和*许可证下的限制,请参阅许可证。*/#include"hi_stdlib.h"#include"lwip/sockets.h"#include"lwip/netdb.h"#include"lwip/sockets.h"#include"lwip/netifapi.h"#include"lwip/netdb.h"#include"lwip/netifapi.h"#include#include#include"lwip/sockets.h"#include"hi_mem.h"#include"hi_config.h"#include"audio_http_client.h"#include"../http_parser/http_parser.h"#include"hi_i2s.h"#include"hi_time.h"#defineHTTPC_DEMO_RECV_BUFSIZE2048*2#defineSOCK_TARGET_PORT80//#defineADDRESS"192.168.1.91"//"192.168.0.200"#defineADDRESS“121.36.121.226”boolbParsed=false;inttotal_len=10902;intframe_len=2560;charcurrent_header_key[64];voidaudio_http_parser_init();voidaudio_http_parser_exec(char*buf,intlen);/**********************************************************************************Funcdescription:demoforhttpgetaction*********************************************************************************/unsignedintaudio_http_clienti_get(){structsockaddr_inaddr={0};ints,r;charrecv_buf[HTTPC_DEMO_RECV_BUFSIZE];addr.sin_family=AF_INET;addr.sin_port=PP_HTONS(SOCK_TARGET_PORT);//地址.sin_port=my_htons(SOCK_TARGET_PORT);addr.sin_addr.s_addr=ipaddr_addr(ADDRESS);printf("addr=%d,%d,%d\r\n",addr.sin_family,addr.sin_port,addr.sin_addr.s_addr);s=my_socket(AF_INET,SOCK_STREAM,0);如果(s<0){返回1;}DEBUG_printf("...分配套接字%d\r\n",s);if(my_connect(s,(structsockaddr*)&addr,sizeof(addr))!=0){DEBUG_printf("...套接字连接失败。\r\n");my_closesocket(s);返回1;}DEBUG_printf("...已连接\r\n");int开始=0;intlength=frame_len-1;int结束=开始+长度;charget_request[512];charheader_bytes[256];intbody_recv_len=0;intdown_start_time=hi_get_milli_seconds();while(1){//DEBUG_printf("******开始********\r\n");sprintf(header_bytes,"Range:bytes=%d-%d\r\n",start,end);sprintf(get_request,"GET/sis/tts/test02.pcmHTTP/1.1\r\nContent-Type:application/x-www-form-urlencoded;charset=UTF-8\r\nConnection:Keep-Alive\r\nHost:hqx-default-sis.obs.cn-north-4.myhuaweicloud.com\r\n%s\r\n",header_bytes);如果(lwip_write(s,get_re任务,strlen(get_request))<0){my_closesocket(s);DEBUG_printf("my_closesocket\r\n");返回1;}//DEBUG_printf("...套接字发送成功。%s\r\n",header_bytes);结构timevalreceiving_timeout;/*5S超时*//*receiving_timeout.tv_sec=1;receiving_timeout.tv_usec=0;如果(my_setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&receiving_timeout,sizeof(receiving_timeout))<0){printf("setsockopt=%d,%d,%d\r\n",s,SOL_SOCKET,SO_RCVTIMEO);DEBUG_printf("...设置套接字接收超时失败\r\n");my_closesocket(s);返回1;}DEBUG_printf("...设置socket接收超时成功\r\n");*/audio_http_parser_init();/*读取HTTP响应*/do{(void)memset_s(recv_buf,sizeof(recv_buf),0,sizeof(recv_buf));r=lwip_read(s,recv_buf,sizeof(recv_buf)-1);//for(inti=0;i0);开始=开始+长度+1;结束=开始+长度;如果(结束>total_len-1)结束=total_len-1;如果(开始>total_len-1)中断;}//DEBUG_printf("...完成从套接字读取。上次读取返回=%d\r\n",r);my_closesocket(s);intdown_end_time=hi_get_milli_seconds();DEBUG_printf("下载时间=%dms\r\n",down_end_time-down_start_time);return0;}inton_header_field(http_parser*_,constchar*at,size_tlength){(void)_;//DEBUG_printf("头部字段:%.*s\n",(int)length,at);strncpy(current_header_key,在,长度th);current_header_key[length]='\0';return0;}inton_header_value(http_parser*_,constchar*at,size_tlength){(void)_;//DEBUG_printf("Header%svalue:%.*s\n",current_header_key,(int)length,at);如果(strcmp(current_header_key,"Content-Range")==0){ints=0,e=0,t=0;sscanf(at,"字节%d-%d/%d",&s,&e,&t);//DEBUG_printf("解析器=%d,%d,%d\r\n",s,e,t);total_len=t;}return0;}unsignedcharaudio_data_buff[2048];intaudio_data_len=0;inton_body(http_parser*_,constchar*at,size_tlength){(void)_;//DEBUG_printf("正文:%.*s\n",(int)length,at);memcpy(audio_data_buff,在,长度);audio_data_len=长度;//DEBUG_printf("正文:%d\n",(int)length);返回0;}inton_message_begin(http_parser*_){(void)_;//DEBUG_printf("\n***消息开始***\n\n");返回0;}inton_message_complete(http_parser*_){(void)_;//DEBUG_printf("\n***消息完成***\n\n");bParsed=true;返回0;}inton_headers_complete(http_parser*_){(void)_;//DEBUG_printf("\n***标头完成***\n\n");返回0;}http_parser_settings设置;http_parser解析器;voidaudio_http_parser_init(char*buf,intlen){http_parser_settings_init(&settings);settings.on_header_field=on_header_field;settings.on_header_value=on_header_value;settings.on_body=on_body;settings.on_headers_complete=on_headers_complete;settings.on_message_complete=on_message_complete;http_parser_init(&parser,HTTP_RESPONSE);}voidaudio_http_parser_exec(char*buf,intlen){http_parser_execute(&parser,&settings,buf,len);//执行解析过程if(bParsed){DEBUG_printf("#");audio_data_len=frame_len;hi_u32ret=hi_i2s_write(audio_data_buff,audio_data_len,1000);if(ret!=HI_ERR_SUCCESS){DEBUG_printf("hi_i2s_writefail,err=%X\n",ret);}//bParsed=false;}}3.代码概述使用http_parser库时,需要先对其进行初始化,audio_http_parser_init();需要在函数中实现回调,才能解析数据。更多信息请访问:与华为官方共建的鸿蒙技术社区https://ost.51cto.com