Архив метки: python

Работа с Атол 55Ф из python, ветка драйверов 10.х

В продолжение предыдущей статьи о работе с Атол чрез python. Там описывалась работа с драйверами из ветки ДТО 9.х Всё хорошо, но в них не поддерживаются «электронные чеки». Собственно из-за чего всё и затевалось у меня. К сожалению работа с драйверами 10.х существенно отличается от 9.х Но к счастью есть ресурс http://integration.atol.ru, в котором достаточно всё хорошо разжевано с примерами. Правда без учета специфики Linux.

Итак, что нужно для того что-бы «поработать» с драйверами в Ubuntu.

1) Штатно установить драйвера deb из папки installer
2) В зависимости от того, скольки битная система, скопировать в папку проекта содержимое linux-86 или linux-x64. Если драйвера установлены верно, то при запуске fptr10_t.sh можно будет увидеть что-то вроде:

3) В архиве с драйверами ищем libfptr10.py и копируем в файл проекта python

4) Далее если мы будем для инициализации драйвера использовать код из примеров вида:

#!/usr/bin/python2
# -*- coding: utf-8 -*-


import sys
import os
from libfptr10 import IFptr


, то получим ошибку:

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

Например:

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)

Кое-что уже выводит:

Вызов скрипта на python из php с передачей произвольных данных

Редко,  но бывает необходимо из скрипта на PHP, вызвать на исполнение скрипт на python с передачей неких параметров и данных.

Мне например понадобилось потому что основной код у меня на PHP,  а вот часть которая отвечает за взаимодействие с онлайн кассой Атол — на python, и переписывать эту часть на PHP нет возможности (без большого гемороя) —  заголовки драйвера Атола под Linux есть только на python (dto9fptr.py и dto9base.py — поставляются в комплекте с драйвером).

Ниже приведен один из способов:

PHP:

<?php

$idkkm= _POST("idkkm");

$sql = "SELECT * FROM online_kkm where id='$idkkm'";
$result = $sqlcn->ExecuteSQL($sql) or die("Не могу выбрать список настроек!" . mysqli_error($sqlcn->idsqlconnection));
$param=array();
$param["mode"]="getinfo";
while ($row = mysqli_fetch_array($result)) {
    $param["ipaddress"] = $row['ipaddress'];
    $param["ipport"] = $row['ipport'];
    $param["model"] = $row['model'];
    $param["accesspass"] = $row['accesspass'];
    $param["userpass"] = $row['userpass'];
    $param["protocol"] = $row['protocol'];
    $param["logfilename"] = $row['logfilename'];
    $param["testmode"] = $row['testmode'];
    $param["libpath"] = $row['libpath'];
    $param["version"] = $row['version'];
    $ppath= $row['ppath'];
};
$jsonparam= base64_encode(json_encode($param));
$command = "/usr/bin/env python $ppath $jsonparam 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

?>

Python:

#!/usr/bin/env python2
#encoding: UTF-8
import sys, json,base64

prm=json.loads(base64.b64decode(sys.argv[1]))

print prm["ipaddress"]

Т.е. что мы сделали?

  1. В скрипте на PHP сформировали json строку с параметрами и закодировали её в base64
  2. Вызвали python скрипт с аргументом в кодированной строки
  3. Python скрипт соответственно обратно декодирует и обрабатывает json

Профит.

Python. Получение списка IP по hostname

Задача: по извесному доменному имени получить список его IP адресов

Решение:

#!/usr/bin/python
# coding=utf-8
import sys
import socket
import dns.resolver

site = "www.google.com"
dns_server = "8.8.8.81"

try:
    resolver = dns.resolver.Resolver()
    resolver.nameservers = [socket.gethostbyname(dns_server)]
    resolver.timeout = 1
    resolver.lifetime = 1
    answer = resolver.query(site, 'A');
    for rdata in answer :
        print rdata.address
except:
    print "Ошибка получения списка IP";

Python и Mysql — получение последнего вставленного ID

Ну проще всего показать на примере:

def InsertUserToForpost(connf,login,passw):
    putlog("*добавляем учетку в Форпост "+str(login));    
    sql="insert into User (ID,IsActive,CanChangeOwnInfo,CreationDate,Login,Password,TypeId) values (null,1,1,now(),%s,MD5(%s),2);";
    cursor = connf.cursor(dictionary=True,buffered=True)
    cursor.execute(sql,[login,passw]);
    connf.commit()
    #получаем ID
    lid=conf.insert_id()
    sql="insert into AccountUser (ID,UserID,AccountID,IsReadOnly) VALUES (null,%s,1,1);";
    cursor = connf.cursor(dictionary=True,buffered=True)
    cursor.execute(sql,[lid]);