263 lines
12 KiB
C
263 lines
12 KiB
C
/*********************************************************
|
||
* @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;
|
||
}
|