iOS ISO-8583消息发送

iOS ISO-8583消息发送,ios,iphone,message,server,iso,Ios,Iphone,Message,Server,Iso,我是一名iOS开发者。我需要通过套接字服务器发送ISO-8583标准的消息 我已经和服务器建立了连接,并且工作正常。 服务器是这样工作的:当消息以正确的格式(但数据不正确,例如错误的PIN)发送给它时,它会以正确的错误代码进行响应。当消息格式错误时,服务器根本不响应;) 因此,知道我的连接工作正常(经过测试),我有以下问题: 我需要发送ISO8583信息到服务器。邮件必须包含以下字段: SI(2字节-整个消息的大小) TPDU(必须是12345-文件说明) 详细信息(更多信息如下) EOT(规

我是一名iOS开发者。我需要通过套接字服务器发送ISO-8583标准的消息

我已经和服务器建立了连接,并且工作正常。 服务器是这样工作的:当消息以正确的格式(但数据不正确,例如错误的PIN)发送给它时,它会以正确的错误代码进行响应。当消息格式错误时,服务器根本不响应;)

因此,知道我的连接工作正常(经过测试),我有以下问题: 我需要发送ISO8583信息到服务器。邮件必须包含以下字段:

  • SI(2字节-整个消息的大小)
  • TPDU(必须是12345-文件说明)
  • 详细信息(更多信息如下)
  • EOT(规范-符号“0D”)
在下面的示例中,我们使用:

  • MTI-0200
  • 账号-6019 5300 0601 9592
  • 代码-700000
  • 终端ID-359551
  • PIN-880088(需要在末尾添加两个空格(docs说))
以下是文档规范:

  • 字段2-卡号,长度-19(3长度+16数字),格式 LLVAR
  • 字段3-处理代码,长度-6,格式编号
  • 字段12-时间(hhmmss),长度-6,格式编号
  • 字段13-日期(mmdd),长度-4,格式编号
  • 字段41-终端ID,长度-8,字母数字格式
  • 字段52-引脚,长度-16,十六进制格式
因此,必须设置字段2、3、12、13、41和52

我用了两种方法:

1) 使用外部库:-使用许多不同的数据组合,它不起作用。我的用法:

   ISOMessage *isoMessage1 = [[ISOMessage alloc] init];
   NSString *tpdu = @"0102030405";
  [isoMessage1 setMTI:@"0200"];
  isoMessage1.bitmap = [[ISOBitmap alloc] initWithGivenDataElements:@[@"DE02", @"DE03", @"DE12", @"DE13", @"DE41", @"DE52"] configFileName:nil];
  [isoMessage1 addDataElement:@"DE02" withValue:cardNumber configFileName:nil];
  [isoMessage1 addDataElement:@"DE03" withValue:@"700000" configFileName:nil];
  [isoMessage1 addDataElement:@"DE12" withValue:transactionTime configFileName:nil];
  [isoMessage1 addDataElement:@"DE13" withValue:transactionDate configFileName:nil];
  [isoMessage1 addDataElement:@"DE41" withValue:@"35959551" configFileName:nil];  //TID - 35959551
  [isoMessage1 addDataElement:@"DE52" withValue:@"880088" configFileName:nil];
2) 手动设置所有字段,如下所示:

//CARD NUMBER
NSData *card = [cardNumber dataUsingEncoding:NSUTF8StringEncoding];

//TPDU
NSMutableData *TPDU = [[NSMutableData alloc] init];
[TPDU appendBytes:"\x01\x02\x03\x04\x05" length:5];

//TRANSACTION CODE
NSData *transactionCode = [[NSString stringWithFormat:@"%x",700000] dataUsingEncoding:NSUTF8StringEncoding];

//TIME AND DATE
NSData *time = [[NSString stringWithFormat:@"%x",[transactionTime intValue]] dataUsingEncoding:NSUTF8StringEncoding];
NSData *date = [[NSString stringWithFormat:@"%x",[transactionDate intValue]] dataUsingEncoding:NSUTF8StringEncoding];

//PIN
NSData *PIN = [[NSString stringWithFormat:@"%@  ",self.pinField.text] dataUsingEncoding:NSASCIIStringEncoding];

//TID
NSData *TID = [@"35959551" dataUsingEncoding:NSASCIIStringEncoding];

//MTI
NSMutableData *MTI = [[NSMutableData alloc] init];
[MTI appendBytes:"\x02\x00" length:2];

//BITMAP
NSArray* fields = [NSArray arrayWithObjects:@2, @3,
                   @12, @13, @41, @52, nil];
NSMutableArray* binary = [NSMutableArray new];
for(int i=0 ; i<64 ; ++i) {
    binary[i] = @"0";
}
for(int j = 0; j<[fields count]; ++j)
{
    binary[[fields[j] intValue]-1] = @"1";
}

NSMutableString * bitmap = [[NSMutableString alloc] init];
for (NSObject * obj in binary)
{
    [bitmap appendString:[obj description]];
}
NSData *bitmapByte = [bitmap dataUsingEncoding:NSUTF8StringEncoding];

NSMutableData *request = [[NSMutableData alloc] init];
[request appendData:TPDU];
[request appendData:MTI];
[request appendData:bitmapByte];
[request appendData:card];
[request appendData:transactionCode];
[request appendData:time];
[request appendData:date];
[request appendData:TID];
[request appendData:PIN];

NSData *SI = [[NSString stringWithFormat:@"00%lu",(unsigned long)[request length]] dataUsingEncoding:NSUTF8StringEncoding];

