purebasic.info

PureBasic forum
Текущее время: Пн дек 11, 2017 4:37 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: card reader + полис ОМС
СообщениеДобавлено: Пт авг 05, 2016 4:51 pm 
Не в сети
доцент

Зарегистрирован: Ср янв 15, 2014 2:21 pm
Сообщений: 72
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день!
На другом форуме спросил, но может здесь больше народу...

помогите решить проблему:
имею:
1 кардридер acr38
2 исходники проги на VB10, которая считывает данные полиса https://yadi.sk/d/dg8QrlFlttiXa
3 драйвер под линукс с офф. сайта
4 какие-то библиотеки тоже с офф. сайта https://yadi.sk/d/xXwhYQ0qttiUy
5 Bus 003 Device 003: ID 072f:90cc Advanced Card Systems, Ltd ACR38 SmartCard Reader

нужно переделать на PB, причем под linux

сделал следующее:
Код:
1
2
3
4
5
6
7
8
If OpenLibrary(0,"libctacs.so")
  If ExamineLibraryFunctions(0)
    While NextLibraryFunction()
      Debug LibraryFunctionName()
    Wend
  EndIf
  CloseLibrary(0)
EndIf


получил: CT_close, CT_data, _init, _fini, CT_init

в файле ридми к драйверу написано:
Supported CT-BCS Commands
RESET
RESET CT
REQUEST ICC
GET STATUS
DEACTIVATE ICC
EJECT ICC

По подсказке Петра в файлике имеется пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 * #include <stdio.h>;
 * #include <ct_api.h>;
 *
* int main(int argc, char *argv[])
 * {
 *    char ret;
 *    unsigned short ctn;
 *    unsigned short pn;
 *    unsigned short sad;
 *    unsigned short dad;
 *
*    // REQUEST ICC
 *    unsigned char command[] = { 0x20, 0x12, 0x01, 0x00, 0x00 };
 *    unsigned short lenc = sizeof(command);
 *
*    unsigned char response[300];
 *    unsigned short lenr = sizeof(response);
 *
*    ctn = 1;
 *    pn = 1;
 *
*    // Initialize card terminal
 *    ret = CT_init(ctn, pn);
 *    if (ret != OK)
 *    {
 *        printf("Error: CT_init failed with error %d\n", ret);
 *        return 1;
 *    }
 *
*    sad = 2; // Source = Host
 *    dad = 1; // Destination = Card Terminal
 *
*    // Send command
 *    ret = CT_data(ctn, &dad, &sad, lenc, command, &lenr, response);
 *    if (ret != OK)
 *        printf("Error: CT_data failed with error %d\n", ret);
 *    else
 *    {
 *        // Display response
 *        printf("Response: ");
 *        for (i = 0; i < lenr; i++)
 *            printf("%02X ", response[i]);
 *        printf("\n");
 *    }
 *
*    // Close card terminal
 *    ret = CT_close(ctn);
 *    if (ret != OK)
 *        printf("Error: CT_close failed with error %d\n", ret);
 *
*    return 0;
 * }



сделал следующий шаг:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
If OpenLibrary(0,"/home/amer/purebasic/sdk/lib32/libctacs.so")
  Result = CallFunction(0, "CT_init", 1, 1)
  If Result=0
    lenr=261
    t$="REQUEST ICC"
    lenc=Len(t$)
 
    Dim resp.c(261)
    Result=CallFunction(0, "CT_data", 1, 1, 2, lenc, @t$, lenr, @resp)
    If Result=0
      For i=0 To lenr-1
        Debug resp(i)
      Next i
    EndIf
    CallFunction(0, "CT_close", 1)
  EndIf
  CloseLibrary(0)
EndIf



в итоге получил 261 ноль в дебагере
и ошибку в CallFunction(0, "CT_close", 1) - [ERROR] Invalid memory access.

и ещё, мало получить доступ к ридеру - нужно еще к карте заклинания какие-то?
можно ли их выдернуть как-то отсюда:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Dim manager As New PCSCReadersManager()
 
        Dim SA As String = ReadersComboBox.Items(0).ToString()
 
        manager.EstablishContext(SmartCard.PCSC.READERSCONTEXTSCOPE.SCOPE_USER)
        If manager.OfType(Of ISCard)().[Select](Function(s) s.ReaderName).ToList().Contains(SA) Then
            Dim card As ISCard = manager(SA)
            Dim policy As New PolicySmartcardBase(card)
            Try
                policy.Connect()
            Catch exception As Exception
                MessageBox.Show(exception.Message, "Ошибка: ")
                Exit Sub
            End Try
            Try
                Dim owner_info As OwnerInformation = policy.GetOwnerInformation()
                If owner_info IsNot Nothing Then
                    textBoxFIO.Text = FormatPolicyText(owner_info.Identity_1, "") & " " & FormatPolicyText(owner_info.Identity_2, "") & " " & FormatPolicyText(owner_info.Identity_3, "")
                    textBoxSex.Text = If(owner_info.Sex = 1, "Мужской", If(owner_info.Sex = 2, "Женский", "Неизвестно"))
                    textBoxDateOfBirth.Text = FormatPolicyDate(owner_info.BirthDate, "Отсутствует")
                    textBoxPlaceOfBirth.Text = FormatPolicyText(owner_info.BirthPlace, "Отсутствует")
 
                    If owner_info.Citizenship IsNot Nothing Then
                        textBoxCountryCode.Text = FormatPolicyText(owner_info.Citizenship.CoutryCode, "Отсутствует")
                        textBoxCountryName.Text = FormatPolicyText(owner_info.Citizenship.CoutryCyrillicName, "Отсутствует")
                    End If
 
                    textBoxPolisNumber.Text = owner_info.PolicyNumber
                    textBoxPolisDate.Text = FormatPolicyDate(owner_info.ExpireDate, "Отсутствует")
                    textBoxPolisExpire.Text = FormatPolicyDate(owner_info.ExpireDate, "Не ограничено")
                    textBoxSNILS.Text = FormatPolicyText(owner_info.SNILS, "Отсутствует")
                End If


как выцепить, что посылается в кардридер и как потом получить данные?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB