Пример #1
0
//----------------------------------------------------------------------------
//
//  Function:   SendTick
//
//  Synopsis:   发心跳包
//
//  Arguments:  none
//
//  History:    2004-09-20   ZhangWei   Created
//
//  Notes:
//
//----------------------------------------------------------------------------
long __stdcall SendTick()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

	ST_CPACK rpack;
	unsigned char szBuffer[10960];
	int  nLen = sizeof(szBuffer);

	memset(&rpack, 0, sizeof(rpack));
	memset(szBuffer, 0, sizeof(szBuffer));

	rpack.head.RequestType = 930099; 
	rpack.head.firstflag = 1;   /* 是否第一个请求(首包请求)*/
	rpack.head.nextflag = 0;    /* 是否后续包请求*/
	rpack.head.recCount = 1;    /* 本包的记录数*/
	rpack.head.retCode = 0;     /* 返回代码*/
	rpack.head.userdata = 0;

	SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey));
	SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey);

	char omsg[256];
	if( EncodeBuf(&rpack, szBuffer, &nLen, omsg) )
	{
		if( SendDataPro(iServerNo, iFunc, (char*)szBuffer, nLen, 1, FALSE) == RET_OK )
		{			
			WriteTickLog("发心跳包成功! 服务号:%d, 子功能号:%d\n", iServerNo, iFunc);
			return RET_OK;
		}
	}

	WriteTickLog("发送心跳包失败! 请检查金仕达中间层!! 服务号:%d, 子功能号:%d", iServerNo, iFunc);

	return RET_SYSERROR;
}
Пример #2
0
int CSvrLink::PushDataEx(TPUSHDEST *pushdests, int pdcount, ST_CPACK *ppack, char pushmode, int acktime)
{
   int i;
   unsigned char sbuf[MAXMSG];
   RP_PUSHDATAH *ph;
   TPUSHDESTN *pd;
   unsigned short len;
   char szmsg[256];
   ASSERT(pdcount>0);
   ph = (RP_PUSHDATAH *)sbuf;
   ph->pushmode = pushmode;
   ph->acktime = htonl(acktime);
   ph->dcount = htons(pdcount);
   len = sizeof(RP_PUSHDATAH);
   pd = (TPUSHDESTN *)(sbuf+len);
   for (i=0;i<pdcount;i++)
   {
      pd[i].SourceNo = htons(pushdests[i].SourceNo);
      pd[i].DestNo = htons(pushdests[i].DestNo);
      pd[i].FuncNo = htons(pushdests[i].FuncNo);
      pd[i].BatchNo = htonl(pushdests[i].BatchNo);
      len += sizeof(TPUSHDESTN);
   }
   if (ppack->head.recCount>1)
   {
      ppack->head.recCount = 1;
   }
   EncodeBuf(ppack,sbuf+len,&i,szmsg);
   len += i;
   return(SendMsg(MT_PUSHDATA,len,sbuf));   
}
Пример #3
0
int CSvrLink::IntCall(char *szBUGroupID, int waittime, ST_CPACK *rpack, ST_CPACK *apack, ST_PACK *pArrays)
{
   int rtn;
   unsigned short len;
   unsigned char sbuf[MAXMSG];
   char szmsg[256]={0};
   RP_INTCALLH *pic = (RP_INTCALLH *)sbuf;
   pic->waittime = htonl(waittime);
   strncpy(pic->szBUGroupID,szBUGroupID,MAXBUGRPID);
   if (rpack->head.recCount>1)
   {
      rpack->head.recCount = 1;
   }
   EncodeBuf(rpack,sbuf+sizeof(RP_INTCALLH),&rtn,szmsg);
   len = rtn+sizeof(RP_INTCALLH);
   rtn=SendMsg(MT_INTCALL,len,sbuf);
   while (rtn==0)
   {
      rtn = RecvMsg(waittime*1000+1000);
      if (rtn>0)
      {
         MSGBUF *pmb = GetRecvMsg();
         if (pmb->head.msgtype==MT_PUSHDATA)
         {
            // 有应答数据返回:
            rtn = 0;
            DecodeBufWithArray((unsigned char *)pmb->data,pmb->head.len,apack,pArrays,&rtn,szmsg);
            //memset(&xcdata,0,sizeof(xcdata));  // 清空
            memcpy(&(xcdata.ahead),&(apack->head),sizeof(ST_PACKHEAD));
            if (pmb->head.len>=rtn+sizeof(TPUSHDESTN))
            {
               TPUSHDESTN *pd = (TPUSHDESTN *)(pmb->data+rtn);
               xcdata.sno = ntohs(pd->SourceNo);
               xcdata.dno = ntohs(pd->DestNo);
               xcdata.fno = ntohs(pd->FuncNo);
            }
            return(rtn);
         }
         else
         {
            DEBUG_RUNTIME_MSGOUT("IntCall中间收到了非MT_INTCALL应答包,属于程序错误!");
            rtn = 0; // 继续读取数据,以便接收到正确的MT_INTCALL应答包
         }
      }
      else if (rtn==0)
      {
         return(-2);  // 等待应答数据超时,即自从向外发送了请求后,在waittime+1秒内没有接收到应答数据  
      }
   }
   return(-1); // 其他各种通讯方面的错误
}
Пример #4
0
int kcc_des_drtp_send_cpack(int handle,ST_CPACK * rpack)
{
    char buf[8182] = "";
	int buflen;
	int ret;
	ret = EncodeBuf(rpack,(unsigned char*)buf,&buflen,kcc_drtp_err_msg);
	if( !ret )
	{
		kcc_write_log(LOG_ERR,"encode buffer error .handle[%d]",handle);
		return -1;
	}
	kcc_write_log(LOG_DEBUG,"cpack request type[%d]handle[%d]",
				  rpack->head.RequestType,handle);
	ret = kcc_drtp_send(handle,buf,buflen,g_des_drtp_func_no);
//	kcc_drtp_set_main_func(g_des_drtp_func_no);
	return ret;    
}
Пример #5
0
//发设备心跳  (不用!!!! 20050305)
long __stdcall SendDocTick(TSSmartDoc *pDoc)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

	ST_CPACK rpack;
	unsigned char szBuffer[8192];
	int  nLen = sizeof(szBuffer);

	memset(&rpack, 0, sizeof(rpack));
	memset(szBuffer, 0, sizeof(szBuffer));

	rpack.head.RequestType = 930099; 
	rpack.head.firstflag = 1;   /* 是否第一个请求(首包请求)*/
	rpack.head.nextflag = 0;    /* 是否后续包请求*/
	rpack.head.recCount = 1;    /* 本包的记录数*/
	rpack.head.retCode = 0;     /* 返回代码*/
	rpack.head.userdata = 0;

	char szDateTime[24];
	SYSTEMTIME  SysTime;

	GetLocalTime(&SysTime);
	sprintf(szDateTime, "%02d%02d%02d%02d%02d%02d", 
		SysTime.wYear,  SysTime.wMonth, SysTime.wDay,
		SysTime.wHour, SysTime.wMinute, SysTime.wSecond);

	SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey));
	SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey);
	SetValue(&rpack.head,&rpack.pack, F_SDATE0, pDoc->m_szDeviceID);
	SetValue(&rpack.head,&rpack.pack, F_SHOLDER_AC_NO, szDateTime);
	SetValue(&rpack.head,&rpack.pack, F_SSERIAL0, pDoc->m_sDownBlackTime);

	SetValue(&rpack.head,&rpack.pack, F_DAMT0, "0");
	SetValue(&rpack.head,&rpack.pack, F_DAMT1, "0");
	SetValue(&rpack.head,&rpack.pack, F_DAMT2, "0");

	char omsg[256];
	if( EncodeBuf(&rpack, szBuffer, &nLen, omsg) )
	{
		WriteTickLog("发送设备心跳包! 设备ID=%s", pDoc->m_szDeviceID);
		return SendDataPro(iServerNo, iFunc, (char*)szBuffer, nLen, 1, FALSE);
	}

	return RET_SYSERROR;
}
Пример #6
0
int CSvrLink::AnswerDataEx(TRUSERID *ruserid, ST_CPACK *apack, ST_PACK *pArrays, int retcode, char *szmsg)
{
   unsigned char sbuf[MAXMSG];
   RP_ANSDATAEXH *pad;
   unsigned char *buf;
   int len;
   char szMsg[256];
   pad = (RP_ANSDATAEXH *)sbuf;
   buf = sbuf+sizeof(RP_ANSDATAEXH);

/* ****** Updated by CHENYH at 2004-3-11 20:43:59 ****** 
   if (szmsg!=NULL && szmsg[0]!='\0')
   {
      SetParmBit(&(apack->head),F_VSMESS);
      strcpy(apack->pack.vsmess,szmsg);
   }
*/
   apack->head.retCode = retcode;
   if (ruserid==NULL)
   {
      pad->SourceNo = htons(0xFFFF);
   }
   else
   {
      pad->SourceNo = htons(ruserid->SourceNo);
      memcpy(&(pad->syshead),&(ruserid->syshead),sizeof(pad->syshead));
   }

   if (apack->head.recCount<1)
   {
      len = sizeof(ST_PACKHEAD);
      ModifyHead(&(apack->head),buf);
   }
   else if (apack->head.recCount==1||pArrays==NULL)
   {
      apack->head.recCount = 1;
      EncodeBuf(apack,buf,&len,szMsg);
   }
   else 
   {
      EncodeBufArray(apack,pArrays,buf,&len,szMsg);
   }
   len += sizeof(RP_ANSDATAEXH);
   return(SendMsg(MT_ANSDATAEX,(unsigned int)len,sbuf));
}
Пример #7
0
static char *PackRead(PackFile *pack, char *name, int *size, FILE *fp)
{
    int i;

    if (!pack) {
        EngineError("not open pack file\n");
    }
    for (i = 0; i < pack->num; i++) {
        struct Data *file = &pack->file[i];
        if (!StrCmp(file->name, name)) {
            char *data;
            data  = (char *)Malloc(sizeof(char) * file->size);
            fseek(fp, file->ptr, SEEK_SET);
            fread(data, sizeof(char),  file->size, fp);
            EncodeBuf(data, file->size, 0);
            *size = file->size;
            WriteLog("read from pack file %s\n", name);
            return data;
        }
    }
    EngineError("not find %s\n", name);
    return NULL;
}
Пример #8
0
int CDRTPHelper::SendRequest(int timeout /*=0*/)
{
	m_errcode = 0;
	memset(&m_errmsg,0,sizeof m_errmsg);
	int len = sizeof m_drtpBuf;
	int retries = 3;
	BOOL bRet = FALSE;
	m_currRecord = NULL;
	m_currIndex = 0;
	m_currRecordCount = 0;
	m_timeout = timeout;
	m_requestPack.head.recCount = m_rec_cnt;
	m_requestPack.head.retCode = 0;
	
	
	memset(m_drtpBuf,0,sizeof m_drtpBuf);
	
	if(!EncodeBuf(&m_requestPack, m_drtpBuf,&len, m_errmsg))
		return -3;

	/*
	bRet = DrtpSendMessage((char*)m_drtpBuf,len,&m_errcode,m_errmsg,&m_tag,
		0,-1,0,-1,2);
	*/
	bRet = DrtpPostMessage(5,m_drtpNo,m_funcNo,(char*)m_drtpBuf,len,&m_errcode,m_errmsg,m_drtpHandle,0,1);
	if(bRet == FALSE)
	{
		GetErrMsg();
		testDrtpHandle();
		return -1;
	}
	retries = 3;
	int readLen = 0;

	bRet = DrtpReadMessage((char*)m_drtpBuf, sizeof m_drtpBuf,&readLen,
		m_drtpHandle,&m_tag,&m_errcode,m_errmsg,m_timeout);

	if(bRet == FALSE)
	{
		GetErrMsg();
		logDrtpErrMsg();
		testDrtpHandle();
		return -1;
	}
	memset(&m_responsePack,0,sizeof(m_responsePack));
	memset(m_dataArray, 0, sizeof(m_dataArray));
	// 把接收缓冲区中的内容解码到Pack和DataArray中
	len = sizeof m_drtpBuf;
	int nCount = 0;
	bRet = DecodeBufWithArray((BYTE*)m_drtpBuf,readLen, &m_responsePack
		,m_dataArray, &nCount, 0);
	if(bRet == FALSE)
	{
		GetErrMsg();
		logDrtpErrMsg();
		return -1;
	}
	// 记录返回结果集数
	m_currRecordCount = m_responsePack.head.recCount;
	return 0;
}
Пример #9
0
//----------------------------------------------------------------------------
//
//  Function:   OutputRealData
//
//  Synopsis:   将硬件数据流转换为接口数据并发给金仕达传输层
//
//  Arguments:  nType     -- 数据类型
//				ucRawData -- 收上的数据
//				nDataLen  -- 收上的数据长度
//  History:    2004-09-20   ZhangWei   Created
//
//  Notes:
//
//----------------------------------------------------------------------------
long __stdcall OutputRealData(TSSmartTask *pTask, TSSmartDoc *pDoc, int nType, unsigned char *ucRawData, int nDataLen)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

	long iResult = RET_OK;
	ST_CPACK rpack;

	switch(nType)
	{
		case 0x01:	//收费机
			iResult = theApp.ConvertDealData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			TestData.AddSFCount(1);
			break;
		case 0x21:  //收费机(历史)
			iResult = theApp.ConvertDealData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			rpack.head.RequestType = 930098; //应答码		
			break;
		case 0x02:	//计时宝
			iResult = theApp.ConvertIdentifyData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			rpack.head.RequestType = 930101; 
			break;
		case 0x22:  //计时宝(历史)
			iResult = theApp.ConvertIdentifyData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			break;
		case 0x03:  //扎帐	
		case 0x23:  //扎帐(历史)
			iResult = theApp.ConvertStateData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			TestData.AddJZCount(1);
			break;
		case 0x04:  //补助		
			iResult = theApp.ConvertAssisData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			TestData.AddBZCount(1);
			break;
		case 0x24:  //补助(历史)
			iResult = theApp.ConvertAssisData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			rpack.head.RequestType = 930098; //应答码		
			break;			
		case 0x05:  //挂失
			break;
		case 0x06:  //增值机	
			iResult = theApp.ConvertDealData1(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			TestData.AddCZCount(1);
			break;
		case 0x26:  //增值机(历史)
			iResult = theApp.ConvertDealData1(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			rpack.head.RequestType = 930098; //应答码		
			break;
		case 0x07:  //增值机管理费	
		case 0x27:  //增值机管理费(历史)	
			iResult = theApp.ConvertDealData2(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			TestData.AddCZCount(1);
			break; 
		case 0x08:	//终端无反应
		case 0x09:	//无对应序号的数
			iResult = theApp.ConvertError(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			break;
		case 0x81:  //挂失
		case 0x82:  //解挂
		case 0x83:  //修改密码
			iResult = theApp.ConvertGSJData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen);
			break;
		default:
			printf("未知的数据类型!.............\n");
			break;
	}

	//经过很运行,发现系统经常被送上来异常数据,都是无效数据,
	if( iResult == RET_DATACRC_ERROR )
	{
		return RET_OK;
	}

	if( iResult != RET_OK ) 
	{
		WriteLog("将硬件数据流转换为接口数据并发给金仕达传输层....失败!.......\n");
		return RET_SYSERROR;
	}

	if( !pDoc->m_nStartuse && strcmp(pDoc->m_szMacType, "5301") && 
		( nType == 0x01 || nType == 0x02 || nType == 0x03 || nType == 0x04 || nType == 0x06 )  )
	{
		//theApp.SignIn(pDoc);
		//pDoc->m_nStartuse = 1 ;
	}

	char buffer[8192];
	int  nLen = sizeof(buffer);
	char omsg[256];
	HANDLE& hHandle = ConnectPool.Alloc(); //hNewHandle;

	DWORD nTick1 = GetTickCount();

	memset(buffer, 0x00, sizeof buffer );
	if( EncodeBuf(&rpack, (unsigned char*)buffer, &nLen, omsg) ) 
	{
		if( SendData(hHandle, iServerNo, iFunc, (char*)buffer, nLen, 1, FALSE) == RET_OK ) 
		{
			nLen = sizeof(buffer);
			memset(buffer, 0, sizeof(buffer));
			int nlen = RecvData(hHandle, buffer, nLen, 10000);
			if( nlen > 0 )
			{
				ST_CPACK apack;
				memset(&apack, 0, sizeof(apack));
				if( DecodeBuf((unsigned char*)buffer,nlen,&apack,omsg) )
				{
					//if(apack.head.RequestType == 930057)
					printf("apack.head.retCode=%d\n",apack.head.retCode);
					printf("发送RequestType = %d 接收RequestType=%d",rpack.head.RequestType,apack.head.RequestType);
					//if( !apack.head.retCode && apack.head.RequestType == rpack.head.RequestType )
					if(!apack.head.retCode)
					{
						ConnectPool.Free(hHandle);

						WriteLog("功能号=%d, 保存数据到金仕达成功!消息=%s 耗费时间(毫秒)%d...\n", apack.head.RequestType,apack.pack.vsmess, GetTickCount()-nTick1 );
						return RET_OK;
					}
					else
					{
						WriteLog("保存数据到金仕达失败! 金仕达返回错误:功能号=%d, 返回码=%d, 消息=%s! 耗费时间(毫秒)%d...\n", 
							apack.head.RequestType, apack.head.retCode, apack.pack.vsmess, GetTickCount() - nTick1 );
					}
				}
			}
		}
	}
	ConnectPool.Free(hHandle);

	return RET_SYSERROR;
}
Пример #10
0
//----------------------------------------------------------------------------
//
//  Function:   ReadSmartDocList
//
//  Synopsis:   读入设备档案表
//
//  Arguments:  pSmartDoc -- 设备档案表
//				nRecCount -- 记录数
//
//  History:    2004-09-20   ZhangWei   Created
//
//  Notes:
//
//----------------------------------------------------------------------------
long __stdcall ReadSmartDocList(TSSmartDoc *pSmartDoc, long *nRecCount)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

	ST_CPACK rpack;
	ST_CPACK apack;
	ST_PACK  apackarray[60];
	char buffer[20960];

	WriteLog("三九前置向金仕达调用功能号%d, 申请获取全部设备档案表\n", 930037);

	long k = 0 ;
	bool bEnd = false;
	int  nlen = 0 ;
	int  nRow = 0 ;
	int  nfirst = 1 ;
	int  nLen = sizeof(buffer);
	char omsg[256];
	ST_PACK *pPacket = NULL;

	HANDLE& hHandle = ConnectPool.Alloc();

#if __DEBUG_INTERFACE__
//#if 0
	while( !bEnd )
	{
		if( k >= MAX_SMART_DOC )
		{
			ConnectPool.Free(hHandle);
			WriteLog("设备档案数量大于%d, 请检查设备档案参数表!!!!\n", MAX_SMART_DOC);
			break;
		}

		memset(&rpack, 0, sizeof(rpack));

		rpack.head.RequestType = 930037; 
		rpack.head.recCount = 1;    /* 本包的记录数*/
		rpack.head.retCode = 0;     /* 返回代码*/
		rpack.head.userdata = 0;

		if( nfirst )
		{
			rpack.head.firstflag = 1;   /* 是否第一个请求(首包请求)*/
			rpack.head.nextflag = 0;    /* 是否后续包请求*/
			nfirst = 0 ;
		}
		else
		{
			rpack.head.firstflag = 0;   /* 是否第一个请求(首包请求)*/
			rpack.head.nextflag = 1;    /* 是否后续包请求*/
			memcpy(&rpack.head.hook,&apack.head.hook,sizeof(rpack.head.hook));
			rpack.head.hook.queuetype=apack.head.hook.queuetype;
		}

		SetValue(&rpack.head,&rpack.pack, F_SDATE1, "00000000");
		SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey));	//前置机注册号
		SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey);			//动态密钥

		nLen = sizeof(buffer);
		memset(buffer, 0, sizeof(buffer));

		if( !EncodeBuf(&rpack, (unsigned char*)buffer, &nLen, omsg) )
		{
			ConnectPool.Free(hHandle);
			WriteLog("执行功能号930037读入设备档案表时,运行EncodeBuf失败\n");
			return RET_SYSERROR;
		}
		printf("执行功能号930037读入设备档案表\n");
		if( SendData(hHandle, iServerNo, iFunc, (char*)buffer, nLen, 1, FALSE) != RET_OK )
		{
			ConnectPool.Free(hHandle);
			WriteLog("执行功能号930037读入设备档案表时,运行SendData失败\n");
			return RET_SYSERROR;
		}

		memset(buffer, 0, sizeof(buffer));

		nLen = sizeof(buffer);
		nlen = RecvData(hHandle, buffer, nLen, 10000);
		if( nlen <= 0 )
		{
			ConnectPool.Free(hHandle);
			WriteLog("执行功能号930037读入设备档案表时,运行RecvData失败\n");
			return RET_SYSERROR;
		}

		BOOL bRet=DecodeBufWithArray((unsigned char*)buffer,nlen,&apack,apackarray,&nRow,omsg);
		if( !bRet || apack.head.retCode )
		{
			ConnectPool.Free(hHandle);
			WriteLog("执行功能号930037读入设备档案表时,运行DecodeBufWithArray,返回无数据,失败!\n");
			return RET_SYSERROR;
		}

		WriteLog("执行功能号930037读入设备档案表时,得到设备数量为:%d,设备参数为:\n",nRow);

		for(int i=0; i< nRow; i++)
		{
			if( i == 0 ) pPacket = &apack.pack;
			else  pPacket = &apackarray[i-1];

			strcpy(pSmartDoc[k].m_szMacCode, pPacket->semp);		//终端机型号代码
			strcpy(pSmartDoc[k].m_szMacCard, pPacket->sholder_type);//可用IC卡卡型
			strcpy(pSmartDoc[k].m_szMacModle, pPacket->semp);		//终端机型号
			strcpy(pSmartDoc[k].m_szMacType, pPacket->semp);		//机型名称
			strcpy(pSmartDoc[k].m_szDeviceID, pPacket->sdate1);	//设备ID
			strcpy(pSmartDoc[k].m_szRegister, pPacket->sdate2);	//注册号
			pSmartDoc[k].m_nAuthID=ConvertID(pSmartDoc[k].m_szDeviceID);//授权号
			pSmartDoc[k].m_nMachineNo=pPacket->lvol4;			//机号	
			strcpy(pSmartDoc[k].m_szVersion, pPacket->sdate3);	//设备版本号
			strcpy(pSmartDoc[k].m_szPassword, "000000");			//系统员密码
			strcpy(pSmartDoc[k].m_szOprPasswd, "000000");			//管理员密码
			pSmartDoc[k].m_nPwdswitch=-1;							//密码开关
			strcpy(pSmartDoc[k].m_sClockVer, pPacket->stime0);	  //父设备
			strcpy(pSmartDoc[k].m_szOrgid, "001");				  //所属的组织代码
			pSmartDoc[k].m_nPortCount=pPacket->lvol5;			  //服务器端口总数
			pSmartDoc[k].m_nSMTPort=pPacket->lvol6;				  //服务器端口号
			strcpy(pSmartDoc[k].m_szPort, pPacket->sbank_code);	  //通讯端口
			pSmartDoc[k].m_nBaudRate=pPacket->lvol9;			  //波特率
			pSmartDoc[k].m_nCommMode=pPacket->lvol8;			  //链路模式
			strcpy(pSmartDoc[k].m_szAddr, pPacket->sstation0);    //通讯地址
			pSmartDoc[k].m_nStatus=pPacket->lvol7;                //设备状态, 下面定义为:

			pSmartDoc[k].m_nConnType = pPacket->lvol10;			  //通讯方式
			strcpy(pSmartDoc[k].m_szClass, pPacket->snote2);	  //卡类				  //

			pSmartDoc[k].m_wFlowNo=pPacket->lvol11+1;			  //期望流水号 modified
			pSmartDoc[k].m_wLastInvoiceNo=pPacket->lvol11;        //终端交易流水号期末值
			pSmartDoc[k].m_wStateNo=pPacket->lvol12;
			pSmartDoc[k].m_nFlow=1;									//序号
			pSmartDoc[k].m_nBeginInvoice=0;							//扎帐的开始流水
			pSmartDoc[k].m_wSettleinvoice=0;						//扎帐流水号期末值
			pSmartDoc[k].m_wEndInvoice=0;							//扎帐的结束流水号
			strcpy(pSmartDoc[k].m_sBlackExpire, pPacket->sserial0);   //黑名单的有效期
			strcpy(pSmartDoc[k].m_sDownBlackTime, pPacket->sserial1); //黑名单下传时间期末值
			pSmartDoc[k].m_nStartuse=0;								  //签到结果

			pSmartDoc[k].m_nCardID = 12;
			pSmartDoc[k].m_nDealCount = 10;
			pSmartDoc[k].m_nInMoney = 100000;
			pSmartDoc[k].m_nOutMoney = pSmartDoc[k].m_nInMoney; 
			pSmartDoc[k].m_nBeginInvoice = 0 ;
			pSmartDoc[k].m_wFlowNo = 0 ;
			pSmartDoc[k].m_wStateNo = 0 ;

			WriteLog("终端机型号代码=%s,可用IC卡卡型=%s, 终端机型号=%s, 机型名称=%s\n "
				"设备ID=%s, 注册号=%s, 机号=%d, 设备版本号=%s, 系统员密码=%s, 管理员密码=%s\n"
				"密码开关=%d, 服务器端口总数=%d, 服务器端口号=%d, 通讯端口=%s, 波特率=%d\n"
				"链路模式=%d,通讯地址=%s, 设备状态=%d, 交易流水号期末值=%d, 黑名单的有效期=%s, 黑名单版本=%s, 通讯方式=%d,卡类=%s, 父设备:%s\n",
				pPacket->semp, pPacket->sholder_type, pPacket->semp, pPacket->semp,
				pPacket->sdate1, pPacket->sdate2, pPacket->lvol4, pPacket->sdate3, "000000", "000000", 
				pSmartDoc[k].m_nPwdswitch, pPacket->lvol5, pPacket->lvol6, pPacket->sbank_code, pPacket->lvol9, 
				pPacket->lvol8, pPacket->sstation0, pPacket->lvol7, pPacket->lvol11, pPacket->sserial0, pPacket->sserial1, 
				pPacket->lvol10, pPacket->snote2, pPacket->stime0);

			if( !theApp.CheckSmartDocValid(&pSmartDoc[k]) )
			{
				WriteLog("无效设备!!!\n");
				ZeroMemory(&pSmartDoc[k], sizeof(TSSmartDoc));
			}
			else
			{
				WriteLog("有效设备!ID号=%s, 注册号=%s, 机号=%d, 网络类型:%d..父设备代码=%s\n", 
						  pSmartDoc[k].m_szDeviceID, pSmartDoc[k].m_szRegister, 
						  pSmartDoc[k].m_nMachineNo, pSmartDoc[k].m_nCommMode, pSmartDoc[k].m_sClockVer);
				k++;
			}
		}

		if( apack.head.nextflag == 0 )
			bEnd = true ;
	}

