Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | |
очень странно 27.06.02 16:39 Число просмотров: 1011
Автор: PS <PS> Статус: Elderman
|
> command[0]=0xA0; // CLA > command[1]=0xA4; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x02; // L > command[5]=0x3F; > command[6]=0x00; > res=CT_data > (ctn,&dad,&sad,7,command,&lenr,response); > > > if( res==-1)fprintf(fil_out,"ERR_INVALID PARAMETR\n"); > else fprintf(fil_out,"res %d\n",res); > > for (i=0;i<7;i++){ > fprintf(fil_out,"response [ %d ] %c\n",i,response[i]); > } > После выбора MF у меня возвращаются в HEX вот такие числа > 90, 00, 10, 88, 90, 00 > вот эти 10, 88 у меня находятся в ATR header.
Command code: A0 A4
Parameters: P1: 00 P2: 00 P3: 02
Command data: Directory/EF identifier
Response data: None
Return codes:
67 02 Wrong P3
6B 00 Wrong P1 or P2
94 04 Wrong identifier
9F xx Successful, xx = number of response data available for GET RESPONSE
Как видишь 90 00 в стандарте нет (gsm), и response data быть не должно. Если ты ничего не напутал - значит у тебя совершенно не gsm карта.
Попробуй ради прикола в ридер засунуть карточку от своего мобильника.
> sad=2; > dad=00; > > command[0]=0xA0; // CLA > command[1]=0xC0; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > тогда какое число в ? > command[4]=0x??; // L > res=CT_data (ctn,&dad,&sad,5,command,&lenr,response); > for (i=0;i<7;i++){ > fprintf(fil_out,"response [ %d ] %d\n",i,response[i]); > } > После get responce. responce мне ничего возвращает
Тады ой. Попробуй command[4]=0xff и посмотри, если вернет 67 xx, то xx и будет то что тебе надо.
Но это с 3f00, а на другие файлы ? Тебе же нужно было прочитать данные. Попробуй с другими файлами сделать чтение так как я в предыдущем ответе описал.
|
<programming>
|
[C++] CT-API и inter-industry Commands 24.06.02 04:18
Автор: Full shrize Статус: Незарегистрированный пользователь
|
Люди помогите любителю:-)
Выбирая файл на карте все нормально возвращает 90:00
Начинаю считывать на х.. ошибка CT-API 11(типа выделенный буфер слишком мал для читаемых данных) бл.. увеличиваю буфер он мне возвращает Err Parametr. Бл. какой буфер у меня карта(Сименс) на х.. позволяет читать файл целиком на х.. Если кто встречался с такой бородой помогите.
|
|
Каким API пользуешся ? 24.06.02 10:01
Автор: PS <PS> Статус: Elderman Отредактировано 24.06.02 10:27 Количество правок: 1
|
Какой ридер ? Пример программы можешь дать ?
И еще: почему у тебя select выдает 90 00 ? Такой код он не должен возвращать. При нормальном завершении операции он возвращает 9F xx.
|
| |
[C++] Каким API пользуешся ? 25.06.02 04:15
Автор: Full shrize Статус: Незарегистрированный пользователь
|
> Какой ридер ? Пример программы можешь дать ? > И еще: почему у тебя select выдает 90 00 ? Такой код он не > должен возвращать. При нормальном завершении операции он > возвращает 9F xx. 1) Я извиняюсь да он возвращает 9F.:-)
2)ридер ECO5000 (ORGA).
синхронная передача
3)
sad=2;
dad=00;
fprintf(fil_out,"SELECT FILE\n");
command[0]=0x00; // CLA
command[1]=0xA4; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x02; // L
command[5]=0x2F;
command[6]=0x00;
res=CT_data (ctn,&dad,&sad,7,command,&lenr,response);
if( res==-1)fprintf(fil_out,"ERR_INVALID PARAMETR\n");else fprintf (fil_out,"res %d\n",res);
for (i=0;i<lenr;i++){
fprintf(fil_out,"response [ %d ] %d\n",i,response[i]);
//if(response[lenr-1]==144) fprintf(fil_out,"function completed");;
}
//if(response[lenr-2]==144) fprintf(fil_out,"function completed\n");
fprintf(fil_out,"command[2] %d\n",command[2]);
fprintf(fil_out,"command[3] %d\n",command[3]);
fprintf(fil_out,"command[4] %d\n",command[4]);
fprintf(fil_out,"command[5] %d\n",command[5]);
fprintf(fil_out,"command[6] %d\n",command[6]);
fprintf(fil_out,"command[7] %d\n",command[7]);
fprintf(fil_out,"command[8] %d\n",command[8]);
fprintf(fil_out,"command[9] %d\n",command[9]);
fprintf(fil_out,"sad %d\n",sad);
fprintf(fil_out,"dad %d\n",dad);
fprintf(fil_out,"lenr %d\n",lenr);
fprintf(fil_out,"READ BINARY\n");
sad=2; /* source = host */
dad=00;
command[0]=0x00; // CLA
command[1]=0xB0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x00; // L
//command1[5]=0x00;
//command1[6]=0x00;
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
Здесь вызываю CT_API.dll
Наскоко мне удалось найти то READ BINARY не читает МФ и Дир секции(но это у GSM)у карты нет никаких security. Вот и как прочитать эту Дир потому что мне кажется на этой карте до х.. апликаций:-) (карта -страховой полис)
|
| | |
Так 25.06.02 12:08
Автор: PS <PS> Статус: Elderman
|
> 2)ридер ECO5000 (ORGA). Сочувствую.
> command[0]=0x00; // CLA правильно A0
> command[1]=0xA4; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x02; // L > command[5]=0x2F; > command[6]=0x00; Что за файл ?
> command[0]=0x00; // CLA A0
> command[1]=0xB0; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x00; // L тут длинна
> //command1[5]=0x00; > //command1[6]=0x00; Эти два нафиг не нужны.
> Наскоко мне удалось найти то READ BINARY не читает МФ и Дир > секции(но это у GSM) Не читает, только двоичные файлы. Для MF используй READ RECORD.
Какой именно файл - GET RESPONSE после SELECT. Там же и длинна доступная для чтения.
Прочесть дирестории нельзя. Узнать файлы в директории - можно, но комманда специфична для каждого производителя. Либо полным перебором.
|
| | | |
Еще один Так 26.06.02 09:11
Автор: Full shrize Статус: Незарегистрированный пользователь
|
fprintf(fil_out,"GET RESPONCE\n");
sad=2; /* source = host */
dad=00;
command[0]=0x00; // CLA
или опять A0
command[1]=0xC0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x10; // L
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
после этого в lenr будет хранится длина файла?
fprintf(fil_out,"READ RECORD\n");
sad=2; /* source = host */
dad=00;
command[0]=0xA0; // CLA
command[1]=0xB2; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=lenr; // L
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
тут вопрос на счет длины у меня карта считывает все сразу, не указывая длины поэтому command[4] должен быть равен Empty?
|
| | | | |
Не так :) 26.06.02 10:20
Автор: PS <PS> Статус: Elderman
|
Не так.
SELECT
Получаешь 9F XX
command[0]=0xA0; // CLA
command[1]=0xC0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0xXX; // L
> res=CT_data (ctn,&dad,&sad,5,command,&lenr,response); > после этого в lenr будет хранится длина файла? НЕТ, в len будет ко-во байт в response
Далее расскладываешь этот response по полочкам. Его формат можно найти в спецификации.
Выгребаешь из него тип файла и количество байт доступных для чтения.
И после этого делаешь либо READ BINARY, либо READ RECORD.
Но можно сделать и более криво. Для чтения в P3 засунуть FF. Тогда тебе вернется 67 YY, где YY то количество байт которое карточка от тебя ждала.
> тут вопрос на счет длины у меня карта считывает все сразу, > не указывая длины поэтому command[4] должен быть равен > Empty? Не встречались такие карточки. По идее рекорд файлы можно читать только по одному рекорду. Бинарники - тем количеством, которое карточка может вернуть за раз.
В любом случае - более чем 256 байт за раз ты не прочтешь ;)
Ну а если карточка действительно позволяет прочесть сразу все, неограниченного размера - тут надо смотреть спецификацию именно к этой карте.
Совет, не лезь пока в специфик, пользуйся стандартом. Читай по столько, по сколько тебя просят в респонсе или во втором байте ошибки 67.
Перебором - это почти шутка. Тебе нужно перебрать имена файлов от 0000 до FFFF, исключив жестко заданные в стандартах, и сделать на каждый SELECT. Причем все это сделать для каждой директории. Только карточка у тебя не третий пень, да и ридер - вещь тормозная.
|
| | | | | |
походу что-то не так:-) 27.06.02 05:10
Автор: Full shrize Статус: Незарегистрированный пользователь
|
command[0]=0xA0; // CLA
command[1]=0xA4; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
command[4]=0x02; // L
command[5]=0x3F;
command[6]=0x00;
res=CT_data (ctn,&dad,&sad,7,command,&lenr,response);
if( res==-1)fprintf(fil_out,"ERR_INVALID PARAMETR\n");
else fprintf(fil_out,"res %d\n",res);
for (i=0;i<7;i++){
fprintf(fil_out,"response [ %d ] %c\n",i,response[i]);
}
После выбора MF у меня возвращаются в HEX вот такие числа 90, 00, 10, 88, 90, 00
вот эти 10, 88 у меня находятся в ATR header.
sad=2;
dad=00;
command[0]=0xA0; // CLA
command[1]=0xC0; // INS
command[2]=0x00; // P1
command[3]=0x00; // P2
тогда какое число в ?
command[4]=0x??; // L
res=CT_data (ctn,&dad,&sad,5,command,&lenr,response);
for (i=0;i<7;i++){
fprintf(fil_out,"response [ %d ] %d\n",i,response[i]);
}
После get responce. responce мне ничего возвращает
|
| | | | | | |
очень странно 27.06.02 16:39
Автор: PS <PS> Статус: Elderman
|
> command[0]=0xA0; // CLA > command[1]=0xA4; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > command[4]=0x02; // L > command[5]=0x3F; > command[6]=0x00; > res=CT_data > (ctn,&dad,&sad,7,command,&lenr,response); > > > if( res==-1)fprintf(fil_out,"ERR_INVALID PARAMETR\n"); > else fprintf(fil_out,"res %d\n",res); > > for (i=0;i<7;i++){ > fprintf(fil_out,"response [ %d ] %c\n",i,response[i]); > } > После выбора MF у меня возвращаются в HEX вот такие числа > 90, 00, 10, 88, 90, 00 > вот эти 10, 88 у меня находятся в ATR header.
Command code: A0 A4
Parameters: P1: 00 P2: 00 P3: 02
Command data: Directory/EF identifier
Response data: None
Return codes:
67 02 Wrong P3
6B 00 Wrong P1 or P2
94 04 Wrong identifier
9F xx Successful, xx = number of response data available for GET RESPONSE
Как видишь 90 00 в стандарте нет (gsm), и response data быть не должно. Если ты ничего не напутал - значит у тебя совершенно не gsm карта.
Попробуй ради прикола в ридер засунуть карточку от своего мобильника.
> sad=2; > dad=00; > > command[0]=0xA0; // CLA > command[1]=0xC0; // INS > command[2]=0x00; // P1 > command[3]=0x00; // P2 > тогда какое число в ? > command[4]=0x??; // L > res=CT_data (ctn,&dad,&sad,5,command,&lenr,response); > for (i=0;i<7;i++){ > fprintf(fil_out,"response [ %d ] %d\n",i,response[i]); > } > После get responce. responce мне ничего возвращает
Тады ой. Попробуй command[4]=0xff и посмотри, если вернет 67 xx, то xx и будет то что тебе надо.
Но это с 3f00, а на другие файлы ? Тебе же нужно было прочитать данные. Попробуй с другими файлами сделать чтение так как я в предыдущем ответе описал.
|
| | | | | | | |
А тут просто возникло не допонимание 28.06.02 04:06
Автор: Full shrize Статус: Незарегистрированный пользователь
|
А тут просто возникло не допонимание, карта то не мобильника, простая карта Сименс, там хранятся данные толи пациентов толи еще кого-то. Так что я делаю все чисто по IS0-7816. :-)
по ИСО 7816-4 если 9000 то комманда успешна.
Вот еще здесь что-то я не врубился, тут в ИСО для переключения передачи от карты к ридеру нуно сбросить карту, А какой командой?:-)
|
| | | |
Так 26.06.02 08:49
Автор: Full shrize Статус: Незарегистрированный пользователь
|
> Прочесть дирестории нельзя. Узнать файлы в директории - > можно, но комманда специфична для каждого производителя. > Либо полным перебором. Ух ты, а как это перебором?
|
|
|