Пример #1
0
void CLN_Login::HeartKeep()
{
	m_dwSendHeartKeepTimers++;

	// 心跳数据重传了9次未收到心跳应答,请求ComuExe重新拨号
	if( m_dwSendHeartKeepTimers >= 9 )
	{
		PRTMSG(MSG_NOR, "Send HeartKeep to max timers, Ask ComuExe to queck net!\n");
		char buf[] = {0x34, 0x01};
		DataPush((void*)&buf, 2, DEV_SOCK, DEV_PHONE, LV3);
		g_objLNDownLoad.m_bNetFined = false;
		m_dwSendHeartKeepTimers = 0;
		m_dwLoginSucc = 0;
		_KillTimer(&g_objTimerMng, HEART_KEEP_TIMER);

		return;
	}

	char  szBuf[100] = {0};
	DWORD dwLen = 0;
	
	szBuf[dwLen++] = 0x41;	// 命令类型
	
	szBuf[dwLen++] = 0x00;	// 动作:心跳
	szBuf[dwLen++] = 0x03;
	
	// 发送
	g_objApplication.SendAppFrame(MODE_A, 0x80, true, 0, szBuf, dwLen);
	PRTMSG(MSG_NOR, "Send HeartKeep Frame!\n");
	
	// 重启定时器
	tag1PComuCfg obj1PComuCfg;
	GetImpCfg( (void*)&obj1PComuCfg, sizeof(obj1PComuCfg), offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(obj1PComuCfg) );
	_SetTimer(&g_objTimerMng, HEART_KEEP_TIMER, obj1PComuCfg.m_iHeartKeepInterval*1000, G_TmHeartKeep );
}
Пример #2
0
void CQianIO::P_TmAccChk()
{
	_KillTimer(&g_objTimerMng, ACCCHK_TIMER );
	
	unsigned char uszResult;

	if( !IOGet((byte)IOS_ACC, &uszResult) )
	{
		if( IO_ACC_ON == uszResult )
		{
//			PowerOnGps( true );
			SetDevSta( true, DEVSTA_ACCVALID );
		}
		else if( IO_ACC_ON == uszResult )
		{
			DWORD dwCur = GetTickCount();
			if( dwCur - m_dwAccInvalidTm >= ACCCHK_INTERVAL )
			{
//				PowerOnGps( false );
				//告诉手柄进入省电模式
				char buf[] = {0x01, 0x0c, 0x01};
				DataPush(buf, 3, DEV_QIAN, DEV_DIAODU, LV2);
			}
			SetDevSta( false, DEVSTA_ACCVALID );
		} 
	}
	
	if( IO_ACC_ON == uszResult )
		_SetTimer(&g_objTimerMng,  ACCCHK_TIMER, ACCCHK_INTERVAL, G_TmAccChk ); // 不能省略
	else
		_SetTimer(&g_objTimerMng,  ACCCHK_TIMER, 10000, G_TmAccChk );
}
Пример #3
0
void CLN_Login::LoginAnswer(char *v_szBuf, DWORD v_dwLen)
{
	if( v_dwLen != 1 )
	{
		PRTMSG(MSG_ERR, "LoginAnswer len err, v_dwLen = %d\n", v_dwLen);
		return;
	}
	
	switch( v_szBuf[0] )
	{
	case 0x01:		// 登陆成功
		{
			PRTMSG(MSG_NOR, "Login succ!\n");
			g_objLNDownLoad.m_bNetFined = true;
			m_dwLoginTimers = 0;
			m_dwLoginSucc = 1;
			
			_KillTimer(&g_objTimerMng, LOGIN_TIMER);
			
			// 发送心跳维护帧
			HeartKeep();
		}
		break;
		
	case 0x00:		// 登陆失败,继续登陆
		{
			PRTMSG(MSG_NOR, "Login failed, continue Login!\n");
		}
		break;
		
	default:
		break;
	}
}
Пример #4
0
/***************************************************************************\
* KillTooltipTimer
*
* Kill the timer and zero out the timer id.
\***************************************************************************/
void KillTooltipTimer (PTOOLTIPWND pttwnd)
{
    UINT uTID = pttwnd->uTID;
    if (uTID != 0) {
        pttwnd->uTID = 0;
        _KillTimer((PWND)pttwnd, uTID);
    }
}
Пример #5
0
void CSock::TcpLog()
{
    char buf[ 200 ] = { 0 };
    int iLen = 0;

    // TCP连续登陆失败次数达到上限
    if(m_iTcpLogTimers > TCP_MAX_LOG_TIMERS)
    {
        m_iTcpLogTimers = 0;
        _KillTimer(&g_objTimerMng, DVRTCP_LOG_TIMER);

        buf[0] = 0x01;	// 请求SockServExe重新连接套接字
        DataPush(buf, 1, DEV_DVR, DEV_SOCK, LV3);
        PRTMSG(MSG_NOR, "Tcp Log failed to max timers, request Tcp Reconnect!\n");

        // 调度屏进行提示
        G_TmShowMsg(NULL, 0);

        return;
    }

    m_bTcpLogged = false;

#if USE_LIAONING_SANQI == 1
    buf[0] = 0x07;
    buf[1] = m_bTcpLogged ? 0x01 : 0x00;
    DataPush(buf, 2, DEV_DVR, DEV_QIAN, LV3);
#endif
    _SetTimer(&g_objTimerMng, DVRTCP_LOG_TIMER, 15000, G_TmTcpLog );

#if 2 == USE_PROTOCOL
    tag1PComuCfg obj1PComuCfg;
    obj1PComuCfg.Init(CDMA_NAME,CDMA_PASS);
    GetImpCfg( &obj1PComuCfg, sizeof(obj1PComuCfg),	offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(obj1PComuCfg) );
    memcpy( m_objGPRS01.m_szUserIdenCode, USERIDENCODE, sizeof(m_objGPRS01.m_szUserIdenCode) );
#endif

    GetSelfTel( m_objGPRS01.m_szParData, sizeof(m_objGPRS01.m_szParData) );

#if 0 == USE_PROTOCOL || 1 == USE_PROTOCOL || 30 == USE_PROTOCOL
    const BYTE GPRSLOGFRM_TYPE = 0x11;
    const BYTE GPRSLOGFRM_GRADE = 0x10;
#endif
#if 2 == USE_PROTOCOL
    const BYTE GPRSLOGFRM_TYPE = 0x01;
    const BYTE GPRSLOGFRM_GRADE = 0x04;
#endif
    if( !_MakeTcpFrame( (char*)&m_objGPRS01, sizeof(m_objGPRS01), GPRSLOGFRM_TYPE, GPRSLOGFRM_GRADE, buf, sizeof(buf), iLen ) )
    {
        PRTMSG(MSG_NOR, "Send Tcp Log Frame\n" );

        G_RecordDebugInfo("Dvr Send Tcp Log Frame" );

        DataPush(buf, iLen, DEV_DVR, DEV_SOCK, LV3);
        m_iTcpLogTimers++;
    }
}
Пример #6
0
void CDownLineFile::P_TmSend4353()
{
	PRTMSG(MSG_DBG, "TmSnd4353 Cnt=%d,WinIdx=%d,Sta=0x%08X.",m_iSend4353Cnt,m_ObjLst4353.ulWinIndex,m_ObjLst4353.ulWinStatus);

	int iBufLen, iRet;
	char resbuf[1024] ={0};

	iRet = g_objSms.MakeSmsFrame((char*)&m_ObjLst4353, sizeof(m_ObjLst4353), 0x43, 0x53, resbuf, sizeof(resbuf), iBufLen);
	if( !iRet ) g_objSock.SOCKSNDSMSDATA( resbuf, iBufLen, LV12,0);

	if(	++m_iSend4353Cnt >=3 ) 
		_KillTimer(&g_objTimerMng, SEND4353_TIMER);
}
Пример #7
0
// 文件类型(1)+ 文件名(40)+ 时间序号(6)+ 应答类型(1)
int  Deal38D1(char *v_databuf, int v_datalen)
{
	char	szFileName[40] = {0};
	FILE	*fp = NULL;
	int		iFileSize = 0;

	memcpy(szFileName, v_databuf+1, 34);
	PRTMSG(MSG_DBG, "Recv D1 frame:%s \n", szFileName);
	
	// 若文件名一致,则关闭C1重传定时器
	if( strcmp(szFileName, g_objUploadFileSta.m_szTempFileName[0]) == 0 )
	{
		PRTMSG(MSG_NOR, "Close C1_ReUpload Timer, Begin Upload...\n");		
		_KillTimer(&g_objTimerMng, C1C3_REUPLOAD_TIMER);
	}
	else
	{
		PRTMSG(MSG_NOR, "But Upload FileName is %s, quit!\n", g_objUploadFileSta.m_szTempFileName[0] );
		return 1;
	}

	// 文件检查
	fp = fopen(g_objUploadFileSta.m_szRealFileName[0], "rb");
	if( NULL != fp )
	{
		fseek(fp, 0, SEEK_END);
		iFileSize = ftell(fp);
		fseek(fp, 0, SEEK_SET);
	}
	if( 0 == iFileSize )
	{
		UpdateUploadSta(TRUE);
		BeginUploadFile();
		return 1;
	}
	if( NULL != fp )
		fclose(fp);

	// 创建文件上传线程
	pthread_create(&g_pthreadBlack, NULL, G_BlackUploadThread, NULL);	
	
	return 0;
}
Пример #8
0
void CLN_Login::RegisterAnswer(char *v_szBuf, DWORD v_dwLen)
{
	if( v_dwLen != 1 )
	{
		PRTMSG(MSG_ERR, "RegisterAnswer len err, v_dwLen = %d\n", v_dwLen);
		return;
	}
	
	switch( v_szBuf[0] )
	{
	case 0x01:		// 注册成功
		{
			PRTMSG(MSG_NOR, "Register succ!\n");

			tag1PComuCfg obj1PComuCfg;
			GetImpCfg( (void*)&obj1PComuCfg, sizeof(obj1PComuCfg), offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(obj1PComuCfg) );
			obj1PComuCfg.m_bRegsiter = true;
			SetImpCfg( (void*)&obj1PComuCfg, offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(obj1PComuCfg) );

			m_dwRegisterTimers = 0;
			
			_KillTimer(&g_objTimerMng, REGISTER_TIMER);
			
			// 发送登陆帧
			Login();
		}
		break;
		
	case 0x00:		// 注册失败,继续注册
		{
			PRTMSG(MSG_NOR, "Register failed, continue register!\n");
		}
		break;
		
	default:
		break;
	}
}
Пример #9
0
void CQianIO::StartAccChk(DWORD v_dwFstInterval)
{
	_KillTimer(&g_objTimerMng, ACCCHK_TIMER );
	_SetTimer(&g_objTimerMng, ACCCHK_TIMER, v_dwFstInterval, G_TmAccChk );
}
Пример #10
0
/// 7D+1->7D,7D+2->7E,去帧头尾7e之后,但没有完全解开GPRS封装
void CSock::_DealTcpData( char* v_szBuf, DWORD v_dwBufLen )
{
    if( v_dwBufLen < TCPFRAME_BASELEN )
    {
        XUN_ASSERT_VALID( false, "" );
        return;
    }

    DWORD dwDataPos = 0;
    BYTE bytFrmType = 0;
    BYTE bytGrade = 0;
#if 0 == USE_PROTOCOL || 1 == USE_PROTOCOL
    dwDataPos = 3;
    bytGrade = BYTE( v_szBuf[ 1 ] );
    bytFrmType = BYTE( v_szBuf[ 2 ] );
#endif
#if 2 == USE_PROTOCOL
    dwDataPos = 4;
    bytGrade = BYTE( v_szBuf[ 2 ] );
    bytFrmType = BYTE( v_szBuf[ 3 ] );
#endif

    switch( bytFrmType )
    {
    case 0x81:
    case 0x91: // 移动台登陆应答
    {
        if( v_dwBufLen > 6 )	// 若长度大于6,说明是第一次登陆应答,后面带有IP地址和端口
        {
            if( 1 == v_szBuf[ dwDataPos ] ) // 若是成功应答
            {
                PRTMSG(MSG_NOR,  "TCP First Logged Succ!\n" );

                G_RecordDebugInfo("Dvr Tcp First Logged Succ!" );

                _KillTimer(&g_objTimerMng, DVRTCP_LOG_TIMER );
                _KillTimer(&g_objTimerMng, SHOW_MSG_TIMER);

                // 提取IP端口,送到SockServExe
                char buf[ 200 ] = { 0 };
                buf[0] = 0x05;	// 请求SockServExe重新连接套接字,且附带有IP端口
                memcpy(buf+1, v_szBuf+dwDataPos+1, v_dwBufLen-dwDataPos-1);
                DataPush(buf, v_dwBufLen-dwDataPos, DEV_DVR, DEV_SOCK, LV3);
            }
            else
            {
                PRTMSG(MSG_NOR, "TCP First Logged Fail\n" );
                m_iTcpLogTimers = 0;

                // 通过调度屏提示
                G_TmShowMsg(NULL, 0);
            }
        }
        else					// 否则是第二次登陆后的应答
        {
            if( 1 == v_szBuf[ dwDataPos ] ) // 若是成功应答
            {
                PRTMSG(MSG_NOR,  "TCP Second Logged Succ!\n" );

                G_RecordDebugInfo("Dvr Tcp Second Logged Succ!" );

                _KillTimer(&g_objTimerMng, DVRTCP_LOG_TIMER );
                m_bTcpLogged = true;

#if USE_LIAONING_SANQI == 1
                char szbuf[ 2 ] = { 0 };
                szbuf[0] = 0x07;
                szbuf[1] = m_bTcpLogged ? 0x01 : 0x00;
                DataPush(szbuf, 2, DEV_DVR, DEV_QIAN, LV3);
#endif
                DWORD dwCur = GetTickCount();

                m_dwTcpLogTm = dwCur; // 确保之后重新进行登陆超时判断
                m_iTcpLogTimers = 0;

                char buf = 0x03;	// 通知SockServExe登陆成功
                DataPush((void*)&buf, 1, DEV_DVR, DEV_SOCK, LV3);

                // 关闭提示
                _KillTimer(&g_objTimerMng, SHOW_MSG_TIMER);

                // 防止万一TCP登陆后的第一个链路维护没有收到
                _SetTimer(&g_objTimerMng, DVRTCP_RECONN_TIMER, 180000, G_TmTcpReConn);
            }
            else
            {
                PRTMSG(MSG_NOR, "TCP Second Logged Fail\n" );
                m_iTcpLogTimers = 0;

                // 通过调度屏提示
                G_TmShowMsg(NULL, 0);
            }
        }
    }
    break;

    case 0x82: // 移动台数据传输应答
    {
        if( 0x02 == v_szBuf[ dwDataPos ] ) // 若移动台未登陆
        {
            m_dwTcpLogTm = GetTickCount(); // 先初始化时间,确保重新进行登陆超时判断
            TcpLog();
        }
    }
    break;

    case 0x83: // 业务数据
    {
        _DealGprsTran( bytGrade, v_szBuf + dwDataPos, v_dwBufLen - TCPFRAME_BASELEN );
    }
    break;

    case 0x84: // 前置机链路探询
    {
        _TcpKeep( BYTE(v_szBuf[ dwDataPos ]) );
    }
    break;

    default:
        XUN_ASSERT_VALID( false, "" );
    }
}
Пример #11
0
int CSock::AnalyseSockData( const char* v_szRecv, const int v_iRecvLen )
{
    if( !v_szRecv || v_iRecvLen <= 0 ) return 0;

    // 非中心协议帧
    if( 0x01 == v_szRecv[0] )
    {
        switch(v_szRecv[1])
        {
        case 0x01:		// SoceServExe通知已连接中心
        {
            TcpLog();
        }
        break;

        case 0x02:		// SoceServExe通知已断开中心
        {
            _KillTimer(&g_objTimerMng,DVRTCP_LOG_TIMER);
            m_bTcpLogged = false;
#if USE_LIAONING_SANQI == 1
            char buf[2] = {0};
            buf[0] = 0x07;
            buf[1] = m_bTcpLogged ? 0x01 : 0x00;
            DataPush(buf, 2, DEV_DVR, DEV_QIAN, LV3);
#endif
        }
        break;

        case 0x03:		// SoceServExe请求向调度屏发送提示
        {
            G_TmShowMsg(NULL, 0);
            _SetTimer(&g_objTimerMng, SHOW_MSG_TIMER, 30000, G_TmShowMsg);
        }
        break;

        default:
            break;
        }

        return 0;
    }

    // 中心TCP协议帧
    else if( 0x00 == v_szRecv[0] )
    {
        int i7ECount = 0;
        if( m_dwTcpFrameLen > 0 ) i7ECount = 1;

        int iBegin = 1;
        for( int i = 1; i < v_iRecvLen; i ++ )
        {
            if( 0x7e == v_szRecv[ i ] )
            {
                ++ i7ECount;

                if( 0 == i7ECount % 2 ) // 若得到一帧
                {
                    if( m_dwTcpFrameLen + (i - iBegin + 1) <= sizeof(m_szTcpRecvFrame) )
                    {
                        memcpy( m_szTcpRecvFrame + m_dwTcpFrameLen, v_szRecv + iBegin, i - iBegin + 1 );
                        m_dwTcpFrameLen += (DWORD)(i - iBegin + 1);

                        if( m_dwTcpFrameLen <= 2 )
                        {
                            ++ i7ECount;
                            iBegin = i;
                            memset((void*)m_szTcpRecvFrame, 0, sizeof(m_szTcpRecvFrame) );
                            m_dwTcpFrameLen = 0;
                            continue;
                        }
                        else
                        {
                            // 反转义
                            _DeTranData( m_szTcpRecvFrame, m_dwTcpFrameLen );

                            // 计算校验和
                            if( !_ChkSum( m_szTcpRecvFrame, m_dwTcpFrameLen) )
                            {
                                PRTMSG(MSG_NOR, "Dvr Tcp ChkSum err!\n");
                                memset((void*)m_szTcpRecvFrame, 0, sizeof(m_szTcpRecvFrame) );
                                m_dwTcpFrameLen = 0;
                                continue;
                            }

                            // 协议解析和处理
                            _DealTcpData( m_szTcpRecvFrame, m_dwTcpFrameLen );

                            memset((void*)m_szTcpRecvFrame, 0, sizeof(m_szTcpRecvFrame) );
                            m_dwTcpFrameLen = 0;
                        }
                    }
                    else
                    {
                        XUN_ASSERT_VALID( false, "" );
                        memset((void*)m_szTcpRecvFrame, 0, sizeof(m_szTcpRecvFrame) );
                        m_dwTcpFrameLen = 0;
                    }
                }
                else
                {
                    iBegin = i;
                }
            }
        }

        if( 0 != i7ECount % 2 ) // 若最后有不完整帧数据
        {
            if( m_dwTcpFrameLen + (v_iRecvLen - iBegin) < sizeof(m_szTcpRecvFrame) )
            {
                memcpy( m_szTcpRecvFrame + m_dwTcpFrameLen, v_szRecv + iBegin, v_iRecvLen - iBegin );
                m_dwTcpFrameLen += (DWORD)(v_iRecvLen - iBegin);
            }
            else
            {
                XUN_ASSERT_VALID( false, "" );
                memset((void*)m_szTcpRecvFrame, 0, sizeof(m_szTcpRecvFrame) );
                m_dwTcpFrameLen = 0;
                return 1;
            }
        }
    }
    // 中心UDP协议帧
    else if( 0x02 == v_szRecv[0] )
    {
        switch( v_szRecv[1] )
        {
#if VIDEO_BLACK_TYPE == 1
        case 0xB1:		// 黑匣子文件传输开始帧应答
            Deal38B1((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;

        case 0xB2:		// 黑匣子文件内容传输请求
            Deal38B2((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;

        case 0xB3:		// 黑匣子文件传输结束帧
            Deal38B3((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;
#endif

#if VIDEO_BLACK_TYPE == 2
        case 0xD1:
            Deal38D1((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;

        case 0xD3:
            Deal38D3((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;
#endif

        case 0x03:
            Deal3803((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;

        case 0x35:
            Deal3835((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;

        case 0x36:
            Deal3836((char*)v_szRecv+2, (int)v_iRecvLen-2);
            break;

        default:
            break;
        }
    }

    return 0;
}
Пример #12
0
// 文件类型(1)+ 文件名(40)+ 应答类型(1)+ 【请求重传的包个数(8) + 包序号(8)* M】
int  Deal38D3(char *v_databuf, int v_datalen)
{
	char	szFileName[40] = {0};
	FILE	*fp = NULL;
	HI_U64	ulPackCount = 0;
	HI_U64	ulPackNo = 0;
	HI_U64	i = 0;
	char	szSendBuf[1500] = {0};
	int		iSendLen = 0;
	int		ireadlen = 0;

	tag1PComuCfg objComuCfg;
	GetImpCfg( &objComuCfg, sizeof(objComuCfg), offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(objComuCfg) );	
	
	memcpy(szFileName, v_databuf+1, 34);
	PRTMSG(MSG_DBG, "Recv D3 frame:%s \n", szFileName);
	
	// 若文件名一致,则关闭C3重传定时器
	if( strcmp(szFileName, g_objUploadFileSta.m_szTempFileName[0]) == 0 )
	{
		PRTMSG(MSG_NOR, "Close C3_ReUpload Timer!\n");		
		_KillTimer(&g_objTimerMng, C1C3_REUPLOAD_TIMER);

		// 若文件接收完整
		if( v_databuf[41] == 0x01 )
		{
			UpdateUploadSta(TRUE);
			BeginUploadFile();
		}
		else
		{				
			fp = fopen(g_objUploadFileSta.m_szRealFileName[0],"rb");
			if(NULL == fp)
				return 1;

			// 请求重传包个数
			memcpy((void*)&ulPackCount, v_databuf+42, 8);

			for(i=0; i<ulPackCount; i++)
			{
				// 获取一个重传包序号
				memcpy((void*)&ulPackNo, v_databuf+50+8*i, 8);
				PRTMSG(MSG_DBG, "ReUpload Pack: %ld\n", ulPackNo);

				// 定位到文件中的该位置
				fseek(fp, g_objUploadFileSta.m_ulStartOffset[0]+ulPackNo*UPLOAD_PACK_SIZE, SEEK_SET );

				// 包数据
				if( (ireadlen = fread(szSendBuf+C2_HEAD_SIZE, 1, UPLOAD_PACK_SIZE, fp)) < 0 )
					break;

				iSendLen = 0;
				
				// 帧头
				szSendBuf[iSendLen++] = 0xC2;
				
				// 手机号
				memcpy(szSendBuf+iSendLen, objComuCfg.m_szTel, 15);
				iSendLen += 15;
				
				// 文件类型
				szSendBuf[iSendLen++] = g_objUploadFileSta.m_uszFileType;
				
				// 文件名
				memcpy(szSendBuf+iSendLen, g_objUploadFileSta.m_szTempFileName[0], 40);
				iSendLen += 40;
				
				// 包序号
				memcpy(szSendBuf+iSendLen, (void*)&ulPackNo, 8);
				iSendLen += 8;
				
				// 包大小
				szSendBuf[iSendLen++] = ireadlen%256;
				szSendBuf[iSendLen++] = ireadlen/256;

				//推到SockServExe发送
				DataPush(szSendBuf, ireadlen+C2_HEAD_SIZE, DEV_DVR, DEV_SOCK, LV2);

				if( i%10 == 0)
					usleep(200000);
			}

			if( NULL != fp )
				fclose(fp);

			// 再次发送C3结束帧:0xC3 + 手机号(15)+ 文件类型(1)+ 文件名(40)
			szSendBuf[0] = 0xC3;
			DataPush(szSendBuf, 57, DEV_DVR, DEV_SOCK, LV2);
			PRTMSG(MSG_DBG, "Upload C3 frame!\n");
			
			// 保存到缓冲,以备重传
			memcpy(g_szReUploadBuf, szSendBuf, 57);
			g_iReUploadLen = 57;
			
			// 启动超时重传定时器
			_SetTimer(&g_objTimerMng, C1C3_REUPLOAD_TIMER, 5000, Deal_ReUpload);
		}
	}
}
Пример #13
0
// 通道号(1)+ 事件类型(1)+ 起始日期(3)+ 起始时间(3)+ 结束日期(3)+结束时间(3)
int Deal380A(char *v_databuf, int v_datalen)
{
	int		i = 0;
	BYTE	szResBuf[100] = {0};
	int		iResLen = 0;
	BYTE	szResType = 1;
	char	szTempBuf[3] = {0};
	
	BLACK_QUERY_PARA  objQueryPara;
	char szStartTime[9] = {0};
	char szEndTime[9] = {0};

	int  iFileCount = 0;

	// 若当前正在进行监控,则不支持黑匣子查询
	if(	g_objWorkStart.VUpload[0] || g_objWorkStart.VUpload[1] || g_objWorkStart.VUpload[2] || g_objWorkStart.VUpload[3] )
	{
		szResType = 5;
		goto DEAL380A_END;
	}

	memset((void*)&g_objUploadFileSta, 0, sizeof(g_objUploadFileSta));
	_KillTimer(&g_objTimerMng, C1C3_REUPLOAD_TIMER);

	iFileCount = g_objUploadFileSta.m_iFileCount;

	// 检查参数长度
	if( v_datalen != 14 )
	{
		PRTMSG(MSG_ERR, "380A uncorrect len\n");
		szResType = 2;
		goto DEAL380A_END;
	}

	// 通道号
	objQueryPara.m_uszChnNo = v_databuf[0];

	// 事件类型
	objQueryPara.m_uszEventType = v_databuf[1];

	// 日期(由中心限定来查询日期只能在同一天)
	sprintf(objQueryPara.m_szDate, "%04d-%02d-%02d", 2000+v_databuf[2], v_databuf[3], v_databuf[4]);

	// 起始时间
	sprintf(objQueryPara.m_szStartTime, "%02d:%02d:%02d", v_databuf[5], v_databuf[6], v_databuf[7]);
	sprintf(szStartTime, "%02d:%02d:%02d", v_databuf[5], v_databuf[6], v_databuf[7]);

	// 结束时间
	sprintf(objQueryPara.m_szEndTime, "%02d:%02d:%02d", v_databuf[11], v_databuf[12], v_databuf[13]);
	sprintf(szEndTime, "%02d:%02d:%02d", v_databuf[11], v_databuf[12], v_databuf[13]);

	// 查询
	iFileCount = QueryBlackData(objQueryPara, szStartTime, szEndTime, iFileCount);

	if( 0 < iFileCount )
	{
		PRTMSG(MSG_NOR, "Query video black succ, Find %d files\n", iFileCount);

		g_objUploadFileSta.m_iFileCount += iFileCount;
		szResType = 1;
	}
	else if( 0 == iFileCount )
	{
		PRTMSG(MSG_DBG, "Query black failed, No such file\n");
		szResType = 3;
	}
	else
	{
		PRTMSG(MSG_DBG, "Query black failed, unknown reason\n");
		szResType = 4;
	}

	for(i=0; i<g_objUploadFileSta.m_iFileCount; i++)
	{
		PRTMSG(MSG_DBG, "The %d file:\n", i);
		PRTMSG(MSG_DBG, "            TempName:%s\n", g_objUploadFileSta.m_szTempFileName[i]);
		PRTMSG(MSG_DBG, "            RealName:%s\n", g_objUploadFileSta.m_szRealFileName[i]);
		PRTMSG(MSG_DBG, "            Start: %d\n", g_objUploadFileSta.m_ulStartOffset[i]);
		PRTMSG(MSG_DBG, "            End:   %d\n", g_objUploadFileSta.m_ulEndOffset[i]);
	}

DEAL380A_END:
	szResBuf[iResLen++] = 0x01;		// 0x01 表示向中心发送的数据帧

	szResBuf[iResLen++] = 0x38;
	szResBuf[iResLen++] = 0x4A;
	szResBuf[iResLen++] = szResType;
	if( szResType == 1)
	{
		szResBuf[iResLen++] = objQueryPara.m_uszEventType;	// 事件类型
		szResBuf[iResLen++] = v_databuf[2];		// 年
		szResBuf[iResLen++] = v_databuf[3];		// 月
		szResBuf[iResLen++] = v_databuf[4];		// 日
		
		memcpy(szTempBuf,szStartTime,2);
		szResBuf[iResLen++] = (BYTE)(atoi(szTempBuf));	//起始时

		memcpy(szTempBuf,szStartTime+3,2);
		szResBuf[iResLen++] = (BYTE)(atoi(szTempBuf));	//起始分

		memcpy(szTempBuf,szStartTime+6,2);
		szResBuf[iResLen++] = (BYTE)(atoi(szTempBuf));	//起始秒

		szResBuf[iResLen++] = v_databuf[2];		// 年
		szResBuf[iResLen++] = v_databuf[3];		// 月
		szResBuf[iResLen++] = v_databuf[4];		// 日

		memcpy(szTempBuf,szEndTime,2);
		szResBuf[iResLen++] = (BYTE)(atoi(szTempBuf));	//终止时

		memcpy(szTempBuf,szEndTime+3,2);
		szResBuf[iResLen++] = (BYTE)(atoi(szTempBuf));	//终止分

		memcpy(szTempBuf,szEndTime+6,2);
		szResBuf[iResLen++] = (BYTE)(atoi(szTempBuf));	//终止秒

		for(i=iResLen-6; i<iResLen; i++)
			if( 0 == szResBuf[i] )
				szResBuf[i] = 0x7f;
	}
	
#if USE_VIDEO_TCP == 0
	DataPush(szResBuf, (DWORD)iResLen, DEV_DVR, DEV_QIAN, LV2);
#endif

#if USE_VIDEO_TCP == 1
	char szbuf[1024] = {0};
	int  ilen = 0;
	g_objSock.MakeSmsFrame((char*)szResBuf+3, iResLen-3, 0x38, 0x4A, (char*)szbuf, sizeof(szbuf), ilen);
	g_objSock.SendTcpData(szbuf, ilen);
#endif

	// 应答后,则开始上传黑匣子文件
	sleep(2);
	BeginUploadFile();
	
	return (int)szResType;
}
Пример #14
0
void CLN_Login::Register()
{
	tag1PComuCfg obj1PComuCfg;
	GetImpCfg( &obj1PComuCfg, sizeof(obj1PComuCfg),	offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(obj1PComuCfg) );
	if( 0x20 == obj1PComuCfg.m_szTel[0] || 0x30 == obj1PComuCfg.m_szTel[0] || !strcmp("", obj1PComuCfg.m_szTel) )
	{
		PRTMSG(MSG_NOR, "Get SelfTel, but Incorrect or Empty, Quit Register!\n" );
		return;
	}

	m_dwRegisterTimers++;
	
	// 注册重传了10次未收到应答,请求ComuExe重新拨号
	if( m_dwRegisterTimers >= 50 )
	{
		PRTMSG(MSG_NOR, "Send Register to max timers, Ask ComuExe to queck net!\n");
		char buf[] = {0x34, 0x01};
		DataPush((void*)&buf, 2, DEV_SOCK, DEV_PHONE, LV3);
		
		m_dwRegisterTimers = 0;
		_KillTimer(&g_objTimerMng, REGISTER_TIMER);

		return;
	}

	char  szBuf[200] = {0};
	DWORD dwLen = 0;

	char  szTempBuf[100] = {0};
	DWORD dwTempLen = 0;

	szBuf[dwLen++] = 0x41;	// 命令类型

	szBuf[dwLen++] = 0x00;	// 动作:注册
	szBuf[dwLen++] = 0x00;

	szBuf[dwLen++] = 0x00;	// Attr1
	szBuf[dwLen++] = 0x03;	// K_len1
	szBuf[dwLen++] = 'v';	// Key1: ver 终端版本号:M(3)+R(3)+V(4)+S(1)
	szBuf[dwLen++] = 'e';
	szBuf[dwLen++] = 'r';
	szBuf[dwLen++] = 0x00;	// V_len1
	szBuf[dwLen++] = dwTempLen = GetVer(szTempBuf);
	memcpy(szBuf+dwLen, szTempBuf, dwTempLen);
	dwLen += dwTempLen;

	szBuf[dwLen++] = 0x00;	// Attr2
	szBuf[dwLen++] = 0x03;	// K_len2
	szBuf[dwLen++] = 'v';	// Key2: ven 厂商编号
	szBuf[dwLen++] = 'e';
	szBuf[dwLen++] = 'n';
	szBuf[dwLen++] = 0x00;	// V_len2
	szBuf[dwLen++] = dwTempLen = GetVen(szTempBuf);
	memcpy(szBuf+dwLen, szTempBuf, dwTempLen);
	dwLen += dwTempLen;

	szBuf[dwLen++] = 0x00;	// Attr3
	szBuf[dwLen++] = 0x05;	// K_len3
	szBuf[dwLen++] = 'g';	// Key3: group 集团计费号
	szBuf[dwLen++] = 'r';
	szBuf[dwLen++] = 'o';
	szBuf[dwLen++] = 'u';
	szBuf[dwLen++] = 'p';
	szBuf[dwLen++] = 0x00;	// V_len3
	szBuf[dwLen++] = dwTempLen = GetGroup(szTempBuf);
	memcpy(szBuf+dwLen, szTempBuf, dwTempLen);
	dwLen += dwTempLen;
	
	// 发送
	g_objApplication.SendAppFrame(MODE_A, 0x80, true, 0, szBuf, dwLen);
	PRTMSG(MSG_NOR, "Send Register Frame!\n");
	
	_SetTimer(&g_objTimerMng, REGISTER_TIMER, 10000, G_TmRegister);
}
Пример #15
0
void CQianIO::StopAccChk()
{
	_KillTimer(&g_objTimerMng, ACCCHK_TIMER );
}
Пример #16
0
void CLN_Login::Login()
{
	tag1PComuCfg obj1PComuCfg;
	GetImpCfg( &obj1PComuCfg, sizeof(obj1PComuCfg),	offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(obj1PComuCfg) );
	if( 0x20 == obj1PComuCfg.m_szTel[0] || 0x30 == obj1PComuCfg.m_szTel[0] || !strcmp("", obj1PComuCfg.m_szTel) )
	{
		PRTMSG(MSG_NOR, "Get SelfTel, but Incorrect or Empty, Quit Login!\n" );
		return;
	}

	m_dwLoginTimers++;
	
	// 登陆重传了10次未收到应答,请求ComuExe重新拨号
	if( m_dwLoginTimers >= 50 )
	{
		PRTMSG(MSG_NOR, "Send Login to max timers, Ask ComuExe to queck net!\n");
		char buf[] = {0x34, 0x01};
		DataPush((void*)&buf, 2, DEV_SOCK, DEV_PHONE, LV3);
		
		m_dwLoginTimers = 0;
		_KillTimer(&g_objTimerMng, LOGIN_TIMER);
	
		return;
	}

	char  szBuf[200] = {0};
	DWORD dwLen = 0;
	
	char  szTempBuf[100] = {0};
	DWORD dwTempLen = 0;
	
	szBuf[dwLen++] = 0x41;	// 命令类型
	
	szBuf[dwLen++] = 0x00;	// 动作:登陆
	szBuf[dwLen++] = 0x01;
	
	// 终端类型
	szBuf[dwLen++] = 0x00;	// Attr1
	szBuf[dwLen++] = 0x02;	// K_len1
	szBuf[dwLen++] = 't';	// Key1: tP 终端类型
	szBuf[dwLen++] = 'P';
	szBuf[dwLen++] = 0x00;	// V_len1
	szBuf[dwLen++] = 0x01;
	szBuf[dwLen++] = 0x01;	// 01h:新协议,02h:老协议,03h:兼容协议,04h:VG3协议

	// 终端版本号
	szBuf[dwLen++] = 0x00;	// Attr2
	szBuf[dwLen++] = 0x03;	// K_len2
	szBuf[dwLen++] = 'v';	// Key2: ver 终端版本号:M(3)+R(3)+V(4)+S(1)
	szBuf[dwLen++] = 'e';
	szBuf[dwLen++] = 'r';
	szBuf[dwLen++] = 0x00;	// V_len2
	szBuf[dwLen++] = dwTempLen = GetVer(szTempBuf);
	memcpy(szBuf+dwLen, szTempBuf, dwTempLen);
	dwLen += dwTempLen;

	// 位置信息、速度、方向、里程
	dwTempLen = G_GetPoint(szTempBuf);	
	memcpy(szBuf+dwLen, szTempBuf, dwTempLen);
	dwLen += dwTempLen;
	
	// 发送
	g_objApplication.SendAppFrame(MODE_A, 0x80, true, 0, szBuf, dwLen);
	PRTMSG(MSG_NOR, "Send Login Frame!\n");
	_KillTimer(&g_objTimerMng, HEART_KEEP_TIMER);
	_SetTimer(&g_objTimerMng, LOGIN_TIMER, 10000, G_TmLogin);
}
Пример #17
0
int CDownLineFile::Deal4313(char *v_szbuf, DWORD v_dwLen)
{
	FILE *fpbus = NULL;
	int iBufLen, iRet;
	char resbuf[1024] ={0};
	tag4353 obj4353;
	tag4313 *obj4313;

	if (m_usWinSize>32) 
		return ERR_FILE;

	_KillTimer(&g_objTimerMng, SEND4353_TIMER);
	
	obj4313 = (tag4313*)(v_szbuf);

	PRTMSG(MSG_DBG, "Deal4313: Idx=%d/%d,Sta=0x%08X,Len=%d\n",obj4313->ulPackIndex,m_dwPackNum,m_dwBufSta,v_dwLen);
	if (m_dwCurWinIdx != obj4313->ulPackIndex/m_usWinSize) 
	{
		PRTMSG(MSG_DBG, "Deal4313 data Win Index err!\n");
		return ERR_PAR;
	}

	memcpy(m_RevBuf+1024*(obj4313->ulPackIndex%m_usWinSize), obj4313->aryLineDat, obj4313->usPackSize);

	if (obj4313->ulPackIndex == m_dwPackNum-1) // 最后一个包
	{
		m_usLastPackSize = obj4313->usPackSize;
	}

	m_dwWinCnt  = obj4313->ulPackIndex/m_usWinSize;
	m_dwBufSta |= (0x01<<(obj4313->ulPackIndex%m_usWinSize));	
	m_dwPackCnt ++;  

	if(obj4313->bNeedAns)
	{
		memcpy(obj4353.strVersion,m_strCurVer,sizeof(obj4353.strVersion));

		if (IsWinRecvOver()) // 该窗口全部接收完毕
		{
			PRTMSG(MSG_DBG, "Recv Win=%d Full\n", m_dwWinCnt);			
			
			char buf[MAX_PATH] = {0};
			fpbus =	fopen(SPRINTF(buf, "%sLineIno.wav", RPTSTATION_SAVE_PATH),"rb+");

			// 将数据写入文件
			if (fpbus) 
			{		
				fseek(fpbus, m_dwWinCnt*32*1024, 0);

				if ( m_dwWinCnt == (m_dwPackNum / m_usWinSize  ) ) 	
				{
					fwrite(m_RevBuf,(m_dwPackNum%m_usWinSize-1) *1024 + m_usLastPackSize ,1,fpbus);
				}
				else
				{
					fwrite(m_RevBuf, m_usWinSize*1024,1,fpbus);
				}

				fclose(fpbus);
				m_dwCurWinIdx++;
			}
			else
			{
				PRTMSG(MSG_NOR, "Deal4313 open Line File err\n");
				return ERR_FILE;
			}

			if(obj4313->ulPackIndex == m_dwPackNum-1) //传输完毕
			{
				//进行MD5校验
				CMd5 cmd5;
				tag4350 obj4350;
				char strMd5_here[32];

				char buf[MAX_PATH] = {0};
				cmd5.MD5File(SPRINTF(buf, "%sLineIno.wav", RPTSTATION_SAVE_PATH),strMd5_here);

				byte m_md5ok = (0==strncmp(strMd5_here,(char*)m_AryMd5,32)) ? true : false;

				memcpy(obj4350.strVersion,m_strCurVer,sizeof(obj4350.strVersion));

				obj4350.bSucc = m_md5ok;

				if (m_md5ok) 
				{				
					tag2QLineVersionCfg objLineVerCfg;
					memcpy(objLineVerCfg.strVer,m_strCurVer,sizeof(objLineVerCfg.strVer));

					if (SetSecCfg(&objLineVerCfg, offsetof(tagSecondCfg, m_uni2QLineVersionCfg.m_obj2QLineVersionCfg), sizeof(objLineVerCfg)) ) 
					{
						obj4350.bSucc = 0;
					}
				}

				iRet = g_objSms.MakeSmsFrame((char*)&obj4350, sizeof(obj4350), 0x43, 0x50, resbuf, sizeof(resbuf), iBufLen);
				if( !iRet ) g_objSock.SOCKSNDSMSDATA( resbuf, iBufLen, LV12,0);
               
				ClrAllFlags();

				g_objAuoRptStationNew.CenterLoadSta(0);
 			}
			else
			{
				obj4353.ulWinIndex  = obj4313->ulPackIndex/m_usWinSize +1;
				obj4353.ulWinStatus = 0;
				Send4353(obj4353);

				//清标志,为接收下一个窗口
				m_dwBufSta = 0;
				memset(m_RevBuf, 0, sizeof(m_RevBuf));
			}
		}
		else
		{
			obj4353.ulWinIndex  = obj4313->ulPackIndex/m_usWinSize;
			obj4353.ulWinStatus = m_dwBufSta;	
			Send4353(obj4353);
		}			
	}
}