📄 api.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 + -