#else
	k = 0 ;
/***********************************************************************************************************************************************************/
// 以下为加入调试信息
/***********************************************************************************************************************************************************/
    int iTick = 0 ;
	char  sTempNo[32];
	char  sIP[32];
	char  szParent[32] = "" ;
	int iMacNo = 1;
	int nPort = 10001;

	strcpy(sIP, "10.83.28.40");

	for(int j=k; j<2; j++)
	{
		sprintf(sTempNo, "0000%04d", j+100);

		//模拟LPort
		if( iTick == 0 || iTick == 15 )
		{
			strcpy(pSmartDoc[k].m_szMacCode, "5301");		//终端机型号代码
			strcpy(pSmartDoc[k].m_szMacModle, "5301");		//终端机型号
			strcpy(pSmartDoc[k].m_szMacType, "5301");		//机型名称
			strcpy(pSmartDoc[k].m_szDeviceID, "0000918F");	//设备ID
			strcpy(pSmartDoc[k].m_szRegister, "0000918F");	//注册号
			pSmartDoc[k].m_nAuthID=ConvertID(pSmartDoc[k].m_szDeviceID);//授权号
			pSmartDoc[k].m_nMachineNo=1;			//机号	
			strcpy(pSmartDoc[k].m_szAddr, sIP);    //通讯地址
			pSmartDoc[k].m_nPortCount=16;			  //服务器端口总数
			sprintf(pSmartDoc[k].m_szPort, "%d", nPort); //nPort++);	  //通讯端口
			strcpy(pSmartDoc[k].m_sClockVer, "");	  //父设备

			iMacNo=1;
			strcpy(szParent, pSmartDoc[k].m_szDeviceID);
			pSmartDoc[k].m_nSMTPort=0;				  //服务器端口号
		}
		else
		{
			//if( iTick == 0 || iTick == 6 || iTick == 8 || iTick == 10 )
			//{
				strcpy(pSmartDoc[k].m_szMacCode, "0226");		//终端机型号代码
				strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型
				strcpy(pSmartDoc[k].m_szMacModle, "0226");		//终端机型号
				strcpy(pSmartDoc[k].m_szMacType, "0226");		//机型名称
			//}
			/*else
			{
				strcpy(pSmartDoc[k].m_szMacCode, "0201");		//终端机型号代码
				strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型
				strcpy(pSmartDoc[k].m_szMacModle, "0201");		//终端机型号
				strcpy(pSmartDoc[k].m_szMacType, "0201");		//机型名称
			}*/

			strcpy(pSmartDoc[k].m_szDeviceID, "00008B1a");	//设备ID
			strcpy(pSmartDoc[k].m_szRegister, "00008B1a");	//注册号
			pSmartDoc[k].m_nAuthID=0x00008B1a;//ConvertID(pSmartDoc[k].m_szDeviceID);//授权号
			pSmartDoc[k].m_nMachineNo=1;//++iMacNo;			//机号	
			pSmartDoc[k].m_nPortCount=16;			  //服务器端口总数
			strcpy(pSmartDoc[k].m_szAddr, sIP);    //通讯地址
			strcpy(pSmartDoc[k].m_sClockVer, szParent);	  //父设备
			pSmartDoc[k].m_nSMTPort=2; //iMacNo;				  //服务器端口号
		}

		if( iTick >= 15 )
			iTick = 0 ;
		else
			iTick++;

		strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型
		strcpy(pSmartDoc[k].m_szVersion, "");	//设备版本号
		strcpy(pSmartDoc[k].m_szPassword, "000000");			//系统员密码
		strcpy(pSmartDoc[k].m_szOprPasswd, "000000");			//管理员密码
		pSmartDoc[k].m_nPwdswitch=-1;							//密码开关
		strcpy(pSmartDoc[k].m_szOrgid, "001");				  //所属的组织代码
		pSmartDoc[k].m_nBaudRate=19200;			  //波特率
		pSmartDoc[k].m_nCommMode=3;			  //链路模式
		pSmartDoc[k].m_nStatus=0;                //设备状态, 下面定义为:
		pSmartDoc[k].m_nConnType = 1;			  //通讯方式
		strcpy(pSmartDoc[k].m_szClass, "FFFFFFFFFF");	  //卡类				  //
		pSmartDoc[k].m_wFlowNo=0;			  //期望流水号 modified
		pSmartDoc[k].m_wLastInvoiceNo=0;        //终端交易流水号期末值
		pSmartDoc[k].m_wStateNo=0;
		pSmartDoc[k].m_nFlow=1;									//序号
		pSmartDoc[k].m_nBeginInvoice=0;							//扎帐的开始流水
		pSmartDoc[k].m_wSettleinvoice=0;						//扎帐流水号期末值
		pSmartDoc[k].m_wEndInvoice=0;							//扎帐的结束流水号
		strcpy(pSmartDoc[k].m_sBlackExpire, "991231010101");   //黑名单的有效期
		strcpy(pSmartDoc[k].m_sDownBlackTime, "991231010101"); //黑名单下传时间期末值
		pSmartDoc[k].m_nStartuse=0;								  //签到结果

		printf("有设备(ID=%s, 注册号:%s, 机号=%d, 网络类型:%d..父设备:%s...\n", 
			pSmartDoc[k].m_szDeviceID, pSmartDoc[k].m_szRegister, 
			pSmartDoc[k].m_nMachineNo, pSmartDoc[k].m_nCommMode, pSmartDoc[k].m_sClockVer);
		k++;
	}
