Тут будет структурная схема
1. Добавлен новый алгоритм декодирования
CardDecodeType = FastScript
Алгоритм декодирования программируется в функции decodecard во внешнем файле, задаваемым параметром fsUnit в секции [frf].
В секции [frf] появился параметр
fsUnit=fsdecodecard.upasfunction fsUnitVersion:integer; begin result := 1; end; function DecodeCard(Track:string; var Code:integer):string; begin Result := Track; end; begin end.
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 КБ |
TcpCardReader.ini
[TCP] PORT=7760 IP=0.0.0.0 [READER1] COMPORT=9 COMPORTPARAMS=baud=4800 data=8 parity=N stop=1 Prefix=; Postfix=?
[general] usemask=1 [mask] card_em = E* [cards.Card_em] code=2 CardDecodeType = MASK mask=*****dddddddd*
[general] usemask=1 [mask] card=* [cards] [cards.Card] CardDecodeType = mask mask=dddddddd code=2
[TCPCardReader] PORT=7760 HOST=127.0.0.1 UseTCPCardReader=1
Например, из трека полученного с кардридера: Em-Marine[5605] 185,05453 получить идентификатор 18505453.
TcpCardReader.ini
[TCP] PORT=7760 IP=0.0.0.0 [READER1] COMPORT=3 COMPORTPARAMS=baud=9600 data=8 parity=N stop=1 ;Параметр Prefix задаёт строку, которая передаётся клиентам перед первым прочтенным символом Prefix=; ;Параметр Postfix задаёт строку, которая передаётся клиентам после последнего прочтенного символа Postfix=? ;Использовать decodecards.dll useDecodeCards=1 StartTermChars=M FinishTermChars=#13;#10;#0;
[mask] card = arine[* [cards.Card] ExcludedPrefix=arine[ code=2 CardDecodeType = LAST8
[general] usemask=1 [mask] card=* [cards] [cards.Card] CardDecodeType = mask mask=dddddddd code=2
[TCPCardReader] PORT=7760 HOST=127.0.0.1 UseTCPCardReader=1
[general] usemask=1 TrackResultLog= [mask] card = e* [cards.Card] ExcludedPrefix=e code=2 CardDecodeType = MASK mask=****dddddddd*
Например, преобразовываем трек полученный с считывателя: Mifare [40CD941F] 205,37919 1K (0004,08) в следующий вид: 1087214623 (значение из квадратных скобок в десятичном представлении)
TcpCardReader.ini
[TCP] PORT=7760 IP=0.0.0.0 [READER1] COMPORT=3 COMPORTPARAMS=baud=9600 data=8 parity=N stop=1 ;Параметр Prefix задаёт строку, которая передаётся клиентам перед первым прочтенным символом Prefix=; ;Параметр Postfix задаёт строку, которая передаётся клиентам после последнего прочтенного символа Postfix=? ;Использовать decodecards.dll useDecodeCards=1 StartTermChars=#$5D FinishTermChars=?#13;#10;#0;
[mask] card = * [cards.Card] code=2
[general] usemask=1 [mask] card=* [cards] [cards.Card] code=2
[TCPCardReader] PORT=7760 HOST=127.0.0.1 UseTCPCardReader=1
[general] usemask=1 TrackResultLog= [mask] card = * [cards.Card] code=2 CardDecodeType = MASK mask=hhhhhhhh*