📄 tcpdrv.c
字号:
/****************************************************************
** *
** FILE : TCPDrv.C *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : CCH 2003.4.18 *
****************************************************************/
#include "includes.h"
#include "message.h"
#include "public.h"
#include "tools.h"
#include "timetask.h"
#include "errtask.h"
#include "socktask.h"
#include "gsmtask.h"
#include "gprssend.h"
#include "udpdrv.h"
#include "tcpdrv.h"
#include "zprint.h"
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define MAX_CONNECT 3
#define MAX_LOG 3
#define PERIOD_MONITORCONNECT SECOND, 30
#define PERIOD_TESTCONNECT SECOND, 15
#define PERIOD_CONNECTWAIT SECOND, 20
#define PERIOD_TESTLOG SECOND, 30
#define PERIOD_DEFAULTQUERY MINUTE, 2
/*
********************************************************************************
* DEFINE status
********************************************************************************
*/
#define ACTIVE_ 0x01
#define CONNECT_ 0x02
#define LOGED_ 0x04
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static INT8U status;
static INT16U ct_connect, ct_log;
static TMR_TSK *monitortmr;
static char ipaddr[20], ipport[10];
static INT8U tempbuf[50];
static void StartConnect(void)
{
if (status & CONNECT_) {
status &= ~CONNECT_;
ct_connect = 0;
}
if (SocketIsClosed()) {
if (!GPRSComIsSuspended()) {
if (++ct_connect <= MAX_CONNECT) RequestOpenSocket(ipaddr, ipport);
}
StartTmr(monitortmr, PERIOD_MONITORCONNECT);
} else {
RequestCloseSocket();
StartTmr(monitortmr, PERIOD_TESTCONNECT);
}
if (ct_connect > MAX_CONNECT) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<connect error for TCP>\n");
#endif
OSQPost(GsmTaskMsgQue, MSG_TCPDRV_CONNECTERR, 0, 0);
}
}
static void Turninto_LOGING(void)
{
if (status & LOGED_) {
ct_log = 0;
status &= ~LOGED_;
ClearGPRSSendChannel(CHA_TCP);
}
if (!GPRSChannelReady(CHA_TCP)) ClearGPRSSendChannel(CHA_TCP);
tempbuf[0] = 0x01;
tempbuf[1] = 0x01;
tempbuf[2] = SYS_TELLEN;
if (PubParaValid(MYTEL_)) {
EncodeTel(&tempbuf[3], MyTel.tel, MyTel.len, SYS_TELLEN);
} else {
InitBuf(&tempbuf[3], ' ', SYS_TELLEN);
}
StartTmr(monitortmr, PERIOD_TESTLOG);
if (!GPRSComIsSuspended()) {
if (++ct_log <= MAX_LOG) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log request for TCP>\n");
#endif
SendFromGPRS(CHA_TCP, 0x10, 0x11, tempbuf, SYS_TELLEN + 3);
}
}
if (ct_log > MAX_LOG) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log error for TCP>\n");
#endif
OSQPost(GsmTaskMsgQue, MSG_TCPDRV_LOGERR, 0, 0);
}
}
static void Turninto_LOGED(void)
{
if (TCPDrvConnect()) {
status |= LOGED_;
StartTmr(monitortmr, PERIOD_DEFAULTQUERY);
OSQPost(GsmTaskMsgQue, MSG_TCPDRV_LOG, 0, 0);
}
}
static void MonitorTmrProc(void)
{
if (status & ACTIVE_) {
if (status & CONNECT_) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
if (status & LOGED_)
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<TCP link is overflow time>\n");
#endif
Turninto_LOGING();
if (TCPDrvLoged()) Informer_UDPLinkInexist();
} else
StartConnect();
} else {
StopTmr(monitortmr);
}
}
void InitTCPDrv(void)
{
status = 0;
monitortmr = CreateTimer(MonitorTmrProc, 0);
}
void ActivateTCPDrv(char *addr, char* port)
{
status |= (ACTIVE_ | CONNECT_);
status &= ~LOGED_;
memcpy(ipaddr, addr, sizeof(ipaddr));
memcpy(ipport, port, sizeof(ipport));
StartConnect();
}
void DeactivateTCPDrv(void)
{
status = 0;
StopTmr(monitortmr);
RequestCloseSocket();
ClearGPRSSendChannel(CHA_TCP);
}
void InformMsg_SocketOpen(void)
{
if (status & ACTIVE_) {
status |= (CONNECT_ | LOGED_);
ct_connect = 0;
Turninto_LOGING();
}
}
void InformMsg_SocketClose(void)
{
if (status & ACTIVE_) {
status &= ~(CONNECT_ | LOGED_);
StartTmr(monitortmr, PERIOD_CONNECTWAIT);
}
}
void InformMsg_TCPLoged(void)
{
if (TCPDrvConnect()) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<log success for TCP>\n");
#endif
Turninto_LOGED();
}
}
void InformMsg_QueryTCP(INT16U nexttime)
{
if (TCPDrvLoged()) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<receive query from TCP, and send ACK>\n");
#endif
StartTmr(monitortmr, MINUTE, nexttime + 1);
tempbuf[0] = 0x01;
SendFromGPRS(CHA_TCP, 0x10, 0x04, tempbuf, 1);
}
}
void Informer_TCPLinkInexist(void)
{
if (TCPDrvLoged()) Turninto_LOGING();
}
BOOLEAN TCPDrvLoged(void)
{
if ((status & (ACTIVE_ | CONNECT_ | LOGED_)) == (ACTIVE_ | CONNECT_ | LOGED_)) return TRUE;
else return FALSE;
}
BOOLEAN TCPDrvConnect(void)
{
if ((status & (ACTIVE_ | CONNECT_)) == (ACTIVE_ | CONNECT_)) return TRUE;
else return FALSE;
}
BOOLEAN TCPDrvActivated(void)
{
if (status & ACTIVE_) return TRUE;
else return FALSE;
}
BOOLEAN TcpDrvCanCom(void)
{
if (GPRSComIsSuspended() || !TCPDrvLoged()) return FALSE;
else return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -