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 CSock::_TcpKeep( BYTE v_bytNextInterval ) { if( !m_bTcpLogged ) return; PRTMSG(MSG_NOR, "Rcv Cent Tcp Link Keep Req: %d m\n", v_bytNextInterval ); G_RecordDebugInfo("Dvr Tcp Rcv Cent Link Keep Req: %d m", v_bytNextInterval ); char buf[ 100 ] = { 0 }; int iLen = 0; #if 0 == USE_PROTOCOL || 1 == USE_PROTOCOL || 30 == USE_PROTOCOL char* pData = NULL; int iDataLen = 0; const BYTE FRM04_GRADE = 0x10; #endif #if 2 == USE_PROTOCOL char cAnsType = 1; char* pData = &cAnsType; int iDataLen = sizeof(cAnsType); const BYTE FRM04_GRADE = 0x04; #endif if( !_MakeTcpFrame( pData, iDataLen, 0x04, FRM04_GRADE, buf, sizeof(buf), iLen ) ) { // 将数据推到业务支撑子层进行发送 DataPush(buf, iLen, DEV_DVR, DEV_SOCK, LV2); } _SetTimer(&g_objTimerMng, DVRTCP_RECONN_TIMER, 4*v_bytNextInterval*60000 + 50000, G_TmTcpReConn); }
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 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::Send4353(tag4353 &obj4353) { int iBufLen, iRet; char resbuf[1024] ={0}; PRTMSG(MSG_DBG, "Send4353 WinIndex=%d,Sta=0x%08X.",obj4353.ulWinIndex,obj4353.ulWinStatus); iRet = g_objSms.MakeSmsFrame((char*)&obj4353, sizeof(obj4353), 0x43, 0x53, resbuf, sizeof(resbuf), iBufLen); if( !iRet ) g_objSock.SOCKSNDSMSDATA( resbuf, iBufLen, LV12,0); memcpy(&m_ObjLst4353,&obj4353,sizeof(m_ObjLst4353)); _SetTimer(&g_objTimerMng, SEND4353_TIMER, 10000, G_TmSend4353); m_iSend4353Cnt = 0; }
int CHelp::DealComu80( char* v_szData, DWORD v_dwDataLen ) { int iRet = 0; int iBufLen = 0; WORD wPhotoType = 0; char buf[SOCK_MAXSIZE]; tag0341 req; tagQianGps objQianGps; tag2QGprsCfg objGprsCfg; GetSecCfg( &objGprsCfg, sizeof(objGprsCfg), offsetof(tagSecondCfg, m_uni2QGprsCfg.m_obj2QGprsCfg), sizeof(objGprsCfg) ); if( v_dwDataLen < 1 ) { iRet = ERR_PAR; goto DEALCOMU80_END; } iRet = g_objMonAlert.GetCurQianGps( objQianGps, true ); if( iRet ) goto DEALCOMU80_END; req.m_bytHelpType = v_szData[ 0 ]; memcpy( &req.m_objQianGps, &objQianGps, sizeof(req.m_objQianGps) ); iRet = g_objSms.MakeSmsFrame( (char*)&req, sizeof(req), 0x03, 0x41, buf, sizeof(buf), iBufLen ); if( iRet ) goto DEALCOMU80_END; iRet = g_objSock.SOCKSNDSMSDATA( buf, iBufLen, LV13, (objGprsCfg.m_bytChannelBkType_1 & 0x04) ? DATASYMB_SMSBACKUP : 0 ); DEALCOMU80_END: BYTE bytResType = 0; if( !iRet ) bytResType = 1; else bytResType = 2; buf[0] = 0x01; buf[1] = char(0x81); buf[2] = bytResType; DataPush(buf, 3, DEV_QIAN, DEV_DIAODU, LV2); #if QIANTYPE_USE == QIANTYPE_KJ2 || QIANTYPE_USE == QIANTYPE_JG2 || QIANTYPE_USE == QIANTYPE_V7 _SetTimer(&g_objTimerMng, AUTODIALHELPTEL_TIMER, 3000, G_TmAutoDialHelpTel ); #endif return iRet; }
void CCtrlGesture::onMouseMove (CPoint pt, uint /*key*/) { if (m_points.size() == 0) { return; // when called by CCtrlMain::_CheckMouseMove(), this could happen } CPoint ptLast = m_points[m_points.size() - 1]; if (abs(pt.x - ptLast.x) < m_gestureSensitivity && abs(pt.y - ptLast.y) < m_gestureSensitivity) { return; } assert(m_gestureTimeout > 0); m_isTimeout = false; _SetTimer(m_gestureTimeout, (uint)this); m_lastMove = ::GetTickCount(); int x = pt.x - ptLast.x; int y = pt.y - ptLast.y; TCHAR c; if (abs(x) > abs(y)) { if (x > 0) { c = _T('R'); } else { c = _T('L'); } } else { if (y > 0) { c = _T('D'); } else { c = _T('U'); } } if (m_gesture.length() == 0 || m_gesture.at(m_gesture.length() - 1) != c) { m_gesture += c; } m_points.push_back(pt); invalidate(); }
/// 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); } } }
void *G_BlackUploadThread(void* arg) { char szSendBuf[1500] = {0}; int iSendLen = 0; HI_U64 ulPackNo = 0; int ireadlen = 0; FILE *fp = NULL; fp = fopen(g_objUploadFileSta.m_szRealFileName[0],"rb"); if(NULL == fp) return NULL; tag1PComuCfg objComuCfg; GetImpCfg( &objComuCfg, sizeof(objComuCfg), offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(objComuCfg) ); // 将文件定位到所要上传的位置 fseek(fp, g_objUploadFileSta.m_ulStartOffset[0], SEEK_SET); // 分包组帧上传 for(ulPackNo=0; ulPackNo<g_objUploadFileSta.m_ulPackTotal; ulPackNo++) { // 包数据 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( ulPackNo % 10 == 0) { PRTMSG(MSG_DBG, "Upload C2 frame, ulPackNo = %d\n", ulPackNo); 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); }
void BeginUploadFile() { int i = 0; int iLen = 0; int iCurDateTime[6]; BYTE szTempBuf[100] = {0}; int iTempLen = 0; // 若当前正在监控,则返回 if( g_objWorkStart.VUpload[0] || g_objWorkStart.VUpload[1] || g_objWorkStart.VUpload[2] || g_objWorkStart.VUpload[3] ) return; // 更新上传文件的状态 if( FALSE == UpdateUploadSta(FALSE) ) return; // 组帧(C1帧) szTempBuf[iTempLen++] = 0xC1; // 手机号 tag1PComuCfg objComuCfg; GetImpCfg( &objComuCfg, sizeof(objComuCfg), offsetof(tagImportantCfg, m_uni1PComuCfg.m_obj1PComuCfg), sizeof(objComuCfg) ); memcpy(szTempBuf+iTempLen, objComuCfg.m_szTel, 15); iTempLen += 15; //文件类型 szTempBuf[iTempLen++] = g_objUploadFileSta.m_uszFileType; //此处黑匣子文件名固定长为34个字节,后面补空格,凑齐40个字节 iLen = strlen(g_objUploadFileSta.m_szTempFileName[0]); memcpy( szTempBuf+iTempLen, g_objUploadFileSta.m_szTempFileName[0], iLen); iTempLen += iLen; szTempBuf[iTempLen++] = ' ';szTempBuf[iTempLen++] = ' ';szTempBuf[iTempLen++] = ' '; szTempBuf[iTempLen++] = ' ';szTempBuf[iTempLen++] = ' ';szTempBuf[iTempLen++] = ' '; // 时间序号 GetCurDateTime( iCurDateTime ); szTempBuf[iTempLen++] = (char)(iCurDateTime[0]-2000); szTempBuf[iTempLen++] = (char)iCurDateTime[1]; szTempBuf[iTempLen++] = (char)iCurDateTime[2]; szTempBuf[iTempLen++] = (char)iCurDateTime[3]; szTempBuf[iTempLen++] = (char)iCurDateTime[4]; szTempBuf[iTempLen++] = (char)iCurDateTime[5]; // 总包数 memcpy(szTempBuf+iTempLen, (void*)&g_objUploadFileSta.m_ulPackTotal, 8); iTempLen += 8; // 推到SockServExe发送 DataPush(szTempBuf, (DWORD)iTempLen, DEV_DVR, DEV_SOCK, LV2); PRTMSG(MSG_DBG, "Upload C1 frame\n"); //PrintString((char*)szTempBuf, iTempLen); // 保存到缓冲,以备重传 memcpy(g_szReUploadBuf, szTempBuf, iTempLen); g_iReUploadLen = iTempLen; // 启动超时重传定时器 _SetTimer(&g_objTimerMng, C1C3_REUPLOAD_TIMER, 5000, Deal_ReUpload); }
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 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); }
void CQianIO::StartAccChk(DWORD v_dwFstInterval) { _KillTimer(&g_objTimerMng, ACCCHK_TIMER ); _SetTimer(&g_objTimerMng, ACCCHK_TIMER, v_dwFstInterval, G_TmAccChk ); }