123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- /*================================================================
- Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
- Quectel Wireless Solution Proprietary and Confidential.
- =================================================================*/
- /*=================================================================
- EDIT HISTORY FOR MODULE
- This section contains comments describing changes made to the module.
- Notice that changes are listed in reverse chronological order.
- WHEN WHO WHAT, WHERE, WHY
- ------------ ------- -------------------------------------------------------------------------------
- =================================================================*/
- /*
- * brief: get method
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "ql_api_osi.h"
- #include "ql_log.h"
- #include "ql_api_datacall.h"
- #include "ql_http_client.h"
- #include "ql_fs.h"
-
- #define ROOT_CRT_PATH "UFS:root.crt"
- #define CLIENT_KEY_PATH "UFS:client.key"
- #define CLIENT_CRT_PATH "UFS:client.crt"
-
- #define QL_HTTP_LOG_LEVEL QL_LOG_LEVEL_INFO
- #define QL_HTTP_LOG(msg, ...) QL_LOG(QL_HTTP_LOG_LEVEL, "ql_HTTP", msg, ##__VA_ARGS__)
- #define QL_HTTP_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_HTTP", msg, ##__VA_ARGS__)
-
- struct cert_array_t {
- char *path;
- char *data;
- };
- #ifndef USE_CUST_KEY
- #define USE_CUST_KEY 0 // 自定义http证书、秘钥等, 默认关闭0
- #endif
- #if USE_CUST_KEY
- #define root_crt "-----BEGIN CERTIFICATE-----\n\
- MIIDYTCCAkkCFFr50PfFXMCG+Lg5XoZ1mPeMJ3P9MA0GCSqGSIb3DQEBCwUAMG0x\n\
- CzAJBgNVBAYTAmNuMQswCQYDVQQIDAJoZjELMAkGA1UEBwwCaGYxDTALBgNVBAoM\n\
- BHRlc3QxDTALBgNVBAsMBHRlc3QxDTALBgNVBAMMBHJvb3QxFzAVBgkqhkiG9w0B\n\
- CQEWCHJvb3QuY29tMB4XDTIxMDQyMDAxMjU0M1oXDTMxMDQxODAxMjU0M1owbTEL\n\
- MAkGA1UEBhMCY24xCzAJBgNVBAgMAmhmMQswCQYDVQQHDAJoZjENMAsGA1UECgwE\n\
- dGVzdDENMAsGA1UECwwEdGVzdDENMAsGA1UEAwwEcm9vdDEXMBUGCSqGSIb3DQEJ\n\
- ARYIcm9vdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDG3HTp\n\
- zAarO7JJIfiDQTi8nsoAIYjAIDDY6PTdylLs/F5HJtiqWr1ZpyfC11hwRofFIE0u\n\
- i1V8BUEGaIYb3UgN8/y8w483Fi7+kZVm3NRK1yo2oMqvTQyMZzhqOv7hdsv17qdD\n\
- AN21iS7jna29Qzjcrt4jwZ1eRZtUXtZiVMZ/3UT3PKaJTtllVxVaDXhPMPuNh4w3\n\
- jA2aNlLqPc21zSIvHhFHQNHsNWKlxBvchomWKRpdDpW7D32RnjlCzYW4/RiHeCQa\n\
- 7+fdOpaUDuR8RIG8pDK5x3G4t8hcisGl88T0pqKmHNaG0WO6VqKHmOaSWq2+Gzmo\n\
- WZTLO0NPxcJGTGEXAgMBAAEwDQYJKoZIhvcNAQELBQADggEBABcdf529CGJ+QwgS\n\
- UBXtVubvZIsUKznFpFnVV/jvqjRTkQgHbohtkba6mCgGYYBUnc6uEVNXx1fVlXX/\n\
- 3mT+iC5zZh2dkNM8covcOCmI6yih9uwgdPURu56/clsY/8IqdH8DTcrDylqH1yVS\n\
- zsxRKTNvfWltO2avorufUg1swKCF5SsmK+SYpVpZYosCCfGe2PAdhllVpxtbrv2z\n\
- VDy2DqbWhYU0GOB6fd9trxeshHVAsyk5VczGRnPoy1yZ/h8hwnhUk5WuvEY0n3ce\n\
- ZxASiQTSVs4sC7H5navGt0dZH7W9VPvszyYdC7c1Dh+pbdn59d/YHYF+SmLwLX9/\n\
- c+kx7+E=\n\
- -----END CERTIFICATE-----"
-
- #define client_key "-----BEGIN RSA PRIVATE KEY-----\n\
- MIIEowIBAAKCAQEAx+raeEvE+/teiTFcAxYYJAMaePmtuUGfe5lcysRQTALSTmT1\n\
- VccV4HXai73Q3KS12lxeoc/ib/z+8cyoEAPATyYAUV8tDh76hOcgUX5g0hxvzA7H\n\
- 65xrgytGCL+CoU2eM6mDvLNo4tCNKxFRtYvgoq3zVaS57cK7WykagnsIawYl2ivz\n\
- BrbDchOv5fi+g/uJfRYFVTl54zbSSFUFar91q6QLEWENjKA8r4aTPsiIFARYIQly\n\
- OI7GHpH8QrNSOspdBVByUqpVXDJFBiX748uijp72cVNcye4pDVf27Iip6S0FCLc0\n\
- tIWwKnl5/d3IZIUG9yCXFEB933u7useVjoniYQIDAQABAoIBAQCla3silu+D4Vc0\n\
- BhewphOLmNXKzC4nYFlqmFfjn9UhUCRcocUvGPDNLjeL8aBlMhUXfd7/3Vfselcq\n\
- FMHrnm7+Dt+sdSh+yrtYRTbEt+G9ebI4EvLxzhhYDPKCQpUAi40gCl/rQDjFlPN6\n\
- c3Y81mUltvHmJ8uBJOSKZdR9qvgoNRLBJqk+ZAQzUK6iNbdEOZRkFyO7tJ0aI+QH\n\
- L3bAkqaimxku1QSCzE5dQ2JC9scFBhUNyBB+N7Gb03oYobozBPJu5LKCY0BpjRAM\n\
- crIEa3k9RPA0BLOQP51byBgKvwy8YK/P3ddVkb+W55fIm/ukjKuxUF1QiD44Kiql\n\
- U6hDlWcBAoGBAPLb/oO0kXPk71HQrTpSVQJZ21Xh+hAPRLntEJSsFrDIjYNheNX5\n\
- bcKJqR3JyA+NTJb5OZedAPYv5xtdWBS9HrMspMMMxZ1+0NbQQL/5rjEVoX8yqA5r\n\
- H1QWfq1RABfpOYjKVDal7H76VJF/Zi+Gbg4dPzUt5HFU1lFApObTEjR5AoGBANK8\n\
- Cq2rGUUX2qg0gd/OZW85Ov0CUwd9awNc2x6VaWG+gMSiEv2fiv8Ka2MvlQjjtmds\n\
- S8/G2jIbxkAHddopXGdXIsF2Pr2Bzw8bgKtPliMVte3dYOOoHdTt6P/MaFbNtwoJ\n\
- CKPRHAdSI0pYkdMjgMYQkOPBb3xY5+jO7eCk7pMpAoGATIHtrkQmRmJq2lVpHSRu\n\
- z2zLYkTsaD7HIeODA7Mq+spTen4seQw4/b4sXswAkJWs+SrOb+rwMJ5qqf5AD1h8\n\
- 4WlBBolxf+pBlErK+y+HJsNvuwiUVOZ+Whk0Exmfc+jvTR6gZQ7kcCQgnC2MXZB1\n\
- /1BLZ09r1iAp3DMHQAhihdECgYAo1xKGt7sM/eN9Z7enxRs5Y/D/qZynvfGoVC2P\n\
- Dsu+iqnv8a0Wg/3vEXjgXw9WCrOF9aH3oYUV4vYX4JpBbnSe/m8Y6S6dkXOsbNsR\n\
- 2DmzkPiSIa4uUJ1/b6AROu8Zq4KGqluHS/ZPoOZ/+QxBzAaf3AQIb6uIgL5pCvlk\n\
- 6PHniQKBgBPGQVFg7iGbbjnWGXL6nbvPWN4bfmy4ESIK3TN0p3UxZBnfAsArOl7D\n\
- HXMRUx2qW+WkUHpfKgqC17Q1srm6w/jJuZAYBkCgLhp3iy/ENtqdE2yYPSGSJnlh\n\
- sR94u9+nkJXw5d6u5xew/y5YelM+gH9X3fv87ulTV2fpoHRk8KH2\n\
- -----END RSA PRIVATE KEY-----"
-
- #define client_crt "-----BEGIN CERTIFICATE-----\n\
- MIIDbDCCAlQCFHu5iQ8zrC5zzju2bI/yWWnCYhW/MA0GCSqGSIb3DQEBCwUAMG0x\n\
- CzAJBgNVBAYTAmNuMQswCQYDVQQIDAJoZjELMAkGA1UEBwwCaGYxDTALBgNVBAoM\n\
- BHRlc3QxDTALBgNVBAsMBHRlc3QxDTALBgNVBAMMBHJvb3QxFzAVBgkqhkiG9w0B\n\
- CQEWCHJvb3QuY29tMB4XDTIxMDQyMDA3MDU1OFoXDTMxMDQxODA3MDU1OFoweDEL\n\
- MAkGA1UEBhMCY24xCzAJBgNVBAgMAmhmMQswCQYDVQQHDAJoZjENMAsGA1UECgwE\n\
- dGVzdDENMAsGA1UECwwEdGVzdDEYMBYGA1UEAwwPMjIwLjE4MC4yMzkuMjEyMRcw\n\
- FQYJKoZIhvcNAQkBFghyb290LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\n\
- AQoCggEBAMfq2nhLxPv7XokxXAMWGCQDGnj5rblBn3uZXMrEUEwC0k5k9VXHFeB1\n\
- 2ou90NyktdpcXqHP4m/8/vHMqBADwE8mAFFfLQ4e+oTnIFF+YNIcb8wOx+uca4Mr\n\
- Rgi/gqFNnjOpg7yzaOLQjSsRUbWL4KKt81Wkue3Cu1spGoJ7CGsGJdor8wa2w3IT\n\
- r+X4voP7iX0WBVU5eeM20khVBWq/daukCxFhDYygPK+Gkz7IiBQEWCEJcjiOxh6R\n\
- /EKzUjrKXQVQclKqVVwyRQYl++PLoo6e9nFTXMnuKQ1X9uyIqektBQi3NLSFsCp5\n\
- ef3dyGSFBvcglxRAfd97u7rHlY6J4mECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA\n\
- H5qIexLGos836/GIoOHyF1vG6n7VZhu2G8GF41XQs9KfvuJY3FQ4a7drHEujbdpI\n\
- 9J9mR8hUaafTjxQVytfekCYkTytsUzJO+qGnxGeS+xWJO/jc1NnPre8ldG1X13Rp\n\
- IbqwRbo0z6J/XrzJzbTVd/joxNBWuIXqCSb8SmKYLUeUOZVMG7autr4VryJgAFma\n\
- hOVJPl3sAEnKJ1dvJC+VXyeWwjfDdXK4RD0UgoDfux7UezAThMC/YKrLz+/kVkps\n\
- dG52zsbbIKZ/omgFgThUFuR36mc0DAL5+Exk5Fb0biB+mOzYTejzmZ/kWQS1EGxI\n\
- 0VZFtnOt9nIZ0+uH2sbHcQ==\n\
- -----END CERTIFICATE-----"
- #define cert_array_len 3
- struct cert_array_t cert_array[cert_array_len] = {
- { ROOT_CRT_PATH, root_crt },
- { CLIENT_KEY_PATH, client_key },
- { CLIENT_CRT_PATH, client_crt }
- };
- #endif
- enum CUST_HTTPS_CHECK {CUST_NONE=0, CUST_SINGLE, CUST_DOUBLE};
- ql_task_t http_get_task = NULL;
- static http_client_t http_cli = 0;
- static ql_sem_t http_semp = NULL;
- static void http_event_cb(http_client_t *client, int evt, int evt_code, void *arg)
- {
- QL_HTTP_LOG("*client:%d, http_cli:%d", *client, http_cli);
- if(*client != http_cli)
- return;
- QL_HTTP_LOG("evt:%d, evt_code:%d", evt, evt_code);
- switch(evt){
- case HTTP_EVENT_SESSION_ESTABLISH:{
- if(evt_code != QL_HTTP_OK){
- QL_HTTP_LOG("HTTP session create failed!!!!!");
- ql_rtos_semaphore_release(http_semp);
- }
- }
- break;
- case HTTP_EVENT_RESPONE_STATE_LINE:{
- if(evt_code == QL_HTTP_OK){
- int resp_code = 0;
- int content_length = 0;
- int chunk_encode = 0;
- char *location = NULL;
- ql_httpc_getinfo(client, HTTP_INFO_RESPONSE_CODE, &resp_code);
- QL_HTTP_LOG("response code:%d", resp_code);
- ql_httpc_getinfo(client, HTTP_INFO_CHUNK_ENCODE, &chunk_encode);
- if(chunk_encode == 0){
- ql_httpc_getinfo(client, HTTP_INFO_CONTENT_LEN, &content_length);
- QL_HTTP_LOG("content_length:%d",content_length);
- }else{
- QL_HTTP_LOG("http chunk encode!!!");
- }
- if(resp_code >= 300 && resp_code < 400){
- ql_httpc_getinfo(client, HTTP_INFO_LOCATION, &location);
- QL_HTTP_LOG("redirect location:%s", location);
- free(location);
- }
- }
- }
- break;
- case HTTP_EVENT_SESSION_DISCONNECT:{
- if(evt_code == QL_HTTP_OK){
- QL_HTTP_LOG("===http transfer end!!!!");
- }else{
- QL_HTTP_LOG("===http transfer occur exception!!!!!");
- }
- ql_rtos_semaphore_release(http_semp);
- }
- break;
- }
- }
- static int http_write_response_data(http_client_t *client, void *arg, char *data, int size, unsigned char end)
- {
- unsigned char *recbuff=NULL;
- QL_HTTP_LOG("recv size:%d", size);
- recbuff=malloc(size+1);
- if(NULL!=recbuff)
- {
- memset(recbuff, 0, size+1);
- memcpy(recbuff, data, size);
- QL_HTTP_LOG("recv data: %s", recbuff);
- free(recbuff);
- recbuff=NULL;
- }
- return size;
- }
- static int sim_net_register(int nSim, int profile_idx)
- {
- int ret = 0, i = 0;
- ql_data_call_info_s info;
- char ip4_addr_str[16] = {0};
- while((ret = ql_network_register_wait(nSim, 120)) != 0 && i < 10){
- i++;
- ql_rtos_task_sleep_ms(1000);
- }
- if(ret == 0) {
- i = 0;
- QL_HTTP_LOG("====network registered!!!!====");
- } else {
- QL_HTTP_LOG("====network register failure!!!!!====");
- return ret;
- }
- ql_set_data_call_asyn_mode(nSim, profile_idx, 0);
- ret=ql_start_data_call(nSim, profile_idx, QL_PDP_TYPE_IP, "uninet", NULL, NULL, 0);
- if(ret != 0) {
- QL_HTTP_LOG("====data call failure!!!!=====");
- }
- memset(&info, 0x00, sizeof(ql_data_call_info_s));
-
- ret = ql_get_data_call_info(nSim, profile_idx, &info);
- if(ret != 0) {
- QL_HTTP_LOG("ql_get_data_call_info ret: %d", ret);
- ql_stop_data_call(nSim, profile_idx);
- return ret;
- }
-
- QL_HTTP_LOG("info->profile_idx: %d", info.profile_idx);
- QL_HTTP_LOG("info->ip_version: %d", info.ip_version);
-
- QL_HTTP_LOG("info->v4.state: %d", info.v4.state);
- inet_ntop(AF_INET, &info.v4.addr.ip, ip4_addr_str, sizeof(ip4_addr_str));
- QL_HTTP_LOG("info.v4.addr.ip: %s\r\n", ip4_addr_str);
-
- inet_ntop(AF_INET, &info.v4.addr.pri_dns, ip4_addr_str, sizeof(ip4_addr_str));
- QL_HTTP_LOG("info.v4.addr.pri_dns: %s\r\n", ip4_addr_str);
-
- inet_ntop(AF_INET, &info.v4.addr.sec_dns, ip4_addr_str, sizeof(ip4_addr_str));
- QL_HTTP_LOG("info.v4.addr.sec_dns: %s\r\n", ip4_addr_str);
- return ret;
- }
- #if USE_CUST_KEY
- /*
- * 客户端证书秘钥初始化函数,将自定义证书秘钥写入自定义文件中
- */
- static int client_certfication_init()
- {
- int ret = 0;
- QFILE fp = -1;
- int i = 0;
- for(i = 0; i < cert_array_len; i++) {
- fp = ql_fopen(cert_array[i].path, "w+");
- if(fp < 0) {
- QL_HTTP_LOG("open file:%s failed!!!!", cert_array[i].path);
- return -1;
- }
- ret = ql_fwrite(cert_array[i].data, strlen(cert_array[i].data), 1, fp);
- if( ret != strlen(cert_array[i].data) ) {
- QL_HTTP_LOG("http write %d bytes data failure", ret);
- ql_fclose(fp);
- return -1;
- }
- ql_fclose(fp);
- }
- return 0;
- }
- #endif
- static void https_get_app_thread(void * arg)
- {
- int ret = 0;
- int profile_idx = 1;
-
- int run_num = 0;
- uint8_t nSim = 0;
- char *url[3] = {"https://220.180.239.212:9634/get_request", // https 无校验
- "https://220.180.239.212:9634/get_request", // https 单向认证
- "https://220.180.239.212:9633/get_request" // https 双向认证
- };
- int case_id = 0;
-
- ql_rtos_task_sleep_s(5);
- QL_HTTP_LOG("========== http new demo start ==========");
- QL_HTTP_LOG("wait for network register done");
- ret = sim_net_register(nSim, profile_idx);
- if( ret != 0 ) {
- QL_HTTP_LOG("sim register net failure , ret= %d", ret);
- goto exit;
- }
- #if USE_CUST_KEY
- ret = client_certfication_init();
- if( ret != 0 ) goto exit;
- #endif
- do {
- QL_HTTP_LOG("==============http_client_get_test[%d]================\n",run_num+1);
-
- ql_rtos_semaphore_create(&http_semp, 0);
-
- if(ql_httpc_new(&http_cli, http_event_cb, NULL) != QL_HTTP_OK){
- QL_HTTP_LOG("http client create failed!!!!");
- break;
- }
-
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SIM_ID, nSim);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_PDPCID, profile_idx);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_WRITE_FUNC, http_write_response_data);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_METHOD, HTTP_METHOD_GET);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSLCTXID, 1);
-
- case_id = run_num%3;
- switch( case_id ) {
- case CUST_NONE:
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSL_VERIFY_LEVEL, HTTPS_VERIFY_NONE);
- break;
- case CUST_SINGLE:
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSL_VERIFY_LEVEL, HTTPS_VERIFY_SERVER);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSL_CACERT_PATH, ROOT_CRT_PATH);
- break;
- case CUST_DOUBLE:
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSL_VERIFY_LEVEL, HTTPS_VERIFY_SERVER_CLIENT);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSL_CACERT_PATH, ROOT_CRT_PATH);
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_SSL_OWNCERT_PATH, CLIENT_CRT_PATH, CLIENT_KEY_PATH, NULL);
- break;
- default:
- break;
- }
- ql_httpc_setopt(&http_cli, HTTP_CLIENT_OPT_URL, url[case_id]);
-
- if(ql_httpc_perform(&http_cli) == QL_HTTP_OK) {
- QL_HTTP_LOG("wait http perform end!!!!!!");
- ql_rtos_semaphore_wait(http_semp, QL_WAIT_FOREVER);
- } else {
- QL_HTTP_LOG("http perform failed!!!!!!!!!!");
- }
- ql_httpc_release(&http_cli);
- http_cli = 0;
- QL_HTTP_LOG("==============http_client_test_end[%d]================\n",run_num+1);
- run_num++;
- if(http_semp != NULL)
- {
- ql_rtos_semaphore_delete(http_semp);
- http_semp = NULL;
- }
-
- ql_rtos_task_sleep_s(5);
- } while(1);
- exit:
- if(http_semp != NULL)
- {
- ql_rtos_semaphore_delete(http_semp);
- http_semp = NULL;
- }
-
- ql_rtos_task_delete(http_get_task);
- return;
- }
- void ql_https_get_app_init(void)
- {
- QlOSStatus err = QL_OSI_SUCCESS;
-
- err = ql_rtos_task_create(&http_get_task, 4096, APP_PRIORITY_NORMAL, "QhttpGet", https_get_app_thread, NULL, 5);
- if(err != QL_OSI_SUCCESS)
- {
- QL_HTTP_LOG("created task failed");
- }
- }
|