Ejemplo n.º 1
0
int VTDROderMeter::Read(const char* buf)
{
	OderMeter* ptrMeter = (OderMeter*) buf;
	tNow = ToSystime(ptrMeter->vTime);
	tInstall = ToSystime(ptrMeter->installTime);
	startMeter = BCD2INT((const char*) (ptrMeter->startValue),
			sizeof(ptrMeter->startValue)) / 10.0;
	sumMeterRaw = ntohl(*(int*)(ptrMeter->oderMeter));
	sumMeter = BCD2INT((const char*) (ptrMeter->oderMeter),
			sizeof(ptrMeter->oderMeter)) / 10.0;
	return sizeof(*ptrMeter);

}
Ejemplo n.º 2
0
Archivo: nit.c Proyecto: suborb/reelvdr
void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
{
  SI::NIT nit(Data, false);
  if (!nit.CheckCRCAndParse())
     return;
  // Some broadcasters send more than one NIT, with no apparent way of telling which
  // one is the right one to use. This is an attempt to find the NIT that contains
  // the transponder it was transmitted on and use only that one:
  int ThisNIT = -1;
  if (!networkId) {
     for (int i = 0; i < numNits; i++) {
         if (nits[i].networkId == nit.getNetworkId()) {
            if (nit.getSectionNumber() == 0) {
               // all NITs have passed by
               for (int j = 0; j < numNits; j++) {
                   if (nits[j].hasTransponder) {
                      networkId = nits[j].networkId;
                      //printf("taking NIT with network ID %d\n", networkId);
                      //XXX what if more than one NIT contains this transponder???
                      break;
                      }
                   }
               if (!networkId) {
                  //printf("none of the NITs contains transponder %d\n", Transponder());
                  return;
                  }
               }
            else {
               ThisNIT = i;
               break;
               }
            }
         }
     if (!networkId && ThisNIT < 0 && numNits < MAXNITS) {
        if (nit.getSectionNumber() == 0) {
           *nits[numNits].name = 0;
           SI::Descriptor *d;
           for (SI::Loop::Iterator it; (d = nit.commonDescriptors.getNext(it)); ) {
               switch (d->getDescriptorTag()) {
                 case SI::NetworkNameDescriptorTag: {
                      SI::NetworkNameDescriptor *nnd = (SI::NetworkNameDescriptor *)d;
#ifdef USE_PROVIDERCHARSET
                      nnd->name.getText(nits[numNits].name, MAXNETWORKNAME, NULL);
#else
                      nnd->name.getText(nits[numNits].name, MAXNETWORKNAME);
#endif
                      }
                      break;
                 default: ;
                 }
               delete d;
               }
           nits[numNits].networkId = nit.getNetworkId();
           nits[numNits].hasTransponder = false;
           //printf("NIT[%d] %5d '%s'\n", numNits, nits[numNits].networkId, nits[numNits].name);
           ThisNIT = numNits;
           numNits++;
           }
        }
     }
  else if (networkId != nit.getNetworkId())
     return; // ignore all other NITs
  else if (!sectionSyncer.Sync(nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber()))
     return;
  if (!Channels.Lock(true, 10))
     return;
  SI::NIT::TransportStream ts;
  for (SI::Loop::Iterator it; nit.transportStreamLoop.getNext(ts, it); ) {
      SI::Descriptor *d;

      SI::Loop::Iterator it2;
      SI::FrequencyListDescriptor *fld = (SI::FrequencyListDescriptor *)ts.transportStreamDescriptors.getNext(it2, SI::FrequencyListDescriptorTag);
      int NumFrequencies = fld ? fld->frequencies.getCount() + 1 : 1;
      int Frequencies[NumFrequencies];
      if (fld) {
         int ct = fld->getCodingType();
         if (ct > 0) {
            int n = 1;
            for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); ) {
                int f = fld->frequencies.getNext(it3);
                switch (ct) {
                  case 1: f = BCD2INT(f) / 100; break;
                  case 2: f = BCD2INT(f) / 10; break;
                  case 3: f = f * 10;  break;
                  default: ;
                  }
                Frequencies[n++] = f;
                }
            }
         else
            NumFrequencies = 1;
         }
      delete fld;

      for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2)); ) {
          switch (d->getDescriptorTag()) {
            case SI::SatelliteDeliverySystemDescriptorTag: {
                 SI::SatelliteDeliverySystemDescriptor *sd = (SI::SatelliteDeliverySystemDescriptor *)d;
                 cDvbTransponderParameters dtp;
                 int Source = cSource::FromData(cSource::stSat, BCD2INT(sd->getOrbitalPosition()), sd->getWestEastFlag());
                 int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 100;
                 static char Polarizations[] = { 'H', 'V', 'L', 'R' };
                 dtp.SetPolarization(Polarizations[sd->getPolarization()]);
                 static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
                 dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
                 static int Modulations[] = { QAM_AUTO, QPSK, PSK_8, QAM_16 };
                 dtp.SetModulation(Modulations[sd->getModulationType()]);
                 dtp.SetSystem(sd->getModulationSystem() ? SYS_DVBS2 : SYS_DVBS);
                 static int RollOffs[] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO };
                 dtp.SetRollOff(sd->getModulationSystem() ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO);
                 int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
                 if (ThisNIT >= 0) {
                    for (int n = 0; n < NumFrequencies; n++) {
                        if (ISTRANSPONDER(cChannel::Transponder(Frequencies[n], dtp.Polarization()), Transponder())) {
                           nits[ThisNIT].hasTransponder = true;
                           //printf("has transponder %d\n", Transponder());
                           break;
                           }
                        }
                    break;
                    }
                 if (Setup.UpdateChannels >= 5) {
                    bool found = false;
                    bool forceTransponderUpdate = false;
                    for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
                        if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
                           int transponder = Channel->Transponder();
                           found = true;
                           if (!ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), transponder)) {
                              for (int n = 0; n < NumFrequencies; n++) {
                                  if (ISTRANSPONDER(cChannel::Transponder(Frequencies[n], dtp.Polarization()), transponder)) {
                                     Frequency = Frequencies[n];
                                     break;
                                     }
                                  }
                              }
                           if (ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), Transponder())) // only modify channels if we're actually receiving this transponder
                              Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('S'));
                           else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('S')))
                              forceTransponderUpdate = true; // get us receiving this transponder
                           }
                        }
                    if (!found || forceTransponderUpdate) {
                       for (int n = 0; n < NumFrequencies; n++) {
                           cChannel *Channel = new cChannel;
                           Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
                           if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('S')))
                              EITScanner.AddTransponder(Channel);
                           else
                              delete Channel;
                           }
                       }
                    }
                 }
                 break;
            case SI::CableDeliverySystemDescriptorTag: {
                 SI::CableDeliverySystemDescriptor *sd = (SI::CableDeliverySystemDescriptor *)d;
                 cDvbTransponderParameters dtp;
                 int Source = cSource::FromData(cSource::stCable);
                 int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 10;
                 //XXX FEC_outer???
                 static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
                 dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
                 static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
                 dtp.SetModulation(Modulations[min(sd->getModulation(), 6)]);
                 int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
                 if (ThisNIT >= 0) {
                    for (int n = 0; n < NumFrequencies; n++) {
                        if (ISTRANSPONDER(Frequencies[n] / 1000, Transponder())) {
                           nits[ThisNIT].hasTransponder = true;
                           //printf("has transponder %d\n", Transponder());
                           break;
                           }
                        }
                    break;
                    }
                 if (Setup.UpdateChannels >= 5) {
                    bool found = false;
                    bool forceTransponderUpdate = false;
                    for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
                        if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
                           int transponder = Channel->Transponder();
                           found = true;
                           if (!ISTRANSPONDER(Frequency / 1000, transponder)) {
                              for (int n = 0; n < NumFrequencies; n++) {
                                  if (ISTRANSPONDER(Frequencies[n] / 1000, transponder)) {
                                     Frequency = Frequencies[n];
                                     break;
                                     }
                                  }
                              }
                           if (ISTRANSPONDER(Frequency / 1000, Transponder())) // only modify channels if we're actually receiving this transponder
                              Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('C'));
                           else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('C')))
                              forceTransponderUpdate = true; // get us receiving this transponder
                           }
                        }
                    if (!found || forceTransponderUpdate) {
                        for (int n = 0; n < NumFrequencies; n++) {
                           cChannel *Channel = new cChannel;
                           Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
                           if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('C')))
                              EITScanner.AddTransponder(Channel);
                           else
                              delete Channel;
                           }
                       }
                    }
                 }
                 break;
            case SI::TerrestrialDeliverySystemDescriptorTag: {
                 SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
                 cDvbTransponderParameters dtp;
                 int Source = cSource::FromData(cSource::stTerr);
                 int Frequency = Frequencies[0] = sd->getFrequency() * 10;
                 static int Bandwidths[] = { 8000000, 7000000, 6000000, 0, 0, 0, 0, 0 };
                 dtp.SetBandwidth(Bandwidths[sd->getBandwidth()]);
                 static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
                 dtp.SetModulation(Constellations[sd->getConstellation()]);
                 static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
                 dtp.SetHierarchy(Hierarchies[sd->getHierarchy()]);
                 static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
                 dtp.SetCoderateH(CodeRates[sd->getCodeRateHP()]);
                 dtp.SetCoderateL(CodeRates[sd->getCodeRateLP()]);
                 static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
                 dtp.SetGuard(GuardIntervals[sd->getGuardInterval()]);
                 static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
                 dtp.SetTransmission(TransmissionModes[sd->getTransmissionMode()]);
                 if (ThisNIT >= 0) {
                    for (int n = 0; n < NumFrequencies; n++) {
                        if (ISTRANSPONDER(Frequencies[n] / 1000000, Transponder())) {
                           nits[ThisNIT].hasTransponder = true;
                           //printf("has transponder %d\n", Transponder());
                           break;
                           }
                        }
                    break;
                    }
                 if (Setup.UpdateChannels >= 5) {
                    bool found = false;
                    bool forceTransponderUpdate = false;
                    for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
                        if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
                           int transponder = Channel->Transponder();
                           found = true;
                           if (!ISTRANSPONDER(Frequency / 1000000, transponder)) {
                              for (int n = 0; n < NumFrequencies; n++) {
                                  if (ISTRANSPONDER(Frequencies[n] / 1000000, transponder)) {
                                     Frequency = Frequencies[n];
                                     break;
                                     }
                                  }
                              }
                           if (ISTRANSPONDER(Frequency / 1000000, Transponder())) // only modify channels if we're actually receiving this transponder
                              Channel->SetTransponderData(Source, Frequency, 0, dtp.ToString('T'));
                           else if (strcmp(Channel->Parameters(), dtp.ToString('T')))
                              forceTransponderUpdate = true; // get us receiving this transponder
                           }
                        }
                    if (!found || forceTransponderUpdate) {
                       for (int n = 0; n < NumFrequencies; n++) {
                           cChannel *Channel = new cChannel;
                           Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
                           if (Channel->SetTransponderData(Source, Frequencies[n], 0, dtp.ToString('T')))
                              EITScanner.AddTransponder(Channel);
                           else
                              delete Channel;
                           }
                        }
                    }
                 }
                 break;
            default: ;
            }
          delete d;
          }
      }
  Channels.Unlock();
}
Ejemplo n.º 3
0
/***********************************************************************
		module		:	[8583协议]
		function		:	[把buf中数据按定义好的格式解包到ISO_MSG变量m中]
  		return			:	[-1:异常
								其他:buf的长度]
		comment	:	[全局普通函数]
		machine		:	[无]
		language	:	[CHN]
 		keyword		:	[内部有MALLOC操作,用完需要函数iso8583_free进行释放]
		date			:	[11/08/10]
 		author		:	[chen-zhengkai]
************************************************************************/
int iso8583_unpack(ISO_MSG *m, const char *buf)
{
	const char* start = buf;
	int flds, i;
	char fmt[8];
	memset(fmt, 0, sizeof(fmt));

	//0域的操作
	if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) {	//异常处理
		MY_TRACE("flds = %d", 0);
		return -1;
	}
	m->fld[0].len = s_isodef[0].len;
	memset(m->fld[0].buf, 0x00, NUM);
	if (s_iCompress) {
		buf += BCD2ASC((char*)m->fld[0].buf, (unsigned char*)buf, m->fld[0].len, s_isodef[0].fmt);
	}
	else {
		memcpy(m->fld[0].buf, buf, m->fld[0].len);
		buf += m->fld[0].len;
	}

	//操作1域,位图域
