移远EC20的AT指令连接TCP打开、发送、读取数据函数编码实录(1)
  7wLgU52oXO18 2023年11月02日 46 0

以下是我最近在编写实现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;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  RvY7ePXNHMl6   2023年11月12日   18   0   0 客户端TCPIP
7wLgU52oXO18
最新推荐 更多