среда, 20 августа 2014 г.

CCNET. Работа с купюроприемником

Есть желание поработать с купюроприемниками Cashcode, NV? Существует-ли API к ним? Конечно же есть, CCNET SDK Kit. Но прежде чем радостно прыгать от счастья, внимательно изучите  документацию на ваш купюроприемник. CCNET в основном используется кэшкодовцами, тот самый BI-Directional Protocol. Далее под катом...

Последовательность действий следующая:
  1. Получить дескриптор COM-порта.
  2. Получить указатель на DCB-структуру для настройки порта.
  3. Установить новые параметры DCB.
  4. Послать установленные параметры в порт.
  5. Приступить к чтению принимаемых данных.
Если формат пакета принятых данных соответствует протоколу, в нашем случае (FL BDP Interface), то к примеру пакет:
 0х02 - синхронизация
 0х03 - адрес девайса
 0х06 - длина сообщения
 0х30 - команда
 0х41 - Hi CRC
 0хВ3 - Lo CRC
Расчет контрольной суммы, не что иное как CRC16:
function GetCRC16(InData: array of byte; DataLng: word): word;
var i,TmpCRC: word;
    j: byte;
begin
result:=0;
for i:=0 to (DataLng-1) do
 begin
  TmpCRC:=result xor InData[i];
  for j:=0 to 7 do
   begin
    if (TmpCRC and $0001)<>0 then
     begin
      TmpCRC:=TmpCRC shr 1;
      TmpCRC:=TmpCRC xor _CR_CCNET_CRC_POLY;
     end
                        else
     TmpCRC:=TmpCRC shr 1; 
   end;
  result:=TmpCRC;
 end;
end;
CRC16 на C#:
using System;

public class Crc16 {
    const ushort polynomial = 0xA001;
    ushort[] table = new ushort[256];

    public ushort ComputeChecksum(byte[] bytes) {
        ushort crc = 0;
        for(int i = 0; i < bytes.Length; ++i) {
            byte index = (byte)(crc ^ bytes[i]);
            crc = (ushort)((crc >> 8) ^ table[index]);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes(byte[] bytes) {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }

    public Crc16() {
        ushort value;
        ushort temp;
        for(ushort i = 0; i < table.Length; ++i) {
            value = 0;
            temp = i;
            for(byte j = 0; j < 8; ++j) {
                if(((value ^ temp) & 0x0001) != 0) {
                    value = (ushort)((value >> 1) ^ polynomial);
                }else {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table[i] = value;
        }
    }
}
Если CRC верна, то следует команда перезагрузки  и инициализации купюроприемника. Вуа-ля!

пример работы по CCNET

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.