#if ISO_FLDS==128
	if(buf[0] & 0x80) {		//128位版
		flds = 128;
	} 
	else {
		flds = 64;
	}
#else
	if( buf[0] & 0x80 ) {	//128位版
		MY_TRACE("flds = %d", 1);
		return -1;
	}
	flds = 64;
#endif
	m->fld[1].len = flds/8;		//64位8字节,128位16字节
	memset(m->fld[1].buf, 0x00, NUM);
	memcpy(m->fld[1].buf, buf, m->fld[1].len);
	buf += m->fld[1].len;	//偏移
	//2--64(128)域操作
	for (i = 2; i <= flds; i++) {
		if (BITGET(m->fld[1].buf, i)) {	//第i字段不为零
			//长度处理
			if ( s_isodef[i].fmt) {	//不定长
				if ( s_iCompress ) {	//需解压
					buf += BCD2INT(&(m->fld[i].len), (unsigned char*)buf, s_isodef[i].fmt, 0);
				}
				else {
					sprintf(fmt, "%%0%dd", s_isodef[i].fmt);		//格式化成 %0?d
					sscanf(buf, fmt, &(m->fld[i].len));		//把buf内容格式化成整数存入len
					buf += s_isodef[i].fmt;	//偏移
				}
				if (m->fld[i].len > s_isodef[i].len) {	//异常处理
					MY_TRACE("flds = %d", i);
					return -1;
				}
			}
			else {	//定长
				m->fld[i].len = s_isodef[i].len;
			}
			//内容处理
			memset(m->fld[i].buf, 0x00, NUM);
			switch (s_isodef[i].typ) {
				case TYP_BCD:
					if (s_iCompress) {
						buf += BCD2ASC((char*)m->fld[i].buf, (unsigned char*)buf, m->fld[i].len, s_isodef[i].fmt); 
						break;
					}
				case TYP_ASC:
				case TYP_BIN:
					memcpy(m->fld[i].buf, buf, m->fld[i].len);
					buf += m->fld[i].len;
					break;
				default:
					MY_TRACE("flds = %d", i);
					return -1;
			}
		}
	}
	return (buf-start);	//返回长度
}
Ejemplo n.º 4
0
int Bank_Query(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	int amt=0;
	double amt1=0.0;
	char temp[256]="";
	ST_CPACK aPack;	
	ST_PACK *out_pack = &(aPack.pack);
	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL1,F_DAMT0,0);

	MSG8583 zgyh_req,zgyh_ans;
	memset(&zgyh_req,0x20,sizeof zgyh_req);
	memset(&zgyh_ans,0x20,sizeof zgyh_ans);

	ISO_MSG iso_zgyh_req,iso_zgyh_ans;
	iso8583_init(&iso_zgyh_req);
	iso8583_init(&iso_zgyh_ans);

	char zgyh_sbuf[2048]="";
	char zgyh_abuf[2048]="";

	char buf[2048]="";
	char bitmap[16]={0x60,0x20,0x00,0x00,0x20,0xc0,0x10,0x04};
	
	if(strlen(rPack->vsvarstr1)>0)	bitmap[4]=0x30;	//如果三磁道信息为空,三磁道的位图置空

	ret=iso8583_set(&iso_zgyh_req, 0, (unsigned char*)BANK_ZGYH_TRADE_CODE_QUERY_REQ, 4);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	ret=iso8583_set(&iso_zgyh_req, 1, (unsigned char*)bitmap,8);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	//写银行卡号
	memset(buf,0x00,sizeof buf);
	sprintf(buf,"%02d",strlen(rPack->scust_limit2));
	sprintf(buf+2,"%s",rPack->scust_limit2);
	ret=iso8583_set(&iso_zgyh_req, 2, (unsigned char*)rPack->scust_limit2,strlen(rPack->scust_limit2));
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error,rPack->scust_limit2=[%s]",rPack->scust_limit2);
		return E_TRANS_UNKNOW_ERROR;
	}
	//写银行处理代码-000000    3	处理代号		n6	 ME	  ME	(BCD)000000
	ret=iso8583_set(&iso_zgyh_req, 3, (unsigned char*)BANK_ZGYH_EXEC_CODE_QUERY_REQ, 6);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}

	//写交易参考号-流水号-取交易参考号的后六位- 11 	系统跟踪号		n6	 ME	  ME	(BCD)
	memset(buf,0x00,sizeof buf);
	sprintf(buf,"%s",rPack->sholder_ac_no+8);
	ret=iso8583_set(&iso_zgyh_req,11,(unsigned char*)buf,6);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	//写二磁道数据- 35	第二磁道数据	LLVAR	z..37	 C2		(BCD)
	ret=iso8583_set(&iso_zgyh_req,35,(unsigned char*)rPack->vsvarstr0,strlen(rPack->vsvarstr0));
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error,Second track data=[%s]",rPack->vsvarstr0);
		return E_TRANS_UNKNOW_ERROR;
	}
	//写三磁道数据- 36	第三磁道数据	LLLVAR	z..104	 C2		(BCD)
	if(strlen(rPack->vsvarstr1)>0)
	{
		ret=iso8583_set(&iso_zgyh_req,36,(unsigned char*)rPack->vsvarstr1,strlen(rPack->vsvarstr1));
		if(ret<=0)
		{
			writelog(LOG_ERR,"iso8583_set error,Second track data=[%s]",rPack->vsvarstr1);
			return E_TRANS_UNKNOW_ERROR;
		}
	}
	//写终端号- 41	POS终端号		ans8	 ME	  ME	(ASCII)
	ret=iso8583_set(&iso_zgyh_req,41,(unsigned char*)rPack->sorder2,8);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	//写商户号- 42	商户号		ans15	 M		(ASCII)
	memset(buf,0,sizeof buf);
	sprintf(buf,"%s",BANK_ZGYH_MERCH_NO);
	ret=iso8583_set(&iso_zgyh_req,42,(unsigned char*)buf,15);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	//写银行卡个人密码- 52	个人密码信息包	BIN	b64	 C3		ANSI X9.8标准Format 01
	ret=iso8583_set(&iso_zgyh_req,52,(unsigned char*)rPack->sbank_pwd,8);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	//写交易参考号-  62	发票号	LLLVAR	ans999	 M		(ASCII)
	memset(buf,0x00,sizeof buf);
	sprintf(buf,"%s",rPack->sholder_ac_no+8);
	ret=iso8583_set(&iso_zgyh_req,62,(unsigned char*)buf,6);
	if(ret<=0)
	{
		writelog(LOG_ERR,"iso8583_set error");
		return E_TRANS_UNKNOW_ERROR;
	}
	
	ret=iso8583_pack(&iso_zgyh_req, zgyh_sbuf);
	if(ret<=0)
	{
		writelog(LOG_ERR,"Pack8583 error,errcode=[%d]",ret);
		return E_TRANS_UNKNOW_ERROR;
	}
	//memset(temp,0x00,sizeof temp);
	//des2src(temp,rPack->scust_auth);
	//ret=send_to_and_recv_from_bank((char *)zgyh_sbuf,ret,(char*)zgyh_abuf,200,(char*)temp,rPack->lvol0,rPack->lvol1);
	if(ret)
	{
		writelog(LOG_ERR,"send_to_and_recv_from_bank error,bank_id=[%d],errcode=[%d]",BANK_GSYH,ret);
		return E_TRANS_BANK_NOANSWER;
	}
	
	ret=iso8583_unpack(&iso_zgyh_ans, zgyh_abuf);
	if(ret<0)
	{
		writelog(LOG_ERR,"UnPack8583 error,errcode=[%d]",ret);
		return E_TRANS_UNKNOW_ERROR;
	}
	if(0!=strncmp((char *)iso_zgyh_ans.fld[39].buf,"00",2))
	{
		writelog(LOG_ERR,"Receive data return code error,error code= [%2.2s] ",iso_zgyh_ans.fld[39].buf);
		memcpy(temp,iso_zgyh_ans.fld[39].buf,2);
		temp[2]=0;
		switch(atoi(temp))
		{
			case 41:		//银行卡挂失
				//sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_LOST);
				return	E_TRANS_BANKCARD_LOST;
			case 36:		//银行卡状态错误
				//sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_STATERR);
				return	E_TRANS_BANKACC_STATERR;
			case 51:		//银行卡金额不足
				//sprintf(pNode->RetCode,"%d",E_TRANS_BANKACC_NOMONEY);
				return	E_TRANS_BANKACC_NOMONEY;
			case 55:		//银行密码错误
				//sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR);
				return	E_TRANS_BANKCARD_PWDERR;
			case 96:		//银行处理超时
				//sprintf(pNode->RetCode,"%d",E_TRANS_BANK_NODECIDE);
				return	E_TRANS_BANK_NOANSWER;
			case 22:		//其他错误
				//sprintf(pNode->RetCode,"%d",E_TRANS_BANKCARD_PWDERR);
				return	E_TRANS_UNKNOW_ERROR;
			default:		//其他未知错误
				//sprintf(pNode->RetCode,"%d",E_TRANS_UNKNOW_ERROR);
				return	E_TRANS_UNKNOW_ERROR;
		}
	}
	
	memset(temp,0x00,sizeof temp);
	iso8583_get(&iso_zgyh_ans, 4, (unsigned char*)temp, 12);
	BCD2INT(&amt, (unsigned char*)temp, 12, 0);
	out_pack->damt0=amt/100.0;
	out_pack->lvol0=1;
	PutRow(handle,out_pack,pRetCode,szMsg);
	
	return 0;
}
Ejemplo n.º 5
0
/*
 * Using the definition d, unpack the content of buf into the ISO 
 * message struct m.
 * Returns 0. FIXME: Should be something different.
 */
