AliOS Things 3.0应用笔记:http client简单应用

简介: AliOS Things 3.0版本新增加了httpc组件(http 客户端组件),httpc组件支持多种RESTful的API调用,包括GET、POST、PUT、HEAD等,也支持https安全协议。


给AliOS Things一颗STAR(前往GitHub关注我们)

目录

          简介

          准备工作

          创建应用工程

          编写应用代码

                添加http组件

                天气API说明

                使用http组件

                完整源码

            编译运行

           参考文档

简介

AliOS Things 3.0版本于9月27日在云栖大会正式发布,在新版本中带来了全新的应用开发框架,帮助用户快速构建自己的应用。使用户可以更专注于自身应用的开发。

AliOS Things 3.0版本新增加了httpc组件(http 客户端组件),httpc组件支持多种RESTful的API调用,包括GET、POST、PUT、HEAD等,也支持https安全协议。

准备工作

参考AliOS Things Environment Setup 和AliOS Things 3.0 应用开发指南 搭建好AliOS Things 3.0的应用开发环境。

创建应用工程

参考AliOS Things 3.0 应用开发指南 > AliOS Studio中创建应用工程创建好你的应用工程。

本示例新建的应用工程名称为httpclient_app,选择的开发板为developerkit。

编写应用代码

新建好的应用工程文件如下面所示:

.httpclient_app├──.aos# AliOS Things 3.0 应用工程描述├──.vscode# AliOS Studio 配置文件├── Config.in# Menuconfig 配置文件├── README.md# 应用说明文档├── aos.mk# 编译文件├── app_main.c# 应用示例代码└── k_app_config.h# 内核配置

添加http组件

aos-cube会自动根据include的头文件来自动添加组件。

http组件需要用到全局宏:BUILD_AOS,所以需要在aos.mk中额外增加一个全局宏定义:

GLOBAL_DEFINES += BUILD_AOS

天气API说明

本示例使用http组件,发送http get请求获取天气数据,天气的API是中国天气网提供的API:http://www.weather.com.cn/data/sk/101210101.html,其中101210101代表是杭州。

使用curl命令可以测试该API接口:

$ curl http://www.weather.com.cn/data/sk/101210101.html{"weatherinfo":{"city":"杭州","cityid":"101210101","temp":"24.8","WD":"东北风","WS":"小于3级","SD":"81%","AP":"1000.3hPa","njd":"暂无实况","WSE":"<3","time":"17:50","sm":"2.1","isRadar":"1","Radar":"JC_RADAR_AZ9571_JB"}}%

或者也可以在浏览器打开该链接测试API接口。

使用http组件

本示例主要使用到了http如下接口,详细的http对外提供的接口和参数说明请参考include/network/http/http.h

/* httpc 初始化 */int8_thttp_client_initialize(void);/* 创建一个httpc实例 */httpc_handle_thttpc_init(httpc_connection_t*settings);/* 销毁一个httpc实例 */int8_thttpc_deinit(httpc_handle_thttpc);/* 发送http请求 */int8_thttpc_send_request(httpc_handle_thttpc,int8_tmethod,char*uri,constchar*hdr,constchar*content_type,constchar*param,uint16_tparam_len);/* 构建http请求header */int32_thttpc_construct_header(char*buf,uint16_tbuf_size,constchar*name,constchar*data);/* 等待接口http返回 */int32_thttpc_recv_response(httpc_handle_thttpc,uint8_t*rsp,uint32_trsp_size,http_rsp_info_t*info,uint32_ttimeout);

完整源码

本示例应用的工程源码点击这里下载。

注意:需要更改app_main.c中的WIFI_SSID 和 WIFI_PASSWD 为你的路由器信息。

aos.mk:

NAME := httpclient_app$(NAME)_MBINS_TYPE := app$(NAME)_VERSION := 1.0.0$(NAME)_SUMMARY := httpclient_app$(NAME)_SOURCES += app_main.cGLOBAL_DEFINES += BUILD_AOSGLOBAL_INCLUDES += ./$(NAME)_COMPONENTS_CUSTOMIZED := http yloop$(NAME)_COMPONENTS += $($(NAME)_COMPONENTS_CUSTOMIZED)

app_main.c:

