Управление на фискален принтер от браузера

Бих искал да споделя моя опит с една задача, която трябваше да свърша на работа  по един проект. Проектът представлява billing софтуер и имаше нужда от възможност за печат на касови бележки. Има няколко начина за справяне със задачата – създаване на XPCOMM добавка за FireFox, използване на activeX control (поддържащ само IE) и Java Applet. Разучих
първите два подхода и изглеждаше, че нито единия не поддържа всички браузери и среди. Datecs FP 550-05 е фискалния принтер, който имах на разположение. Той има комуникационен протокол и върви заедно с готов за ползване dll фаил, а това предполага използането на ActiveX. За съжаление нямам никакъв опит с разработката на такива компоненти и този подход просто се оказа по сложен и труден за мен. Това е и причината да го отхвърля.

Разработката на XPCOMM разширение за FireFox е интересно нещо , в което да задълбаеш, но аз нямах време за това точно в този момент. Отхвълих и този вариант.

Затова реших да използвам Java и намерих един много полезен готов за ползване applet ето тук – JavaScript Serial. Има добри пояснения за използването на applet-а, но аз все пак съм си нууб като стане въпрос за Java. Всъщност я мразя и никога не съм се чувствал комфортно програмирайки на Java. Затова в допълнение бих добавил някои неща, за да подкарате правилно applet-a:

  • след инициализация на applet-а използвайте setTimeout за около секунда преди отварянето на порта иначе хвърля грешка
  • изпрограмирайте го така, че порта да бъде затворен след използването му. Ако не, ще трябва да си затворите браузера.

Останалото е просто имплементация на протокола на устройството, което ще поддържате. За FP 550 протокола не беше много ясно описан, но пък върви заедно с една апликация за изпращане на прости команди към принтера. Потърсих програмка, която може да подслушва портовете, но нямаше нищо, което да върши работа освен Advanced Serial Data Logger. Тя е безплатна за пробен период, което абсолютно ме устройва :) . И така аз си я инсталирах и зпочнах да декодирам съобщенията към принтера. По този начин се запознах по-добре с протокола и изясних нещата, които не разбирах от описанието.

Искам също да отбележа една критична част от разработката. Пиша по порта директно по битове и поради това имах проблем с кирилските символи. Страницата е в utf-8 и аз използвам функция ,която генерира нужните битове от стринг:


function stringToBytes ( str )
{
  var ch, st, re = [];
  for (var i = 0; i < str.length; i++ )
  {
    ch = str.charCodeAt(i);  // get char
    if(ch >= 1040 && ch <= 1103)
    {
       re = re.concat( [ch - 912] );
    }
    else
    {
        st = [];                 // set up "stack"
        do {
        st.push( ch & 0xFF );  // push byte to stack
        ch = ch >> 8;          // shift value down by 1 byte
    }
    while ( ch );
    // add stack contents to result
    // done because chars have "wrong" endianness
    re = re.concat( st.reverse() );
   }
 }
 // return an array of bytes

 return re;
}

Намерих тази функция  в stackoverflow, но трябваше да я модифицирам заради споменатия проблем. Отместването от 912 е при utf8, но при друг енкодинг може да е различно.

Прочети статията на: English

  1. Все още няма коментари.

  1. Все още няма нито един trackback.