#endif

	gnDocCount = k;
	gpSmartDoc = new TSSmartDoc[gnDocCount];
	if( gpSmartDoc == NULL )
	{
		printf("内存不足.....\n");
		gnDocCount = 0 ;
		ConnectPool.Free(hHandle);
		return RET_SYSERROR;
	}

	long iCount = 0 ;
	memcpy(gpSmartDoc,pSmartDoc,sizeof(TSSmartDoc)*k); 
	memset(pSmartDoc, 0, sizeof(TSSmartDoc)*k);

	for(int i=0; i< k; i++)
	{
		if( theApp.CheckSmartDocValid(gpSmartDoc, k, i) )
		{
			memcpy(&pSmartDoc[iCount++], &gpSmartDoc[i], sizeof(TSSmartDoc));
		}
	}

	memset(gpSmartDoc, 0, sizeof(TSSmartDoc)*k);
	gnDocCount = 0 ;
	k = iCount;

	ConnectPool.Free(hHandle);

	WriteLog("有效设备总数量:%d...........\n", k);

	*nRecCount = k;
	long nKCount = 0 ;
	for(i=0; i<k; i++)
	{
		if( strcmp(pSmartDoc[i].m_sClockVer, "") )
		{
			for(int j=0; j<k; j++)
			{
				if( !strcmp(pSmartDoc[j].m_szDeviceID, pSmartDoc[i].m_sClockVer) && i != j )
				{
					pSmartDoc[i].m_nParentID = pSmartDoc[j].m_nAuthID ;
					pSmartDoc[i].m_nLevel = 1;
					pSmartDoc[i].m_szLevelArray[0] = (char)pSmartDoc[j].m_nMachineNo;
					pSmartDoc[i].m_szLevelArray[1] = (char)pSmartDoc[i].m_nSMTPort;
					printf("父设备%s\n",pSmartDoc[j].m_szDeviceID);
					printf("------pSmartDoc[i].m_szDeviceID = %s \n",pSmartDoc[i].m_szDeviceID);
					printf("------pSmartDoc[i].m_szLevelArray=%d\n",pSmartDoc[j].m_nMachineNo);
					printf("------pSmartDoc[i].m_szLevelArray=%d\n",pSmartDoc[i].m_nSMTPort);					
					break;
				}
			}
		}
		else
		{
			pSmartDoc[i].m_nLevel=0;
		}
	}

	gnDocCount = k;
	memcpy(gpSmartDoc,pSmartDoc,sizeof(TSSmartDoc)*k); 

	return RET_OK;
}
Пример #11
0
//----------------------------------------------------------------------------
//
//  Function:   SendDeviceTick
//
//  Synopsis:   发设备心跳
//
//  Arguments:  none
//
//  History:    2004-09-20   ZhangWei   Created
//
//  Notes:
//
//----------------------------------------------------------------------------
long __stdcall SendDeviceTick(TSSmartDoc *pDoc)
{

    AFX_MANAGE_STATE(AfxGetStaticModuleState());		

	//WriteLog("设备:%s,时钟:%s::版本%s",pDoc->m_szDeviceID,pDoc->m_sDownBlackTime,pDoc->m_szTableName);

	pDoc->m_dwDBTick = GetTickCount();
	ST_CPACK rpack;
	unsigned char szBuffer[8192];
	int  nLen = sizeof(szBuffer);

	memset(&rpack,   0, sizeof(rpack));
	memset(szBuffer, 0, sizeof(szBuffer));

	rpack.head.RequestType = 930057; 
	rpack.head.firstflag   = 1;   /* 是否第一个请求(首包请求)*/
	rpack.head.nextflag    = 0;    /* 是否后续包请求*/
	rpack.head.recCount    = 1;    /* 本包的记录数*/
	rpack.head.retCode     = 0;     /* 返回代码*/
	rpack.head.userdata    = 0;

	char szDateTime[24];
	SYSTEMTIME  SysTime;
	CSystemInfo info;
	memset(szDateTime,0x00,sizeof szDateTime);
	
	GetLocalTime(&SysTime);
	sprintf(szDateTime, "%04d%02d%02d%02d%02d%02d", 
		SysTime.wYear,  SysTime.wMonth, SysTime.wDay,
		SysTime.wHour, SysTime.wMinute, SysTime.wSecond);

	SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey));  //前置注册ID
	SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey);
	SetValue(&rpack.head,&rpack.pack, F_SDATE1, pDoc->m_szDeviceID);	  //设备ID
	SetValue(&rpack.head,&rpack.pack, F_SPHONE3, szDateTime);		     //心跳时间
	SetValue(&rpack.head,&rpack.pack, F_DAMT0, GetValue(info.nDiskFreeSpace/info.nDiskTotalSpace*100) );//硬盘利用百分比
	SetValue(&rpack.head,&rpack.pack, F_DAMT1, GetValue(info.nUserMemory/info.nMemoryTotal*100));	//内存利用百分比
	SetValue(&rpack.head,&rpack.pack, F_DAMT2, GetValue(100-info.nCPU));//CPU利用百分比
	SetValue(&rpack.head,&rpack.pack, F_LVOL2, GetValue(pDoc->m_nStatus)); //设备状态		
	SetValue(&rpack.head,&rpack.pack, F_SSERIAL4, pDoc->m_szTableName); //黑名单版本
	SetValue(&rpack.head,&rpack.pack, F_SHOLDER_AC_NO2, pDoc->m_sDownBlackTime);//设备当前时间
	SetValue(&rpack.head,&rpack.pack, F_DAMT3, GetValue(1)); //1未上传流水数量

	WriteLog("设备:%s,时钟:%s::版本%s::终端状态:%ld\n",pDoc->m_szDeviceID,pDoc->m_sDownBlackTime,pDoc->m_szTableName,pDoc->m_nStatus);

	HANDLE& hHandle = ConnectPool.Alloc();
	if (hHandle== NULL)	return RET_OK;
	char omsg[256];

	if( EncodeBuf(&rpack, szBuffer, &nLen, omsg) )
	{
		WriteLog("-----发送设备监控心跳包ID[ %s ]---------------\n",pDoc->m_szDeviceID);		
		if( SendData(hHandle, iServerNo, iFunc, (char*)szBuffer, nLen, 1, FALSE) == RET_OK )
		{
			nLen = sizeof(szBuffer);
			memset(szBuffer, 0, sizeof(szBuffer));
			int nlen = RecvData(hHandle, (char*)szBuffer, nLen, 10000);
			if( nlen > 0 )
			{
				ST_CPACK apack;
				memset(&apack, 0, sizeof(apack));
				if( DecodeBuf((unsigned char*)szBuffer,nlen,&apack,omsg) )
				{
					if( !apack.head.retCode )
					{
						ConnectPool.Free(hHandle);
						WriteTickLog("发送设备监控心跳包成功! 服务号:%d, 子功能号:%d, , 设备ID=%s", iServerNo, iFunc, pDoc->m_szDeviceID);						
						return RET_OK;
					}
					else
					{
						WriteTickLog("发送设备监控心跳包失败! 设备ID=%s, 发送设备监控心跳包时返回:%s\n", pDoc->m_szDeviceID, apack.pack.vsmess);
					}
				}
				else
					printf("DecodeBuf error");
			}
			else
				printf("debug   接收数据失败\n");
		}
	}

	ConnectPool.Free(hHandle);
	WriteLog("发送设备监控心跳包失败! 服务号:%d, 子功能号:%d, 设备ID=%s", iServerNo, iFunc, pDoc->m_szDeviceID);
	return RET_OK;
}
Пример #12
0
int CDRTPHelper::SendRequest(int timeout /*=0*/)
{
	m_errcode = 0;
	memset(&m_errmsg,0,sizeof m_errmsg);
	int len = sizeof m_drtpBuf;
	int retries = 3;
	BOOL bRet = FALSE;
	m_currRecord = NULL;
	m_currIndex = 0;
	m_currRecordCount = 0;
	m_timeout = timeout;
	m_requestPack.head.recCount = m_rec_cnt;
	TAG_DRTPHANDLE tag;
	memset(&tag,0,sizeof(tag));
	memset(m_drtpBuf,0,sizeof m_drtpBuf);
	if(!DrtpAttachServer(m_drtpNo,m_funcNo,m_drtpHandle,&tag,&m_errcode,m_errmsg))
	{
		try
		{
			testDrtpHandle();
			return -1;
		}
		catch (DrtpConnectException&)
		{
			return -2;
		}
	}
	EncodeBuf(&m_requestPack, m_drtpBuf,&len, NULL);

	bRet = DrtpSendMessage((char*)m_drtpBuf,len,&m_errcode,m_errmsg,&tag,
		0,-1,0,-1,2);
	if(bRet == FALSE)
	{
		GetErrMsg();
		testDrtpHandle();
		return -1;
	}
	retries = 3;
	int readLen = 0;

	bRet = DrtpReadMessage((char*)m_drtpBuf, sizeof m_drtpBuf,&readLen,
		m_drtpHandle,&tag,&m_errcode,m_errmsg,m_timeout);

	if(bRet == FALSE)
	{
		GetErrMsg();
		logDrtpErrMsg();
		return -1;
	}
	memset(&m_responsePack,0,sizeof(m_responsePack));
	memset(m_dataArray, 0, sizeof(m_dataArray));
	// 把接收缓冲区中的内容解码到Pack和DataArray中
	len = sizeof m_drtpBuf;
	int nCount = 0;
	bRet = DecodeBufWithArray((BYTE*)m_drtpBuf,readLen, &m_responsePack
		,m_dataArray, &nCount, 0);
	if(bRet == FALSE)
	{
		GetErrMsg();
		logDrtpErrMsg();
		return -1;
	}
	// 记录返回结果集数
	m_currRecordCount = m_responsePack.head.recCount;
	return 0;
}