/*

* Copyright (C) 2015-2017 Alibaba Group Holding Limited

*/#include<stdio.h>#include<aos/kernel.h>#include<aos/yloop.h>#include<http.h>#include<network/network.h>#defineWIFI_SSID"aiot"#defineWIFI_PASSWD"12345678"#defineREQ_BUF_SIZE 2048#defineRSP_BUF_SIZE 4096#defineHTTP_UP_HDR_SIZE 128/* weather api hostname */#defineWEATHER_HOSTNAME"http://www.weather.com.cn/"/* weather api uri */#defineWEATHER_URI"data/sk/101210101.html"statichttpc_handle_thttpc_handle =0;statichttpc_connection_tsettings;/* buffer for send & receive */staticuint8_trsp_buf[RSP_BUF_SIZE] = {0};staticuint8_treq_buf[REQ_BUF_SIZE] = {0};/* send http get request */char*get_weather(void){intfd;charhdr[HTTP_UP_HDR_SIZE] = {0};int32_tret;http_rsp_info_trsp_info;    http_client_initialize();/* create socket */if((fd = socket(AF_INET, SOCK_STREAM,0)) <0) {printf("alloc socket fd fail\n");gotoexit;    }memset(&settings,0,sizeof(settings));    settings.socket      = fd;    settings.server_name  = WEATHER_HOSTNAME;    settings.req_buf      = req_buf;    settings.req_buf_size = REQ_BUF_SIZE;/* httpc initialization */if((httpc_handle = httpc_init(&settings)) ==0) {printf("http session init fail\n");        close(fd);gotoexit;    }/* construct httc header: set accept content type */if((httpc_construct_header(            hdr, HTTP_UP_HDR_SIZE,"Accept","text/xml,text/javascript,text/html,application/json")) <0) {printf("http construct header fail\n");gotoexit;    }/* send get request */if((httpc_send_request(httpc_handle, HTTP_GET, WEATHER_URI, hdr,"application/json",NULL,0)) != HTTP_SUCCESS) {printf("httpc_send_request fail\n");gotoexit;    }/* get response */if((httpc_recv_response(httpc_handle, rsp_buf, RSP_BUF_SIZE, &rsp_info,10000)) <0) {printf("httpc_recv_response fail\n");gotoexit;    }printf("http session %x, buf size %d bytes, recv %d bytes data", httpc_handle,        RSP_BUF_SIZE, rsp_info.rsp_len);// if (rsp_info.rsp_len > 0) {//    printf("%s", rsp_buf);// }if(rsp_info.message_complete) {// printf("message_complete");close(settings.socket);        httpc_deinit(httpc_handle);returnrsp_info.body_start;    }exit:    close(settings.socket);    httpc_deinit(httpc_handle);returnNULL;}/* task for get weather */staticvoidget_weather_task(void*arg){char*weather_data =NULL;/* get weather data */if((weather_data = get_weather()) !=NULL){        aos_msleep(200);printf("********************** weather data **********************\r\n");printf("%s\r\n", weather_data);printf("**********************************************************\r\n");return;    }printf("weather request error\r\n");}/* wifi event */staticvoidwifi_service_event(input_event_t*event,void*priv_data){staticcharip[16] = {0};staticintget_weather_started =0;if(event->type != EV_WIFI && event->code != CODE_WIFI_ON_GOT_IP) {return;    }    netmgr_wifi_get_ip(ip);/* start up only once */if(get_weather_started ==1) {return;    }/* check if ip is available */if(0==strcmp(ip,"0.0.0.0")) {printf("ip invailable\n");return;    }    get_weather_started =1;printf("wifi connected, ip:%s\n", ip);    aos_task_new("get_weather", get_weather_task,NULL,1024*4);}/* task for connect wifi */staticvoidwifi_connect(void*arg){/* network init */netmgr_init();    netmgr_start(false);    aos_msleep(100);/* connect to wifi */printf("\r\nConnecting to wifi: ssid:[%s], passwd:[%s]\r\n", WIFI_SSID, WIFI_PASSWD);    netmgr_connect(WIFI_SSID, WIFI_PASSWD,10*1000);}/**********************user code*************************/intapplication_start(intargc,char*argv[]){#ifdefWITH_SALsal_add_dev(NULL,NULL);    sal_init();#endif/* register wifi event */aos_register_event_filter(EV_WIFI, wifi_service_event,NULL);    aos_task_new("wifi_connect", wifi_connect,NULL,2048);/* loop for schedule */aos_loop_run();}

