I am trying to use open ssl client example from esp-idf. with some changes in host and target name. Here they are
Code: Select all
#define OPENSSL_EXAMPLE_TARGET_NAME "messaging2.mel.cloudeftpos.com"
#define OPENSSL_EXAMPLE_TARGET_TCP_PORT 80
#define OPENSSL_EXAMPLE_REQUEST "POST http://messaging2.mel.cloudeftpos.com/WebTrans/Cloud.aspx HTTP/1.0\r\nHost: messaging2.mel.cloudeftpos.com \r\nContent-Type: text/xml \r\nUser-Agent: DPT/1.0 \r\nConnection: close \r\nContent-Length: %d \r\n\r\n%s \r\n\r\n "
#define OPENSSL_EXAMPLE_TASK_NAME "openssl_example"
#define OPENSSL_EXAMPLE_TASK_STACK_WORDS 10240
#define OPENSSL_EXAMPLE_TASK_PRIORITY 8
#define OPENSSL_EXAMPLE_RECV_BUF_LEN 1024
#define OPENSSL_EXAMPLE_LOCAL_TCP_PORT 80
my code changes in task are also minor
Code: Select all
const char *tx_data =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<eCloud1>"
"<CloudMsg>"
"<PingRequest>"
"<SrcCloudID>10002-001234-001-1</SrcCloudID>"
"<MsgSeq>FC6BB8E0-7300-4116-866A-2D3CA5151F23</MsgSeq>"
"<ClientTimeStamp>20190410165401</ClientTimeStamp>"
"</PingRequest>"
"</CloudMsg>"
"</eCloud1>";
static void openssl_example_task(void *p)
{
int ret;
SSL_CTX *ctx;
SSL *ssl;
int sockfd;
struct sockaddr_in sock_addr;
struct hostent *hp;
struct ip4_addr *ip4_addr;
int recv_bytes = 0;
char recv_buf[OPENSSL_EXAMPLE_RECV_BUF_LEN];
char send_data[OPENSSL_EXAMPLE_RECV_BUF_LEN];
sprintf(send_data,OPENSSL_EXAMPLE_REQUEST,strlen(tx_data), tx_data);
ESP_LOGI(TAG, "Full header request = %s", send_data);
const int send_bytes = sizeof(send_data);
ESP_LOGI(TAG, "OpenSSL demo thread start OK");
ESP_LOGI(TAG, "get target IP address");
hp = gethostbyname(OPENSSL_EXAMPLE_TARGET_NAME);
if (!hp) {
ESP_LOGI(TAG, "failed");
goto failed1;
}
ESP_LOGI(TAG, "OK");
ip4_addr = (struct ip4_addr *)hp->h_addr;
ESP_LOGI(TAG, IPSTR, IP2STR(ip4_addr));
ESP_LOGI(TAG, "create SSL context ......");
ctx = SSL_CTX_new(TLSv1_2_client_method());
if (!ctx) {
ESP_LOGI(TAG, "failed");
goto failed1;
}
ESP_LOGI(TAG, "OK");
ESP_LOGI(TAG, "create socket ......");
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
ESP_LOGI(TAG, "failed");
goto failed2;
}
ESP_LOGI(TAG, "OK");
ESP_LOGI(TAG, "bind socket ......");
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = 0;
sock_addr.sin_port = htons(OPENSSL_EXAMPLE_LOCAL_TCP_PORT);
ret = bind(sockfd, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
if (ret) {
ESP_LOGI(TAG, "failed");
goto failed3;
}
ESP_LOGI(TAG, "OK");
ESP_LOGI(TAG, "socket connect to remote %s ......", OPENSSL_EXAMPLE_TARGET_NAME);
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = ip4_addr->addr;
sock_addr.sin_port = htons(OPENSSL_EXAMPLE_TARGET_TCP_PORT);
ret = connect(sockfd, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
if (ret) {
ESP_LOGI(TAG, "failed");
goto failed3;
}
ESP_LOGI(TAG, "OK");
ESP_LOGI(TAG, "create SSL ......");
ssl = SSL_new(ctx);
if (!ssl) {
ESP_LOGI(TAG, "failed");
goto failed3;
}
ESP_LOGI(TAG, "OK");
SSL_set_fd(ssl, sockfd);
ESP_LOGI(TAG, "SSL connected to %s port %d ......",
OPENSSL_EXAMPLE_TARGET_NAME, OPENSSL_EXAMPLE_TARGET_TCP_PORT);
ret = SSL_connect(ssl);
if (!ret) {
ESP_LOGI(TAG, "failed " );
goto failed4;
}
ESP_LOGI(TAG, "OK");
ESP_LOGI(TAG, "send https request to %s port %d ......",
OPENSSL_EXAMPLE_TARGET_NAME, OPENSSL_EXAMPLE_TARGET_TCP_PORT);
ret = SSL_write(ssl, send_data, send_bytes);
if (ret <= 0) {
ESP_LOGI(TAG, "failed");
goto failed5;
}
ESP_LOGI(TAG, "OK");
do {
ret = SSL_read(ssl, recv_buf, OPENSSL_EXAMPLE_RECV_BUF_LEN - 1);
if (ret <= 0) {
break;
}
recv_buf[ret] = '\0';
recv_bytes += ret;
ESP_LOGI(TAG, "%s", recv_buf);
} while (1);
ESP_LOGI(TAG, "totaly read %d bytes data from %s ......", recv_bytes, OPENSSL_EXAMPLE_TARGET_NAME);
failed5:
SSL_shutdown(ssl);
failed4:
SSL_free(ssl);
ssl = NULL;
failed3:
close(sockfd);
sockfd = -1;
failed2:
SSL_CTX_free(ctx);
ctx = NULL;
failed1:
vTaskDelete(NULL);
return ;
}
Code: Select all
I (2216) event: sta ip: 192.168.30.142, mask: 255.255.255.0, gw: 192.168.30.254
I (2216) openssl_example: Full header request = POST http://messaging2.mel.cloudeftpos.com/WebTrans/Cloud.aspx HTTP/1.0
Host: messaging2.mel.cloudeftpos.com
Content-Type: text/xml
User-Agent: DPT/1.0
Connection: close
Content-Length: 250
<?xml version="1.0" encoding="utf-8"?><eCloud1><CloudMsg><PingRequest><SrcCloudID>10002-001234-001-1</SrcCloudID><MsgSeq>FC6BB8E0-7300-4116-866A-2D3CA5151F23</MsgSeq><Clien
tTimeStamp>20190410165401</ClientTimeStamp></PingRequest></CloudMsg></eCloud1>
I (2256) openssl_example: OpenSSL demo thread start OK
I (2266) openssl_example: get target IP address
I (2336) openssl_example: OK
I (2336) openssl_example: 13.54.102.57
I (2336) openssl_example: create SSL context ......
I (2336) openssl_example: OK
I (2346) openssl_example: create socket ......
I (2346) openssl_example: OK
I (2346) openssl_example: bind socket ......
I (2356) openssl_example: OK
I (2356) openssl_example: socket connect to remote messaging2.mel.cloudeftpos.com ......
I (2386) openssl_example: OK
I (2386) openssl_example: create SSL ......
I (2386) openssl_example: OK
I (2396) openssl_example: SSL connected to messaging2.mel.cloudeftpos.com port 80 ......
I (2426) openssl_example: failed
I need your help. Thanks Asma.