Работа с Атол 55Ф из python, ветка драйверов 10.х
В продолжение предыдущей статьи о работе с Атол чрез python. Там описывалась работа с драйверами из ветки ДТО 9.х Всё хорошо, но в них не поддерживаются «электронные чеки». Собственно из-за чего всё и затевалось у меня. К сожалению работа с драйверами 10.х существенно отличается от 9.х Но к счастью есть ресурс http://integration.atol.ru, в котором достаточно всё хорошо разжевано с примерами. Правда без учета специфики Linux.
Итак, что нужно для того что-бы «поработать» с драйверами в Ubuntu.
1) Штатно установить драйвера deb из папки installer
2) В зависимости от того, скольки битная система, скопировать в папку проекта содержимое linux-86 или linux-x64. Если драйвера установлены верно, то при запуске fptr10_t.sh можно будет увидеть что-то вроде:
, то получим ошибку:
1 2 3 4 5 |
root@pavelpc:~/reserved/getcoding/atol/test/ver10# ./kkt_10.py Traceback (most recent call last): File "./kkt_10.py", line 7, in <module> from libfptr10 import IFptr ImportError: dynamic module does not define init function (initlibfptr10) |
На сколько мне, не сильно подкованному в python и cpp, удалось выяснить, проблема в не верно скомпилированном libfptr10.so Возможно в следующих версиях драйвера она уйдет.
А пока, выходом у меня является дописание функционального кода в конце файла libfptr10.py, после описания класса IFptr
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
LIBRARY_PATH = os.path.dirname(os.path.abspath(__file__)) fptr = IFptr(os.path.join(LIBRARY_PATH, "libfptr10.so")) print (fptr) fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_55F)) fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_TCPIP)) fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS, "192.168.0.99") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT,"5555") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_LIBRARY_PATH,"/home/pavel/reserved/getcoding/atol/test/ver10") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_ACCESS_PASSWORD,"0") fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_USER_PASSWORD,"30") res=fptr.applySingleSettings() print (res); fptr.open() isOpened = fptr.isOpened() print ("Opened:"+str(isOpened)); fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS) fptr.queryData() operatorID = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OPERATOR_ID) print (operatorID) logicalNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_LOGICAL_NUMBER) shiftState = fptr.getParamInt(IFptr.LIBFPTR_PARAM_SHIFT_STATE) serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER) modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME) firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION) print (modelName) |
Кое-что уже выводит:
У меня такой рабочий код, файл libfptr10.py в текущем каталоге :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Инициализация драйвера
from libfptr10 import IFptr
import os
fptr = IFptr(os.path.join(‘/usr/lib/’,))
#Настройка драйвера
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_77F))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_TCPIP))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS, «192.168.0.77»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT, «5555»)
fptr.applySingleSettings()
#Установка соединения с ККТ
fptr.open()
#Проверка состояния логического соединения
isOpened = fptr.isOpened()
#Бип
fptr.beep()
for number in range(3): #несколько чеков
#Открытие печатного чека
fptr.setParam(1021, «Иванова О.»)
fptr.setParam(1203, «123456789047»)
fptr.operatorLogin()
#Тип чека:Приход
fptr.setParam(IFptr.LIBFPTR_PARAM_RECEIPT_TYPE, IFptr.LIBFPTR_RT_SELL)
fptr.openReceipt()
#Регистрация позиции без указания суммы налога
fptr.setParam(IFptr.LIBFPTR_PARAM_COMMODITY_NAME, «Услуги «)
fptr.setParam(IFptr.LIBFPTR_PARAM_PRICE, 10)
fptr.setParam(IFptr.LIBFPTR_PARAM_QUANTITY, 1)
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT110)
fptr.registration()
#Оплата чека
fptr.setParam(IFptr.LIBFPTR_PARAM_PAYMENT_TYPE, IFptr.LIBFPTR_PT_CASH)
fptr.payment()
#Регистрация налога на чек
fptr.setParam(IFptr.LIBFPTR_PARAM_TAX_TYPE, IFptr.LIBFPTR_TAX_VAT110)
fptr.receiptTax()
#Регистрация итога чека
fptr.receiptTotal()
#Закрытие полностью оплаченного чека
fptr.closeReceipt()
#Бип
fptr.beep()
#Завершение соединения с ККТ
fptr.close()
#Деинициализация драйвера
del fptr
А ошибка ImportError: dynamic module does not define init function (initlibfptr10) не появляется?
нет. ошибки нет. убунта 14.04.1. на других линуксах такая ошибка была.
ещё скрипт нормально работает на Debian 8.10
Добрый день! У себя в магазине использую автоматизацию учета php pos уже 7 лет, весь товар и аналитика тоже в этой программе. Переходить на другую систему учета не хочется. Видел на форуме, что Вы работали с кассами атол. Прошу Вас доработать мою систему, чтобы была возможность отправлять продажи на кассу атол.
Система учета PHP Point Of Sale написана на php, хранит данные в mysql, сервер на линуксе. Клиент (место кассира) — браузер на убунту, Планировал подключить кассу к рабочему компу кассира.
+7(903)425-zz-zz Роман
#вариант с перебором портов
# -*- coding: utf-8 -*-
import sys
import os
from libfptr10 import IFptr
LIBRARY_PATH = os.path.dirname(os.path.abspath(__file__))
fptr = IFptr(r’/usr/lib/’,)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_USB))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_OFD_CHANNEL, str(IFptr.LIBFPTR_OFD_CHANNEL_PROTO))
fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
print(«Opened:»+str(isOpened))
if isOpened==0:
## print («9) Доступность:»,0)
## exit(1)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_COM))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, «COM1»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, str(IFptr.LIBFPTR_PORT_BR_115200))
res=fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
if isOpened==0:
## print («9) Доступность:»,0)
## exit(1)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_COM))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, «COM2»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, str(IFptr.LIBFPTR_PORT_BR_115200))
res=fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
if isOpened==0:
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_COM))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, «COM3»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, str(IFptr.LIBFPTR_PORT_BR_115200))
res=fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
if isOpened==0:
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_COM))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, «COM4»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, str(IFptr.LIBFPTR_PORT_BR_115200))
res=fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
if isOpened==0:
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_COM))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, «COM5»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, str(IFptr.LIBFPTR_PORT_BR_115200))
res=fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
if isOpened==0:
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_COM))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_COM_FILE, «COM6»)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_BAUDRATE, str(IFptr.LIBFPTR_PORT_BR_115200))
res=fptr.applySingleSettings()
fptr.open()
isOpened = fptr.isOpened()
## exit(1)
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS)
fptr.queryData()
serialNumber = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER)
modelName = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME)
firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION)
smena = fptr.getParamString(IFptr.LIBFPTR_PARAM_SHIFT_STATE)
numberCheck = fptr.getParamString(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER)
dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME)
with open(‘FR_info’, ‘w’, encoding=’utf-8′) as f:
f.write(«00) Время ФР: » + str(dateTime) + ‘\n’)
f.write («01) Модель ФР: » + str(modelName) + ‘\n’)
f.write(«02) Номер ФР: » + str(serialNumber) + ‘\n’)
f.write(«03) Прошивка: » + str(firmwareVersion) + ‘\n’)
if smena == «0»:
f.write(«04) Смена: Закрыта» + ‘\n’)
if smena == «1»:
f.write(«04) Смена: Открыта» + ‘\n’)
f.write(«05) Номер чека: » + str(numberCheck) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_REG_INFO)
fptr.fnQueryData()
organizationName = fptr.getParamString(1048)
ffdVersion = fptr.getParamInt(1209)
ofdVATIN = fptr.getParamString(1017)
adress_mag = fptr.getParamString(1009)
ofdName = fptr.getParamString(1046)
regNumberFN = fptr.getParamString(1037)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«06) Организация: » + str(organizationName) + ‘\n’)
f.write(«07) Адрес магазина: » + str(adress_mag) + ‘\n’)
f.write(«08) ОФД: » + str(ofdName) + ‘\n’)
f.write(«08_1) ИНН ОФД» + str(ofdVATIN) + ‘\n’)
f.write(«09) Версия ФФД: » + str(ffdVersion) + ‘\n’)
f.write(«10) Регномер ФН: » + str(regNumberFN) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_FN_INFO)
fptr.fnQueryData()
fnSerial = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER)
fnExhausted = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_RESOURCE_EXHAUSTED)
fnMemoryOverflow = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_MEMORY_OVERFLOW)
fnOfdTimeout = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_OFD_TIMEOUT)
fnCriticalError = fptr.getParamBool(IFptr.LIBFPTR_PARAM_FN_CRITICAL_ERROR)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«11) Номер ФН: » + str(fnSerial) + ‘\n’)
f.write(«12) Пямять ФН переполнена:» + str(fnMemoryOverflow) + ‘\n’)
f.write(«13) Исчерпан ресурс ФН: » + str(fnExhausted) + ‘\n’)
f.write(«14) Критическая ошибка ФН: » + str(fnCriticalError) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_OFD_EXCHANGE_STATUS)
fptr.fnQueryData()
exchangeStatus = fptr.getParamInt(IFptr.LIBFPTR_PARAM_OFD_EXCHANGE_STATUS)
unsentCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT)
firstUnsentNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER)
ofdMessageRead = fptr.getParamBool(IFptr.LIBFPTR_PARAM_OFD_MESSAGE_READ)
dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
if exchangeStatus == 0:
f.write(«15) Статус обмена с ОФД: соединение установлено» + ‘\n’)
if exchangeStatus == 1:
f.write(«15) Статус обмена с ОФД: есть сообщение для передачи в ОФД» + ‘\n’)
if exchangeStatus == 2:
f.write(«15) Статус обмена с ОФД: ожидание ответного сообщения от ОФД» + ‘\n’)
if exchangeStatus == 3:
f.write(«15) Статус обмена с ОФД: есть команда от ОФД» + ‘\n’)
if exchangeStatus == 4:
f.write(«15) Статус обмена с ОФД: изменились настройки соединения с ОФД» + ‘\n’)
if exchangeStatus == 5:
f.write(«15) Статус обмена с ОФД: ожидание ответа на команду от ОФД» + ‘\n’)
f.write(«16) Количество неотправленных чеков: » + str(unsentCount) + ‘\n’)
f.write(«17) Номер первого неотправленного документа: » + str(firstUnsentNumber) + ‘\n’)
f.write(«18) Флаг наличия сообщения для ОФД: » + str(ofdMessageRead) + ‘\n’)
f.write(«19) Первый неотправленный документ: » + str(dateTime) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_LAST_SENT_OFD_DOCUMENT_DATE_TIME)
fptr.queryData()
dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«20) Последний успешный обмен с ОФД: » + str(dateTime) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_VALIDITY)
fptr.fnQueryData()
dateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«21) Дата окончания ФН: » + str(dateTime) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_ERRORS)
fptr.fnQueryData()
networkErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_NETWORK_ERROR_TEXT)
ofdErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_OFD_ERROR_TEXT)
fnErrorText = fptr.getParamString(IFptr.LIBFPTR_PARAM_FN_ERROR_TEXT)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«22) Ошибка сети: » + str(networkErrorText) + ‘\n’)
f.write(«23) Ошибка ОФД: » + str(ofdErrorText) + ‘\n’)
f.write(«24) Ошибка ФН: » + str(fnErrorText) + ‘\n’)
#установка адреса ОФД
##fptr.setParam(IFptr.LIBFPTR_PARAM_SETTING_ID, 273)
##fptr.setParam(IFptr.LIBFPTR_PARAM_SETTING_VALUE, «gate.ofd.ru»)
##fptr.writeDeviceSetting()
#считать даные ОФД
fptr.setParam(IFptr.LIBFPTR_PARAM_SETTING_ID, 273)
fptr.readDeviceSetting()
settingValue = fptr.getParamString(IFptr.LIBFPTR_PARAM_SETTING_VALUE)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«25) Адрес ОФД: » + str(settingValue) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_SETTING_ID, 274)
fptr.readDeviceSetting()
settingValue = fptr.getParamString(IFptr.LIBFPTR_PARAM_SETTING_VALUE)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
f.write(«26) Порт ОФД: » + str(settingValue) + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_SETTING_ID, 276)
fptr.readDeviceSetting()
settingValue = fptr.getParamString(IFptr.LIBFPTR_PARAM_SETTING_VALUE)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
if settingValue == «1»:
f.write(«27) Канал обмена: EoU» + ‘\n’)
if settingValue == «2»:
f.write(«27) Канал обмена: Ethernet» + ‘\n’)
if settingValue == «5»:
f.write(«27) Канал обмена: EoT» + ‘\n’)
fptr.setParam(IFptr.LIBFPTR_PARAM_SETTING_ID, 239)
fptr.readDeviceSetting()
settingValue = fptr.getParamString(IFptr.LIBFPTR_PARAM_SETTING_VALUE)
with open(‘FR_info’, ‘a’, encoding=’utf-8′) as f:
if settingValue == «0»:
f.write(«28) Подключение: COM» + ‘\n’)
if settingValue == «4»:
f.write(«28) Подключение: USB» + ‘\n’)
f.close()
fptr.close()
del fptr