编译运行

点击编译和烧录。运行后,在串口日志最后面就能看的获取到的天气信息。

运行效果:

[  0.050]AOS sensor:  drv_acc_st_lsm6dsl_init successfully[  0.060]AOS sensor:  drv_gyro_st_lsm6dsl_init gyro do not need reset[  0.070]AOS sensor:  drv_gyro_st_lsm6dsl_init successfully[  0.080]AOS sensor:  drv_als_liteon_ltr553_init successfully[  0.090]AOS sensor:  drv_ps_liteon_ltr553_init successfully[  0.100]AOS sensor:  drv_baro_bosch_bmp280_init successfully[  0.110]AOS sensor:  drv_mag_memsic_mmc3680kj_init successfully[  0.120]AOS sensor:  drv_humi_sensirion_shtc1_init successfully[  0.130]AOS sensor:  drv_temp_sensirion_shtc1_init successfully            Welcome to AliOS Things[  0.150]sal_wifi Uart dev is not configured, use the default cfguart 1 enter uart_receive_start_dma instance 0x40004800ip invailableConnecting to wifi: ssid:[aiot], passwd:[12345678]wifi connected, ip:192.168.43.111[[hhttttppcc]][[000088665500]]  hhttttppcc__sseenndd__rreeqquueesstt,,  sseenndd  rreeqquueesstt  hheeaaddeerrvGoErTk s/pdaactea//gsikt/h1u0b1/2A1l0i1O0S1-.Thhtimnlg sH/TbToPa/r1d./1d2Ulsoepre-rAkgietn/ta:o sA/lbioOaSr-dH_TcTlPi-.Ccl i2e1n6t1Cache-Control: no-cacheConnection: closeHost: www.weather.com.cnAccept: text/xml,text/javascript,text/html,application/jsonContent-Type: application/jsonsocket 0, len 238[httpc][009130] httpc_send_request, connect 0[httpc][009160] httpc_send_request, send 238, ret 0[httpc][019170] on_message_begin, HTTP response (headers), method GET[httpc][019170] on_status, HTTP response status OK[httpc][019180] print_header_field, len 4, Date[httpc][019190] print_header_field, len 29, Wed, 09 Oct 2019 07:32:13 GMT[httpc][019200] print_header_field, len 12, Content-Type[httpc][019200] print_header_field, len 9, text/html[httpc][019210] print_header_field, len 17, Transfer-Encoding[httpc][019220] print_header_field, len 7, chunked[httpc][019220] print_header_field, len 10, Connection[httpc][019230] print_header_field, len 5, close[httpc][019240] print_header_field, len 6, Server[httpc][019240] print_header_field, len 9, openresty[httpc][019250] print_header_field, len 16, X-Xss-Protection[httpc][019260] print_header_field, len 1, 1[httpc][019260] print_header_field, len 10, Set-Cookie[httpc][019270] print_header_field, len 8, HttpOnly[httpc][019280] print_header_field, len 3, Age[httpc][019280] print_header_field, len 4, 2068[httpc][019290] print_header_field, len 5, X-Via[httpc][019300] print_header_field, len 125, 1.1 PSbjsdBGPvu28:10 (Cdn Cache Server V2.0), 1.1 zhdx147:10 (Cdn Cache Server V2.0), 1.1 huadxin69:7 (Cdn Cache Server V2.0)[httpc][019320] on_headers_complete, headers complete[httpc][019320] on_message_complete, HTTP GET response (complete)http session 20002298, buf size 4096 bytes, recv 578 bytes data[  19.340]sal_wifi HAL_SAL_Close 778 failed********************** weather data **********************{"weatherinfo":{"city":"杭州","cityid":"101210101","temp":"24.8","WD":"东北风","WS":"小于3级","SD":"81%","AP":"1000.3hPa","njd":"暂无实况","WSE":"<3","time":"17:50","sm":"2.1","isRadar":"1","Radar":"JC_RADAR_AZ9571_JB"}}**********************************************************

参考文档

AliOS Things 3.0 应用开发指南

使用AliOS Things3.0 快速构建用户应用BlinkAPP

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容