4G_module/examples/http/src/cm_demo_http.c

263 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*********************************************************
* @file cm_demo_http.c
* @brief OpenCPU HTTP示例
* Copyright (c) 2021 China Mobile IOT.
* All rights reserved.
* created by WangPeng 2022/7/14
********************************************************/
#include "stdio.h"
#include "cm_http.h"
#include "cm_ssl.h"
#include "cm_demo_uart.h"
//www.baidu.com根证书
static const char *http_ca = "-----BEGIN CERTIFICATE-----\r\n" \
"MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\r\n" \
"A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\r\n" \
"b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\r\n" \
"MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\r\n" \
"YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\r\n" \
"aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\r\n" \
"jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\r\n" \
"xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\r\n" \
"1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\r\n" \
"snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\r\n" \
"U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\r\n" \
"9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\r\n" \
"BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\r\n" \
"AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\r\n" \
"yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\r\n" \
"38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\r\n" \
"AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\r\n" \
"DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\r\n" \
"HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\r\n" \
"-----END CERTIFICATE-----\r\n" \
"-----BEGIN CERTIFICATE-----\r\n" \
"MIIEaTCCA1GgAwIBAgILBAAAAAABRE7wQkcwDQYJKoZIhvcNAQELBQAwVzELMAkG\r\n" \
"A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\r\n" \
"b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw\r\n" \
"MDBaFw0yNDAyMjAxMDAwMDBaMGYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\r\n" \
"YWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW\r\n" \
"YWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB\r\n" \
"DwAwggEKAoIBAQDHDmw/I5N/zHClnSDDDlM/fsBOwphJykfVI+8DNIV0yKMCLkZc\r\n" \
"C33JiJ1Pi/D4nGyMVTXbv/Kz6vvjVudKRtkTIso21ZvBqOOWQ5PyDLzm+ebomchj\r\n" \
"SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj\r\n" \
"mxK1zusp36QUArkBpdSmnENkiN74fv7j9R7l/tyjqORmMdlMJekYuYlZCa7pnRxt\r\n" \
"Nw9KHjUgKOKv1CGLAcRFrW4rY6uSa2EKTSDtc7p8zv4WtdufgPDWi2zZCHlKT3hl\r\n" \
"2pK8vjX5s8T5J4BO/5ZS5gIg4Qdz6V0rvbLxAgMBAAGjggElMIIBITAOBgNVHQ8B\r\n" \
"Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUlt5h8b0cFilT\r\n" \
"HMDMfTuDAEDmGnwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0\r\n" \
"dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCow\r\n" \
"KKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYB\r\n" \
"BQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNv\r\n" \
"bS9yb290cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZI\r\n" \
"hvcNAQELBQADggEBAEYq7l69rgFgNzERhnF0tkZJyBAW/i9iIxerH4f4gu3K3w4s\r\n" \
"32R1juUYcqeMOovJrKV3UPfvnqTgoI8UV6MqX+x+bRDmuo2wCId2Dkyy2VG7EQLy\r\n" \
"XN0cvfNVlg/UBsD84iOKJHDTu/B5GqdhcIOKrwbFINihY9Bsrk8y1658GEV1BSl3\r\n" \
"30JAZGSGvip2CTFvHST0mdCF/vIhCPnG9vHQWe3WVjwIKANnuvD58ZAWR65n5ryA\r\n" \
"SOlCdjSXVWkkDoPWoC209fN5ikkodBpBocLTJIg1MGCUF7ThBCIxPTsvFwayuJ2G\r\n" \
"K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg=\r\n" \
"-----END CERTIFICATE-----\r\n";
static cm_httpclient_handle_t client = NULL;
static void __cm_httpclient_callback(cm_httpclient_handle_t client_handle, cm_httpclient_callback_event_e event, void *param)
{
cm_demo_printf("\n%s():[%d], event [%d]\n", __func__, __LINE__, event);
switch(event)
{
case CM_HTTP_CALLBACK_EVENT_REQ_START_SUCC_IND:
{
#if 0
int32_t ret = cm_httpclient_request_send(client_handle, (const uint8_t *)"puttest", strlen("puttest"));
cm_demo_printf("\ncm_httpclient_request_send() ret is %d\n", ret);
#endif
break;
}
case CM_HTTP_CALLBACK_EVENT_RSP_HEADER_IND:
{
cm_httpclient_callback_rsp_header_param_t *callback_param = (cm_httpclient_callback_rsp_header_param_t *)param;
if(200 != callback_param->response_code)
{
cm_demo_printf("\nCM_HTTP_CALLBACK_EVENT_RSP_HEADER_IND response_code err: %d\n", callback_param->response_code);
cm_demo_printf("\n%s\n", callback_param->response_header);
break;
}
cm_demo_printf("\n%s\n", callback_param->response_header);
break;
}
case CM_HTTP_CALLBACK_EVENT_RSP_CONTENT_IND:
{
cm_httpclient_callback_rsp_content_param_t *callback_param = (cm_httpclient_callback_rsp_content_param_t *)param;
cm_demo_printf("\nCM_HTTP_CALLBACK_EVENT_RSP_CONTENT_IND [%d, %d, %d]\n", callback_param->total_len,callback_param->sum_len, callback_param->current_len);
if (0 != callback_param->current_len)
{
cm_demo_printf("\n%s\n", callback_param->response_content);
}
break;
}
case CM_HTTP_CALLBACK_EVENT_RSP_END_IND:
{
break;
}
case CM_HTTP_CALLBACK_EVENT_ERROR_IND:
{
cm_httpclient_error_event_e callback_param = (cm_httpclient_error_event_e)(int)param;
cm_demo_printf( "\nCM_HTTP_CALLBACK_EVENT_ERROR_IND http err: %d\n", callback_param);
break;
}
default:
break;
}
}
/**
* HTTP功能调试使用示例注意使用前需先设置TEST_HTTP_SERVER和TEST_HTTP_PATH宏控中的信息
*
* CM:HTTP:SYNCHHTTP //同步HTTP测试
* CM:HTTP:ASYNCHHTTP //异步HTTP测试
* CM:HTTP:RESPONSE //查询HTTP响应结果码
* CM:HTTP:TERMINATE //终止HTTP连接
*
*/
void cm_test_http(unsigned char **cmd,int len)
{
unsigned char operation[20] = {0};
cm_httpclient_ret_code_e ret = CM_HTTP_RET_CODE_UNKNOWN_ERROR;
sprintf((char *)operation, "%s", cmd[2]);
if (0 == strcmp((const char *)operation, "SYNCHHTTP"))
{
if (NULL == client)
{
/*.服务器地址url需要填写完整,例如服务器url仅为格式示例"http://www.baidu.com","http://[2408:400e:16b:9700:d3df:3f8b:7c2b:8888]:80".*/
ret = cm_httpclient_create((const uint8_t *)"https://www.baidu.com", NULL, &client); //创建客户端实例
if (CM_HTTP_RET_CODE_OK != ret || NULL == client)
{
cm_demo_printf("cm_httpclient_create() error!\r\n");
return;
}
cm_httpclient_cfg_t client_cfg;
client_cfg.ssl_enable = true; //使用SSL即HTTPS连接方式。使用HTTP方式时该值为false
client_cfg.ssl_id = 2; //设置SSL索引号
client_cfg.cid = 0; //设置PDP索引号目前不支持该项设置设置任意值即可
client_cfg.conn_timeout = HTTPCLIENT_CONNECT_TIMEOUT_DEFAULT;
client_cfg.rsp_timeout = HTTPCLIENT_WAITRSP_TIMEOUT_DEFAULT;
client_cfg.dns_priority = 1; //设置DNS解析优先级ipv6解析优先
ret = cm_httpclient_set_cfg(client, client_cfg); //客户端参数设置
if (CM_HTTP_RET_CODE_OK != ret || NULL == client)
{
cm_demo_printf("cm_httpclient_set_cfg() error!\r\n");
return;
}
int tmp = 1;
cm_ssl_setopt(2 ,CM_SSL_PARAM_VERIFY, &tmp); //设置SSL验证方式
cm_ssl_setopt(2,CM_SSL_PARAM_CA_CERT, (char*)http_ca); //设置CA证书
}
cm_httpclient_sync_response_t response = {};
cm_httpclient_sync_param_t param = {HTTPCLIENT_REQUEST_GET, (const uint8_t *)"/", 0, NULL}; //GET方法必须设置请求路径
ret = cm_httpclient_sync_request(client, param, &response); //发送请求,同步接口
if (CM_HTTP_RET_CODE_OK != ret || NULL == client)
{
cm_demo_printf("cm_httpclient_sync_request() error! ret is %d\r\n", ret);
return;
}
else
{
cm_demo_printf("response_code is %d\r\n", response.response_code);
cm_demo_printf("response_header_len is %d\r\n", response.response_header_len);
cm_demo_printf("response_content_len is %d\r\n", response.response_content_len);
}
cm_httpclient_sync_free_data(client); //释放响应数据
}
else if (0 == strcmp((const char *)operation, "ASYNCHHTTP"))
{
if (NULL == client)
{
ret = cm_httpclient_create((const uint8_t *)"http://aip.baidubce.com", __cm_httpclient_callback, &client); //创建客户端实例
if (CM_HTTP_RET_CODE_OK != ret || NULL == client)
{
cm_demo_printf("cm_httpclient_create() error!\r\n");
return;
}
cm_httpclient_cfg_t client_cfg;
client_cfg.ssl_enable = false; //使用SSL即HTTPS连接方式。使用HTTP方式时该值为false
client_cfg.ssl_id = 0; //设置SSL索引号
client_cfg.cid = 0; //设置PDP索引号目前不支持该项设置设置任意值即可
client_cfg.conn_timeout = HTTPCLIENT_CONNECT_TIMEOUT_DEFAULT;
client_cfg.rsp_timeout = HTTPCLIENT_WAITRSP_TIMEOUT_DEFAULT;
client_cfg.dns_priority = 0; //设置DNS解析优先级
ret = cm_httpclient_set_cfg(client, client_cfg); //客户端参数设置
char token_url[1024] = {0};
sprintf(token_url, "/oauth/2.0/token?grant_type=client_credentials");
sprintf(token_url + strlen((char*)token_url), "&client_id=%s", "v6pdyZF12345r0TqBwv5bjcO"); //该数据为错误数据仅用于demo示例无实际效果
sprintf(token_url + strlen((char*)token_url), "&client_secret=%s", "FKW3r54321n0uICxbuTy4ClTqNuuzXsy"); //该数据为错误数据仅用于demo示例无实际效果
ret = cm_httpclient_request_start(client, HTTPCLIENT_REQUEST_GET, (uint8_t*)token_url, false, 0);
if (CM_HTTP_RET_CODE_OK != ret || NULL == client)
{
cm_demo_printf("cm_httpclient_request_start() error! ret is %d\r\n", ret);
return;
}
}
}
else if (0 == strcmp((const char *)operation, "RESPONSE"))
{
if (NULL != client)
{
cm_demo_printf("client[%x] code is %d\r\n", client, cm_httpclient_get_response_code(client));
}
}
else if (0 == strcmp((const char *)operation, "TERMINATE"))
{
if (NULL != client)
{
cm_httpclient_terminate(client);
if (CM_HTTP_RET_CODE_OK == cm_httpclient_delete(client))
{
cm_demo_printf("client[%x] delete\r\n", client);
client = NULL;
}
else
{
cm_demo_printf("client[%x] delete error\r\n", client);
}
}
else
{
cm_demo_printf("client in non-existent\r\n");
}
}
else
{
cm_demo_printf("illegal operation\n");
}
return;
}