Содержание
Назначение
С версии decodecards.dll 1.29 доступен новый способ декодирования (выдержка из version.txt):
1. Добавлен новый алгоритм декодирования
CardDecodeType = FastScript
Алгоритм декодирования программируется в функции decodecard во внешнем файле, задаваемым параметром fsUnit в секции [frf].
В секции [frf] появился параметр
fsUnit=fsdecodecard.upasТаким образом, появилась возможность максимально тонкой настройки принципов декодирования как для Абонемент-TCPCardReader так и для gkhostconnect-GKHOST.
Содержимое файла fsdecodecard.upas (болванка из поставки):
function fsUnitVersion:integer; begin result := 1; end; function DecodeCard(Track:string; var Code:integer):string; begin Result := Track; end; begin end.
Т.е. при считывании идентификатора, для его декодирования будет вызвана функция DecodeCard() из данного файла.
Входные параметры функции:
Track - полный трек полученный от считывателя (типа string),
Code - код типа идентификатора (типа integer, подлежит изменению в теле функции);
Выходные параметры функции:
Result - номер идентификатора представленный строкой, после получения должен безошибочно конвертироваться в Int64 (типа string).
В файле скрипта доступны все функции доступные в печатных формах абонемента, что позволяет облегчить написание и отладку скрипта.
Пример печатной формы для тестирования разрабатываемого скрипта см. в приложениях к статье.
Пример
Пример скрипта декодирования для считывателя штрихкодов подключечённого к контроллеру UCS, для работы со штрихкодами абонементов, возвращающего контрольный символ штрихкода в виде "<контрольный_символ>F":
function fsUnitVersion:integer;
begin
result := 1;
end;
function DecodeCard(Track:string; var Code:integer):string;
var //Объявление локальных переменных
i,summa,ltt:integer;
ttr:string;
symbolz:array of string;
begin
ttr:=trim(Track); //Обрезание трека, в случае попадания пробелов в начало или конец
ltt:=Length(trim(Track)); //Получение длины обрезанного трека
if(Uppercase(Track)='F5012345678900') //Проверка на совпадение со спец штрихкодом - картой полного доступа
then
begin
result:='5012345678900'; //Возвращается номер карты полного доступа прописанный в gkhostconnect
Exit;
end;
if(not (Uppercase(Copy(ttr,ltt,1))='F')) //Если последний символ полученного трека не "F", т.е. штрихкод считался без контрольного символа Code39
then
begin
if (Copy(ttr,ltt-2,3)=MDCHECKSUM(Copy(ttr,1,ltt-3),1)) //Сравниваем предпологаемую контрольную сумму абонемента с имеющейся в треке
then result:=Copy(ttr,1,ltt-3) //Если совпадают, то возвращаем номер абонемента
else result:=track; //Если не совпадают, то возвращаем номер как есть (например, если штрихкод - идентификатор специалиста)
end
else //Если последний символ полученного трека - "F", то сравниваем предпоследний с контрольным символом согласно гост на штрихкод Code39
begin
symbolz:=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','-','.',' ','$','/','+','%']; //Таблица контрольных символов Code39
i:=1; summa:=0;
while (i<ltt-1) do //высчитываем данные для получения контрольного символа
begin
summa:=summa+strtoint(Copy(ttr,i,1));
inc(i);
end;
if (Uppercase(Copy(ttr,ltt-1,1))=symbolz[(summa mod 43)]) //Производим сравнение символа полученного в треке и высчитанного контрольного символа
then
begin
if (Copy(ttr,ltt-4,3)=MDCHECKSUM(Copy(ttr,1,ltt-5),1)) //Если совпадают, сравниваем контрольную сумму абонемента
then
result:=Copy(ttr,1,ltt-5) //Если действительно, данный штрихкод -номер абонемента с контрольной суммой абонемента и с контрольным символом Code39, возвращаем номер абонемента
else
result:=Copy(ttr,1,ltt-2) //Иначе возвращаем номер как есть, без контрольного символа Code39 (например, если штрихкод - идентификатор специалиста)
end
else
result:='0'; //Если контрольный символ не совпадает с рассчитаным по госту, возвращаем пустой трек (пресекаем дальнейшую обработку)
end;
end;
begin
end.| Вложение | Размер |
|---|---|
| Печатная форма для отладки разрабатываемого скрипта декодирования | 1.63 КБ |