NSMutableData* fullRequest = [[NSMutableData alloc] init];
[fullRequest appendData:SI];
[fullRequest appendData:request];
//卡号
NSData*卡=[cardNumber数据使用编码:NSUTF8StringEncoding];
//TPDU
NSMutableData*TPDU=[[NSMutableData alloc]init];
[TPDU附录字节:“\x01\x02\x03\x04\x05”长度:5];
//交易代码
NSData*transactionCode=[[NSString stringWithFormat:@“%x”,700000]数据使用编码:NSUTF8StringEncoding];
//时间和日期
NSData*time=[[NSString stringWithFormat:@“%x”,[transactionTime intValue]]dataUsingEncoding:NSUTF8StringEncoding];
NSData*date=[[NSString stringWithFormat:@“%x”,[transactionDate intValue]]dataUsingEncoding:NSUTF8StringEncoding];
//别针
NSData*PIN=[[NSString stringWithFormat:@“%@”,self.pinField.text]dataUsingEncoding:NSASCIIStringEncoding];
//工业贸易署
NSData*TID=[@“35959551”数据使用编码:NSASCIIStringEncoding];
//MTI
NSMutableData*MTI=[[NSMutableData alloc]init];
[MTI appendBytes:“\x02\x00”长度:2];
//位图
NSArray*字段=[NSArray阵列及其对象:@2、@3、,
@12,13,41,52,零,;
NSMUTABLEARRY*二进制=[NSMUTABLEARRY new];

for(int i=0;i最终成功地实现了myslef。下面是设置参数的代码(以防有人需要):

NSDate*currentTime=[NSDate日期]; NSDateFormatter*dateFormatter=[[NSDateFormatter alloc]init]

//get current Time
[dateFormatter setDateFormat:@"hhmmss"];
NSString *transactionTime = [dateFormatter stringFromDate: currentTime];
transactionTime = [transactionTime stringByReplacingOccurrencesOfString:@":" withString:@""];

//get current Date
[dateFormatter setDateFormat:@"MMdd"];
NSString *transactionDate = [dateFormatter stringFromDate:currentTime];

NSString* cardNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"cardNumber"];

//TID
NSData *TID = [@"35959551" dataUsingEncoding:NSASCIIStringEncoding];
//PIN
NSData *PIN = [[NSString stringWithFormat:@"%@",self.pinField.text] dataUsingEncoding:NSASCIIStringEncoding];
//TPDU
NSMutableData *TPDU = [[NSMutableData alloc] init];
[TPDU appendBytes:"\x01\x02\x03\x04\x05" length:5];
//MTI
NSMutableData *MTI = [[NSMutableData alloc] init];
[MTI appendBytes:"\x02\x00" length:2];
//TRANSACTION CODE
NSString *transactionCode = @"700000";
NSData *trCode = [self convertToData:transactionCode];
//CARD NUMBER
NSString *cardWithLength = [@"16" stringByAppendingString:cardNumber];
NSData *card = [self convertToData:cardWithLength];
//TIME AND DATE
NSData *time = [self convertToData:transactionTime];
NSData *date = [self convertToData:transactionDate];
//BITMAP
NSString *mapa = @"6018000000801000";
NSData *mapaData = [self convertToData:mapa];

NSMutableData *request = [[NSMutableData alloc] init];
[request appendData:TPDU];
[request appendData:MTI];
[request appendData:mapaData];
[request appendData:card];
[request appendData:trCode];
[request appendData:time];
[request appendData:date];
[request appendData:TID];
[request appendData:PIN];

NSString *SI = [NSString stringWithFormat:@"00%lu",(unsigned long)[request length]];
NSData *SIData = [self convertToData:SI];

NSMutableData* fullRequest = [[NSMutableData alloc] init];
[fullRequest appendData:SIData];
[fullRequest appendData:request];
//get current Time
[dateFormatter setDateFormat:@"hhmmss"];
NSString *transactionTime = [dateFormatter stringFromDate: currentTime];
transactionTime = [transactionTime stringByReplacingOccurrencesOfString:@":" withString:@""];

//get current Date
[dateFormatter setDateFormat:@"MMdd"];
NSString *transactionDate = [dateFormatter stringFromDate:currentTime];

NSString* cardNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"cardNumber"];

//TID
NSData *TID = [@"35959551" dataUsingEncoding:NSASCIIStringEncoding];
//PIN
NSData *PIN = [[NSString stringWithFormat:@"%@",self.pinField.text] dataUsingEncoding:NSASCIIStringEncoding];
//TPDU
NSMutableData *TPDU = [[NSMutableData alloc] init];
[TPDU appendBytes:"\x01\x02\x03\x04\x05" length:5];
//MTI
NSMutableData *MTI = [[NSMutableData alloc] init];
[MTI appendBytes:"\x02\x00" length:2];
//TRANSACTION CODE
NSString *transactionCode = @"700000";
NSData *trCode = [self convertToData:transactionCode];
//CARD NUMBER
NSString *cardWithLength = [@"16" stringByAppendingString:cardNumber];
NSData *card = [self convertToData:cardWithLength];
//TIME AND DATE
NSData *time = [self convertToData:transactionTime];
NSData *date = [self convertToData:transactionDate];
//BITMAP
NSString *mapa = @"6018000000801000";
NSData *mapaData = [self convertToData:mapa];

NSMutableData *request = [[NSMutableData alloc] init];
[request appendData:TPDU];
[request appendData:MTI];
[request appendData:mapaData];
[request appendData:card];
[request appendData:trCode];
[request appendData:time];
[request appendData:date];
[request appendData:TID];
[request appendData:PIN];

NSString *SI = [NSString stringWithFormat:@"00%lu",(unsigned long)[request length]];
NSData *SIData = [self convertToData:SI];

NSMutableData* fullRequest = [[NSMutableData alloc] init];
[fullRequest appendData:SIData];
[fullRequest appendData:request];