2014-12-01 52 views
1

我是iOS開發人員。我需要通過套接字服務器發送ISO-8583標準的消息。iOS ISO-8583消息發送

我已經建立了與服務器的連接,它運行良好。 服務器以這種方式工作:當消息以正確格式發送(但數據不正確,例如PIN錯誤)時,它會以正確的錯誤代碼進行響應。當消息出現格式錯誤,服務器不響應所有;)

所以,知道我的連接工作正常(測試),我有以下問題: 我需要發送ISO8583消息服務器。該消息必須有這些領域:

  • SI(2個字節 - 大小整個消息的)
  • TPDU(必須是12345 - documetation說)
  • 詳細(下面的詳細信息)
  • EOT(規格 - 符號 「0D」)

在以下示例中,我們使用:

  • MTI - 0200
  • 帳號 - 6019 5300 0601 9592
  • 代碼 - 700000
  • 終端ID - 35959551
  • PIN - 880088(需要有兩個appedned到結束空間(文檔說))

這裏是文件規格:

  • 字段2 - 卡數量,長度 - 19(3長度+ 16號),格式 LLVAR
  • 字段3 - 處理代碼,長度 - 6,格式NUMBER
  • 字段12 - 時間(HHMMSS),長度 - 6,格式NUMBER
  • 字段13 - 日期(月日),長度 - 4,格式NUMBER
  • 字段41 - 終端ID,長度 - 8,格式字母數字
  • 字段52 - PIN,長度 - 16,格式HEX

因此,字段2,3,12,13,41和52必須是組。

我採用兩種方法:

1)使用外部庫:https://github.com/mordoskull/Objective-ISO8583 - 使用數據的許多不同組合,這是行不通的。我的用法:

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]; 

我知道卡號字段必須有三位數的長度在它前面追加,我知道每一個其他規格關於ISO8583。

我設法NSData的,看起來像這樣在日誌:

Printing description of fullRequest: 
<30303131 39010203 04050200 30313130 30303030 30303031 31303030 30303030 30303030 30303030  30303030 30303030 30303030 31303030 30303030 30303031 30303030 30303030 30303030 30313636 30313935  33303030 36303139 35393261 61653630 31393232 37346231 33353935 39353531 38383030 38382020> 

The same message, not converted to NSData, looks like this : 
009001020304050200601800000080100001660195300060195927000001131041201359595513838303038382020 

和服務器沒有任何響應,所以我必須在發送錯誤格式的消息。

有人可以幫助我如何正確地格式化消息?

回答

0

最後設法做到了myslef。這裏是設置參數的代碼(以防某人需要它):

NSDate * currentTime = [NSDate date]; 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];