PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Программирование на PureBasic в Linux » card reader + полис ОМС


card reader + полис ОМС

Сообщений 1 страница 7 из 7

1

Добрый день!
помогите решить проблему:
имею
1 кардридер acr38
2 исходники проги на VB10, которая считывает данные полиса       https://yadi.sk/d/dg8QrlFlttiXa
3 драйвер под линукс с офф. сайта
4 какие-то библиотеки тоже с офф. сайта                                           https://yadi.sk/d/xXwhYQ0qttiUy

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

lsusb:
Bus 003 Device 003: ID 072f:90cc Advanced Card Systems, Ltd ACR38 SmartCard Reader

что делать, с чего начать, как с этим общаться?
может есть у кого наработки...

сделал следующее:

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

блин, куда всё это нужно писать и что в итоге получим?

If OpenLibrary(0,"libctacs.so")
 
  Result = CallFunction(0, "CT_init" )
  Debug Result
 
  Datas = CallFunction(0, "CT_data")
  Debug Datas
 
  Result = CallFunction(0, "CT_close" )
  Debug Result
 
  CloseLibrary(0)
EndIf

получил: -8, -1, -8

Отредактировано amer (03.08.2016 22:40:26)

0

2

amer написал(а):

If OpenLibrary(0,"libctacs.so")
 
  Result = CallFunction(0, "CT_init" )
  Debug Result
 
  Datas = CallFunction(0, "CT_data")
  Debug Datas
 
  Result = CallFunction(0, "CT_close" )
  Debug Result
 
  CloseLibrary(0)
EndIf

У функций ведь еще параметры есть. Код из файла ct_api.h

Код:
typedef char (WINAPI *CT_INIT)(unsigned short ctn, unsigned short pn);
typedef char (WINAPI *CT_DATA)(unsigned short ctn, unsigned char *dad, unsigned char *sad, unsigned short lenc, unsigned char *command, unsigned short *lenr, unsigned char *response);
typedef char (WINAPI *CT_CLOSE)(unsigned short ctn);

В том же файле есть небольшой пример.

Код:
 * #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;
 * }

0

3

Спасибо, буду пробовать...

попробовал - фигня получается

Пётр, чтоб мне попутно си не изучать может расшифруешь, как примерно тоже сделать на пурике?

сделал так:

Код:
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.

и ещё, мало получить доступ к ридеру - нужно еще к карте заклинания какие-то?
можно ли их выдернуть как-то отсюда:

Код:
        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

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

Отредактировано amer (04.08.2016 22:48:05)

0

4

amer написал(а):

t$="REQUEST ICC"
    lenc=Len(t$)

В коде не это должно быть. Оригинал.

Пётр написал(а):

*     // REQUEST ICC
*     unsigned char command[] = { 0x20, 0x12, 0x01, 0x00, 0x00 };
*     unsigned short lenc = sizeof(command);

Строка

Код:
// REQUEST ICC

Это комментарий. Функции CT_data нужно передавать содержимое массива. Можно написать так.

Код:
    Dim resp.a(261)
    Result=CallFunction(0, "CT_data", 1, 1, 2, ?m2-?m1, ?m1, lenr, @resp())

А в конце кода разместить данные.

Код:
    DataSection
      m1:
      Data.a $20, $12, $01, $00, $00
      m2:
    EndDataSection
amer написал(а):

можно ли их выдернуть как-то отсюда

Тут далеко не весь код. Создаются несколько экземпляров классов PCSCReadersManager, PolicySmartcardBase и т. д. Что они делают нужно смотреть в остальном коде...

0

5

я вот это написал

Код:
t$="REQUEST ICC"
    lenc=Len(t$)

потому, что:
Supported CT-BCS Commands
RESET
RESET CT
REQUEST ICC
GET STATUS
DEACTIVATE ICC
EJECT ICC

только эти команды, наверное, нужно сначала в коды символов перевести?
пожалуйста, если есть возможность, посмотри исходник на VB
я там немного под свои нужды подправлял, но не сильно разбираюсь в net технологиях, поэтому не могу понять, как в PB перевести.
сдается мне, что там что-то куда-то спрятано от посторонних глаз? :dontknow:

0

6

amer написал(а):

но не сильно разбираюсь в net технологиях

Я тоже... :dontknow:
Кроме как на VB.NET больше не на каком ЯП примеров нет?

0

7

я пытался гуглить всю эту бодягу, но там все почему-то сильно засекречено, и этот исходник нашел каким-то чудом

собственно, из-за чего весь сырбор:
недавно стали запрещать покупать бюджетникам всякие микрософтовские продукты
я и решил пересадить, половину детской стомат. поликлиники на убунту (ту часть, где нет бухгалтерских прог)
благо ПО писал сам на VB6 теперь переписываю на PB под линух. не хочется оставлять комп с виндой в регистратуре.

решил еще поискать исходники
пока нашел спецификацию                          http://forum.vingrad.ru/articles/topic- … -pcsc.html
пытаюсь изучать

в репозитории нашел прогу по считыванию карт
она выдала следующее:
Found 1 PCSC readers
0016 INFO    Selected 'pcsc://ACS ACR38U-CCID 00 00'
0017 DEBUG   smartcard_list.txt will be scheduled for update in about 28 day(s).
0018 WARNING The script 'atr.lua' does not contain version information, and may use an older incompatible API
0019 WARNING To remove this warning, add the following line at the begining of 'atr.lua':
-- @targets 0.8
0020 INFO    Running script atr.lua (please wait)
0021 DEBUG   Attempting to connect to 'pcsc://ACS ACR38U-CCID 00 00'
0022 INFO    Reader maximum input length is 261 bytes
0023 INFO    Connection successful, protocol is T=1
0024 INFO    ATR is 17 bytes: 3BF71300008131FE45464F4D534F4D53A9
0025 INFO    Disconnected reader

буду смотреть исходники

си и какой-то луа            https://yadi.sk/d/neL3PmmftxefG

Отредактировано amer (05.08.2016 23:00:39)

0


Вы здесь » PureBasic - форум » Программирование на PureBasic в Linux » card reader + полис ОМС