⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 api.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
字号:
/*
*****************************************************************************************************
*
*  File name: api.c
*****************************************************************************************************
*/
#include "..\head\includes.h"




/*
*****************************************************************************************************
*FUNC:  申请一个套接字
*NOTE:  套接字序号,如果返回为ERR_SOCK_FULL,说明所有套接字已被使用
*****************************************************************************************************
*/
#if 0
unsigned char TCPSocket()
{
	unsigned char i;
	
	for (i=0; i<NO_CONNECTION; i++) {   //扫描所有的套接字,找到第一个空余的
		if (!conxn[i].bUsed) {
			conxn[i].bUsed = TRUE;	    //标志该套接字已使用
			return i;
		}
	}
	if(NO_CONNECTION == i) {            //无空余的套接字,则返回大于5的序列号
		return ERR_SOCK_FULL;
	}
}
#endif

/*
*****************************************************************************************************
*FUNC:  向指定IP、端口连接
*NOTE:  套接字序号,目的IP、目的端口、OnReceive函数、OnClose函数
*****************************************************************************************************
*/
void  TCPConnect(unsigned char  sock, union IP_address destip, unsigned int destport,
						  void ( * recv)(unsigned char xdata *buf ,unsigned int size),
						  void ( * close)(),
						  void ( * connect)())
{	
	conxn[sock].ip.dwords = destip.dwords;          //目的IP
	conxn[sock].localport = LocalPort + sock;      //本地端口
	conxn[sock].port = destport;                    //目的端口
	conxn[sock].socket_type = CLIENT;               //本地类型
	conxn[sock].state = STATE_SYN_SENT;	            //网络状态变迁状态STATE_SYN_SENT

	EA = 0;
	conxn[sock].my_sequence = initial_sequence_nr;  //我的SEQ 
    conxn[sock].his_sequence = 0;                   //我的ACK
	initial_sequence_nr += 64000L;
	EA = 1;
	
	conxn[sock].recv	 = recv;                    //回调函数实体化
	conxn[sock].close	 = close;
	conxn[sock].connect	 = connect;
	tcp_send(&TCPSend,FLG_SYN, 28, sock);           //发请求链接标志
}


/*
*****************************************************************************************************
*FUNC:  发送数据
*NOTE:  如果发送成功,返回0,否则,返回错误代码
        1:第一次数据先入UNACK缓冲区,但UNACK数据响应后,如果WAITFORSEND有数据则移入到UNACK缓冲区发送
*****************************************************************************************************
*/
unsigned char User_TCPSend(unsigned char sock,unsigned char xdata *buf, unsigned int size)
{

    if (conxn[sock].state != STATE_ESTABLISHED) {     //没链路
        return ERR_NO_ESTABLISH;        
	}

	if (conxn[sock].pUnAcked->bUsed) {                //等待响应被占用
		return ERR_BUF_FULL;                          //入WAITFORSEND缓冲区失败返回洪金枝添加
	}

	tcp_senddata(&TCPSend,buf,size+20,sock,0);        //加上20字节tcp头部
	return TRUE;

}

/*
*****************************************************************************************************
*FUNC:  监听某个端口
*NOTE:  入参:端口号,套接字编号
*****************************************************************************************************
*/
#if 0
unsigned char TCPListen(unsigned char sock,unsigned short ucPort,
						void ( * recv)(unsigned char xdata *buf ,unsigned int size),
						void ( * close)(),
						void ( * connect)())
{
	if(sock >= NO_CONNECTION)
		return 	NO_CONNECTION;	//套接字编号超过最大编号
	
	conxn[sock].ip.dwords = my_ip_address.dwords;
	conxn[sock].localport = ucPort;
	conxn[sock].port = 0;	//不知道对方的端口号
	conxn[sock].socket_type = SERVER;
	conxn[sock].state = STATE_LISTEN;
	conxn[sock].my_sequence = initial_sequence_nr;
	conxn[sock].his_sequence = 0;
	initial_sequence_nr += 64000L;
	//回调函数实体化
	conxn[sock].recv	 = recv;
	conxn[sock].close	 = close;
	conxn[sock].connect	 = connect;
}
#endif
/*
*****************************************************************************************************
*FUNC:  用户主动关闭套接字,并释放资源
*NOTE:  入参:套接字编号
*****************************************************************************************************
*/
#if 0
void  TCPClose(unsigned char sock)
{
	conxn[sock].ip.dwords = 0;
	conxn[sock].localport = 0;
	conxn[sock].port = 0;
	conxn[sock].socket_type = 0;
	conxn[sock].state = STATE_CLOSED;	

	EA = 0;
	conxn[sock].my_sequence = 0;
    conxn[sock].his_sequence = 0;
	EA = 1;
	//将未被ACK空间和待发送数据包缓冲区设置为未被占用
	conxn[sock].pUnAcked ->bUsed = FALSE;
	conxn[sock].bUsed = FALSE;

	//调用OnClose回调函数
	(* conxn[sock].close)();
}
#endif

