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 ); }
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 ); }
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; } }
/***************************************************************************\ * 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); } }
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++; } }
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); }
// 文件类型(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; }
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; } }
void CQianIO::StartAccChk(DWORD v_dwFstInterval) { _KillTimer(&g_objTimerMng, ACCCHK_TIMER ); _SetTimer(&g_objTimerMng, ACCCHK_TIMER, v_dwFstInterval, G_TmAccChk ); }
/// 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, "" ); } }
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; }
// 文件类型(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); } } }
// 通道号(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; }
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); }
void CQianIO::StopAccChk() { _KillTimer(&g_objTimerMng, ACCCHK_TIMER ); }
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); }
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); } } }