int iso8583_unpack(ISO_MSG *m, const char *buf)
{
 const char *start = buf;
 int flds, i;
    char fmt[8];

 memset(fmt, 0, sizeof(fmt));

 /* Field 0 is mandatory and fixed length. */
 if (m->fld[0].buf != NULL || s_isodef[0].fmt != FMT_FIXED) {
  MY_TRACE("flds = %d", 0);
  return -1;
 }

 m->fld[0].len = s_isodef[0].len;
 m->fld[0].buf = (unsigned char *) malloc((m->fld[0].len) * sizeof(char));
 if(s_iCompress)
 {
  buf += BCD2ASC((char*)m->fld[0].buf,(const unsigned char*) buf, m->fld[0].len, s_isodef[0].fmt);
 }
 else
 {
  memcpy(m->fld[0].buf, buf, m->fld[0].len);
  buf += m->fld[0].len;
 }


 /*
  * First bit in the bitmap (field 1) defines if the message is 
  * extended or not.
  * 0: not exteded - i.e. only (some of) the fields 0 to 64 are 
  *    used
  * 1: extended - i.e. (some of) the fields 0 to 128 are used
  * I.e. if one or more of the fields 65 to 128 is used, the 
  * bit is 1.
  */
#if ISO_FLDS==128
 if(buf[0] & 0x80) {
  flds = 128;
 } else {
  flds = 64;
 }
#else /*ISO_FLDS==128*/
 if(buf[0] & 0x80) {
  MY_TRACE("flds = %d", 1);
  return -1;
 }
 flds = 64;
#endif /*ISO_FLDS==128*/

 m->fld[1].len = flds/8;
 m->fld[1].buf = (unsigned char *) calloc((m->fld[1].len), sizeof(char));
 memcpy(m->fld[1].buf, buf, m->fld[1].len);
 buf += m->fld[1].len;

 for (i = 2; i <= flds; i++) 
 {
  if (MY_BITGET(m->fld[1].buf, i)) 
  { /* i'th bit != 0 */
   if ( s_isodef[i].fmt)
   { /* Variable length */
    if(s_iCompress) 
    {
     buf += BCD2INT(&(m->fld[i].len),(const unsigned char*) buf, s_isodef[i].fmt, 0);
    }
    else
    {
     sprintf(fmt, "%%0%dd", s_isodef[i].fmt);
     sscanf(buf, fmt, &(m->fld[i].len));
     buf += s_isodef[i].fmt;     
    }    

    if (m->fld[i].len > s_isodef[i].len) {
     MY_TRACE("flds = %d", i);
     return -1;
    }
   }
   else
   {
    m->fld[i].len = s_isodef[i].len;
   }

   m->fld[i].buf = (unsigned char *) malloc((m->fld[i].len) * sizeof(char));
   
   switch (s_isodef[i].typ) {
   case TYP_BCD: /* Fallthrough */
    if(s_iCompress)
    {
     buf += BCD2ASC((char*)m->fld[i].buf,(const unsigned char*) buf, m->fld[i].len, s_isodef[i].fmt); 
     break;
    }
   case TYP_ASC:
   case TYP_BIN:
    memcpy(m->fld[i].buf, buf, m->fld[i].len);
    buf += m->fld[i].len;
    break;
   default:
    MY_TRACE("flds = %d", i);
    return -1;
    break;
   }
  }
 }

 return (buf-start);
}