/*
*****************************************************************************************************
*              应用层
*****************************************************************************************************
*/


/*
*****************************************************************************************************
*FUNC:  收到TCP数据后用户处理,收到数据后回调函数,由用户自己添加相应功能
*NOTE:  入参:数据缓冲区首地址,数据包长度
        //User_TCPSend(IndexOfClient,buf,size); //Uart0Putsl(buf,size);
*****************************************************************************************************
*/
void OnReceive(unsigned char xdata *buf,unsigned int size) reentrant
{
    TimerSec[T_SEND_HEART] = HeartTimeOutBak; //心跳包时间初始化
	SendHeartFlag = FALSE;                    //清已发心跳包
	FramePush2(buf,size);    
}


/*
*****************************************************************************************************
*FUNC: 连接成功后回调函数,由用户根据自己需要表些
*NOTE:  入参:套接字编号
//发送注册包//WP+ID+SIM+MIP
*****************************************************************************************************
*/
void LoginMsg(void)
{
    unsigned char xdata RegBody[50];
	unsigned char xdata sim[]="13003804577";
	unsigned char length=0;

	//HintMsg(7,ConfigReg.reg.LocalIpStr);   //移动IP这里指本地IP
	//sprintf(RegBody,"WP%s%s%s\0",ModelIdBak,sim,ConfigReg.reg.LocalIpStr); 
	IpToStr(my_ip_address);                  //用现在的本地IP,可能是手动分配,也可能是自动指派              
    HintMsg(7,IpString);                     //移动IP这里指本地IP
    sprintf(RegBody,"WP%s%s%s\0",ModelIdBak,sim,IpString);
    length = strlen(RegBody);
	User_TCPSend(IndexOfClient,RegBody,length);	

	HintMsg(8,NULL);                        //提示连接成功

}


void OnConnect() reentrant
{
//unsigned char xdata testeven[15];
    LED(CONNECT_LED,OFF);
	bConnect      = TRUE;
	SendHeartFlag = FALSE;                      //清已发心跳包 
    ConnectNum    = RECONNECT_NUM;              //重连次数填初值 	
	TimerSec[T_SEND_HEART] = HeartTimeOutBak;   //心跳包时间初始化
    OnLineTime = 0;                             //连续在线时间清0,以便函统计
	SentHeartTime = 0;
#ifdef  PROTOCOL_2004   
    LoginMsg2004(); 
#else 
	LoginMsg();	                                //发送注册包
#endif 
 
#if 0   
    //68 99 99 99 99 99 99 68 01 02 44 E9 96 16
    testeven[0] = 0x68;
    testeven[1] = 0x99;
    testeven[2] = 0x99;
    testeven[3] = 0x99;
	testeven[4] = 0x99;
    testeven[5] = 0x99;
    testeven[6] = 0x99;

    testeven[7] = 0x68;
    testeven[8] = 0x01;
	testeven[9] = 0x02;
	testeven[10] = 0x44;
	testeven[11] = 0xe9;
	testeven[12] = 0x96;
	testeven[13] = 0x16;

    Uart0Putsl(testeven,14); 
#endif  
}

/*
*****************************************************************************************************
*FUNC: 套接字关闭后回调函数
*NOTE:  入参:套接字编号
*****************************************************************************************************
*/
void OnClose() reentrant
{
    LED(CONNECT_LED,ON);
	bConnect      = FALSE;
	SendHeartFlag = FALSE;           //清已发心跳包
	OnLineTime = 0;
	SentHeartTime = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -