以下是我最近在编写实现EC20的TCP数据传输功能的代码,有不懂的地方可以留言提问
TCP打开
int at_tcp_open(char *tcp_ip, int tcp_port,int timeout)
{
char *at_hdr;
at_cmd_t at_cmd;
char *at=at_get_cmd_buffer();
int at_buf_len = at_get_cmd_buffer_len();
int at_len;
int rc;
if(empty_strings(tcp_ip)) {
//LOGE("Input param is invalid!\n");
return -1;
}
//LOGD("tcp_ip: %s, port=%d\n", tcp_ip, tcp_port);
at_cmd = AT_CMD_TCP_QIOPEN;
at_hdr = at_get_cmd(at_cmd);
if(!at_hdr) {
LOGE("Fail to get AT CMD(index=%d)!\n", at_cmd);
return -1;
}
at_len = SNPRINTF(at, at_buf_len,at_hdr, tcp_ip, tcp_port);
rc = at_send_and_wait_response(at, at_len, timeout, AT_RSP_CONNECT_OK, NULL, 0);
if(rc != 0) {
LOGE("Fail to send AT[%d]: %s, timeout=%d, rc=%d\n", at_len, at, timeout, rc);
return -1;
}
return 0;
}
TCP发送
int at_tcp_send(char data, uint32_t data_len, int timeout, int rev_flag)
{
char *at_hdr;
at_cmd_t at_cmd;
char *at=at_get_cmd_buffer();
int at_buf_len = at_get_cmd_buffer_len();
int at_len;
int rc;
*rev_flag = 0;
if(!data || data_len <= 0) {
LOGE("Input param is invalid!\n");
return -1;
}
at_cmd = AT_CMD_TCP_QISEND;
at_hdr = at_get_cmd(at_cmd);
if(!at_hdr) {
LOGE("Fail to get AT CMD(index=%d)!\n", at_cmd);
return -1;
}
at_len = SNPRINTF(at, at_buf_len, at_hdr, data_len);
rc = at_send_and_wait_response(at, at_len, timeout, AT_RSP_SEND_FLAG, NULL, 0);
if(rc != 0) {
rc = at_send_and_wait_response("at+qigeterror\r\n", STRLEN("at+qigeterror\r\n"), 5, "QIGETERROR", NULL, 0);
rc = at_send_and_wait_response("at+qistate?\r\n", STRLEN("at+qistate?\r\n"), 5, "QISTATE", NULL, 0);
LOGE("Fail to send AT[%d]: %s, timeout=%d, rc=%d\n", at_len, at, timeout, rc);
return -1;
}
//rc = at_send_and_wait_response(data, data_len, timeout, "+QIRDI:", NULL, 0);
rc = at_send_and_wait_response(data, data_len, timeout, AT_RSP_SEND_OK, NULL, 0);
if(rc != 0) {
LOGE("Fail to send TCP Data[%d]: %s, timeout=%d, rc=%d\n", data_len, data, timeout, rc);
return -1;
}
/*Check response*/
timeout = 30;
for( ; timeout > 0; timeout -- )
{
if(at_search(SEND_RSP_TARGET))
{
//LOGD("%s is found!\n", SEND_RSP_TARGET);
*rev_flag = 1;
break;
}
/*Sleep 100ms */
delay_ms(500);
}
return 0;
}
TCP读取
int at_tcp_read(char* server_addr,int server_port,uint32_t data_len, char *buf, int size, int delay){
int rev = 0;
int at_rev_size = 0;
char *at=at_get_cmd_buffer();
int at_buf_len = at_get_cmd_buffer_len();
int at_len;
int rc;
char data_head[64] = "";
int len = 0;
at_cmd_t at_cmd = AT_CMD_TCP_QIRD;
char *at_hdrs= (char*)at_get_cmd(at_cmd);
if(!at_hdrs) {
LOGE("Fail to get AT CMD(index=%d)!\n", at_cmd);
return -1;
}
at_len = SNPRINTF(at,at_buf_len, at_hdrs, data_len);
rc = tcp_read_response(at, at_len, delay, READ_RSP_TARGET, buf, size);
if(rc != 0) {
LOGE("Fail to send AT[%d]: %s, delay=%d, rc=%d\n", at_len, at, delay, rc);
return -1;
}
#if defined (SL301)
#if 0
//with TCP Header
sprintf(data_head, "\r\n+QIRD: %s:%d,TCP,%%d", server_addr, server_port);
if ( 1 != sscanf(buf, data_head, &len) )
return -1;
rev = sprintf(data_head, "+QIRD: %s:%d,TCP,%d\r\n", server_addr, server_port,len);
char *prev= strstr(buf, data_head);
if ( prev != NULL )
{
int tlen = buf + size -(prev + rev);
if ( tlen < 0 )
return -2;
else if ( tlen == 0 )
return 0;
len = tlen > len ? len:tlen;
memmove(buf, prev + rev, len );
return len;
}
#endif
char delim = ',';
char temp[128] = {0};
char *result;
//MEMCPY(temp,STRSTR(buffer, "+QENG: 1,0")+8,sizeof(temp));
result = net_util_split(buf,delim,temp);
int index = 1;
while(result!= NULL)
{
memset(temp,0,sizeof(temp));
result = net_util_split(result,delim,temp);
//LOG("\n index=%d,tmp=%s\n",index,temp);
if(index == 2)
{
len= atoi(temp);
break;
}
index++;
}
rev = sprintf(data_head, "TCP,%d\r\n",len);
char *prev= strstr(buf, data_head);
if ( prev != NULL )
{
int tlen = buf + size -(prev + rev);
if ( tlen < 0 )
return -2;
else if ( tlen == 0 )
return 0;
len = tlen > len ? len:tlen;
memmove(buf, prev + rev, len );
return len;
}
#elif defined (SL401_V1)
//Without TCP Header
sprintf(data_head, "\r\n+QIRD: %%d");
if ( 1 != sscanf(buf, data_head, &len) )
return -1;
rev = sprintf(data_head, "+QIRD: %d\r\n",len);
char *prev= strstr(buf, data_head);
if ( prev != NULL )
{
int tlen = buf + size -(prev + rev);
if ( tlen < 0 )
return -2;
else if ( tlen == 0 )
return 0;
len = tlen > len ? len:tlen;
memmove(buf, prev + rev, len );
return len;
}
#endif
return -1;
}