import socket import sys import serial import os import time import json import string # verify the length and the CRC on received message def mdb_check_received_string(_llsir): if len(_llsir)>3: _lcrc=0 for _li in range(0,len(_llsir)-1): _lcrc=_lcrc ^ _llsir[_li] if _lcrc==_llsir[len(_llsir)-1]: return 1 else: ser.timeout = 0.5 _tmp_clean_buffer = ser.read(100) return 2 else: return 3 # MDB bill validator INIT def mdb_bill_init(): ser.timeout=2 _ltmp_string=[0xFE,0x42,0x01,0xBD] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBBIllInit" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBBIllInit" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBBIllInit" : "failed"}).encode()+b"\n") return False # MDB bill validator ENABLE def mdb_bill_enable(): ser.timeout=2 _ltmp_string=[0xFE,0x42,0x02,0xBE] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBBIllEnable" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBBIllEnable" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBBIllEnable" : "failed"}).encode()+b"\n") return False # MDB bill validator DISABLE def mdb_bill_disable(): ser.timeout=2 _ltmp_string=[0xFE,0x42,0x03,0xBF] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBBIllDisable" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBBIllDisable" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBBIllDisable" : "failed"}).encode()+b"\n") return False # MDB get INTERNAL SETTINGS from bill validator def mdb_bill_get_settings(): ser.timeout=2 _ltmp_string=[0xFE,0x42,0x04,0xB8] ser.write(_ltmp_string) _ltmp_string=ser.read(60) if mdb_check_received_string(_ltmp_string)==1: if len(_ltmp_string)>58: _ljson_string='{"Type": "BillSettigs",' _lfeature_level=str(_ltmp_string[3]) _lcountry_code=hex((_ltmp_string[4]*256)+_ltmp_string[5]) _lscaling_factor=str((_ltmp_string[6]*256)+_ltmp_string[7]) _ldecimal_places=str(_ltmp_string[8]) _lstacker_capacity=str((_ltmp_string[9]*256)+_ltmp_string[10]) if _ltmp_string[13]==0xFF: _lescrow_available="True" else: _lescrow_available="False" _lbill_values=[] for _li in range(14,30): _lbill_values.append(str(_ltmp_string[_li])) _lmanufacturer=_ltmp_string[30:33].decode() _lserial_number=_ltmp_string[33:45].decode() _lserial_model=_ltmp_string[45:57].decode() _lsoftware_version=str((_ltmp_string[57]*256)+_ltmp_string[58]) _ljson_string+='"level": "'+_lfeature_level+'",' _ljson_string+='"CurrencyCode": "'+_lcountry_code[2:]+'",' _ljson_string+='"ScalingFactor": "'+_lscaling_factor+'",' _ljson_string+='"DecimalPlaces": "'+_ldecimal_places+'",' _ljson_string+='"StackerCapacity": "'+_lstacker_capacity+'",' _ljson_string+='"EscrowAvailable": "'+_lescrow_available+'",' _ljson_string+='"BillValues":[' for _li in range(0,len(_lbill_values)-1): _ljson_string+='{"BillValue": "'+_lbill_values[_li]+'"},' _ljson_string+='{"BillValue": "'+_lbill_values[_li]+'"}],' _ljson_string+='"Manufacturer": "'+_lmanufacturer+'",' _ljson_string+='"SerialNumber": "'+_lserial_number+'",' _ljson_string+='"Model": "'+_lserial_model+'",' _ljson_string+='"SWVersion": "'+_lsoftware_version+'"' _ljson_string+='}\n' sock.send(_ljson_string.encode()) return True else: return False else: #print("CRC fail") return False # MDB coin acceptor INIT def mdb_coin_init(): ser.timeout=2 _ltmp_string=[0xFE,0x43,0x01,0xBC] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCoinInit" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCoinInit" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCoinInit" : "failed"}).encode()+b"\n") return False # MDB coin acceptor ENABLE def mdb_coin_enable(): ser.timeout=2 _ltmp_string=[0xFE,0x43,0x02,0xBF] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCoinEnable" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCoinEnable" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCoinEnable" : "failed"}).encode()+b"\n") return False # MDB coin acceptor DISABLE def mdb_coin_disable(): ser.timeout=2 _ltmp_string=[0xFE,0x43,0x03,0xBE] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCoinDisable" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCoinDisable" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCoinDisable" : "failed"}).encode()+b"\n") return False # MDB get INTERNAL SETTINGS from coin acceptor def mdb_coin_get_settings(): ser.timeout=2 _ltmp_string=[0xFE,0x43,0x04,0xB9] ser.write(_ltmp_string) _ltmp_string=ser.read(60) if mdb_check_received_string(_ltmp_string)==1: if len(_ltmp_string)>58: _ljson_string='{"Type": "CoinSettigs",' _lfeature_level=str(_ltmp_string[3]) _lcountry_code=hex((_ltmp_string[4]*256)+_ltmp_string[5]) _lscaling_factor=str(_ltmp_string[6]) _ldecimal_places=str(_ltmp_string[7]) _lcoin_values=[] for _li in range(10,26): if _ltmp_string[_li]==0xFF: _lcoin_values.append("Token") elif _ltmp_string[_li]==0x20: _lcoin_values.append("N/A") else: _lcoin_values.append(str(_ltmp_string[_li])) _lmanufacturer=_ltmp_string[26:29].decode() _lserial_number=_ltmp_string[29:41].decode() _lserial_model=_ltmp_string[41:53].decode() _lsoftware_version=str((_ltmp_string[53]*256)+_ltmp_string[54]) _ljson_string+='"level": "'+_lfeature_level+'",' _ljson_string+='"CurrencyCode": "'+_lcountry_code[2:]+'",' _ljson_string+='"ScalingFactor": "'+_lscaling_factor+'",' _ljson_string+='"DecimalPlaces": "'+_ldecimal_places+'",' _ljson_string+='"CoinValues":[' for _li in range(0,len(_lcoin_values)-1): _ljson_string+='{"CoinValue": "'+_lcoin_values[_li]+'"},' _ljson_string+='{"CoinValue": "'+_lcoin_values[_li]+'"}],' _ljson_string+='"Manufacturer": "'+_lmanufacturer+'",' _ljson_string+='"SerialNumber": "'+_lserial_number+'",' _ljson_string+='"Model": "'+_lserial_model+'",' _ljson_string+='"SWVersion": "'+_lsoftware_version+'"' _ljson_string+='}\n' sock.send(_ljson_string.encode()) return True else: return False else: #print("CRC fail") return False # MDB set maximum credit def mdb_set_max_credit(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBSetMaxCredit": "0"}' return 0 _ljson_string='{"MDBSetMaxCredit": "'+str(_lvalue)+'"}\n' sock.send(_ljson_string.encode()) return _lvalue # MDB set max credit commit def mdb_set_max_credit_ok(_llvalue): ser.timeout=2 _ltmp_string=[0xFE,0x52,0x01] _lmask=0xFF000000 _ldeplasament=24 for _li in range(0,4): _ltmp_byte=_llvalue & _lmask _ltmp_byte = _ltmp_byte >> _ldeplasament _ltmp_string.append(_ltmp_byte) _lmask=_lmask >> 8 _ldeplasament = _ldeplasament - 8 _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBSetMaxCredit" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBSetMaxCredit" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBSetMaxCredit" : "failed"}).encode()+b"\n") return False # MDB set change def mdb_set_change(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBSetChange": "0"}' return 0 _ljson_string='{"MDBSetChange": "'+str(_lvalue)+'"}\n' sock.send(_ljson_string.encode()) return _lvalue # MDB set change commit def mdb_set_change_ok(_llvalue): ser.timeout=2 _ltmp_string=[0xFE,0x52,0x03] _lmask=0xFF000000 _ldeplasament=24 for _li in range(0,4): _ltmp_byte=_llvalue & _lmask _ltmp_byte = _ltmp_byte >> _ldeplasament _ltmp_string.append(_ltmp_byte) _lmask=_lmask >> 8 _ldeplasament = _ldeplasament - 8 _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBSetChangeOK" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBSetChangeOK" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBSetChangeOK" : "failed"}).encode()+b"\n") return False # MDB reset current credit def mdb_credit_reset(): ser.timeout=2 _ltmp_string=[0xFE,0x52,0x02,0xAE] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCreditReset" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCreditReset" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCreditReset" : "failed"}).encode()+b"\n") return False # MDB set current credit def mdb_set_current_credit(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBSetCurrentCredit": "0"}' return 0 _ljson_string='{"MDBSetCurrentCredit": "'+str(_lvalue)+'"}\n' sock.send(_ljson_string.encode()) return _lvalue # MDB set current credit commit def mdb_set_current_credit_ok(_llvalue): ser.timeout=2 _ltmp_string=[0xFE,0x52,0x04] _lmask=0xFF000000 _ldeplasament=24 for _li in range(0,4): _ltmp_byte=_llvalue & _lmask _ltmp_byte = _ltmp_byte >> _ldeplasament _ltmp_string.append(_ltmp_byte) _lmask=_lmask >> 8 _ldeplasament = _ldeplasament - 8 _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBSetCurrentCreditOK" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBSetCurrentCreditOK" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBSetCurrentCreditOK" : "failed"}).encode()+b"\n") return False # MDB POLL def mdb_poll(): ser.timeout=2 _ltmp_string=[0xFE,0x50,0x01,0xAF] ser.write(_ltmp_string) _ltmp_string=ser.read(32) if mdb_check_received_string(_ltmp_string)==1: if len(_ltmp_string)>31: _ljson_string='{"Type": "Poll",' _lcurrent_credit_cash=0 for _li in range(3,7): _lcurrent_credit_cash=_lcurrent_credit_cash << 8 _lcurrent_credit_cash = _lcurrent_credit_cash + _ltmp_string[_li] _lcurrent_credit_cashless=0 for _li in range(7,11): _lcurrent_credit_cashless=_lcurrent_credit_cashless << 8 _lcurrent_credit_cashless = _lcurrent_credit_cashless + _ltmp_string[_li] _lbill_stat = "" _lbill_stat_value=0 for _li in range(11,15): _lbill_stat_value=_ltmp_string[_li] if _lbill_stat_value<10: _lbill_stat+="0"+hex(_lbill_stat_value)[2:] else: _lbill_stat+=hex(_lbill_stat_value)[2:] _lcoin_stat = "" _lcoin_stat_value=0 for _li in range(15,19): _lcoin_stat_value=_ltmp_string[_li] if _lcoin_stat_value<10: _lcoin_stat+="0"+hex(_lcoin_stat_value)[2:] else: _lcoin_stat+=hex(_lcoin_stat_value)[2:] _lcashless_stat = "" _lcashless_stat_value=0 for _li in range(19,23): _lcashless_stat_value=_ltmp_string[_li] if _lcashless_stat_value<10: _lcashless_stat+="0"+hex(_lcashless_stat_value)[2:] else: _lcashless_stat+=hex(_lcashless_stat_value)[2:] _lcashless_id = "" _lcashless_id_value=0 for _li in range(23,27): _lcashless_id_value=_ltmp_string[_li] if _lcashless_id_value<10: _lcashless_id+="0"+hex(_lcashless_id_value)[2:] else: _lcashless_id+=hex(_lcashless_id_value)[2:] _ljson_string+='"CurrentCreditCash": "'+str(_lcurrent_credit_cash)+'",' _ljson_string+='"CurrentCreditCashless": "'+str(_lcurrent_credit_cashless)+'",' _ljson_string+='"BillStat": "'+_lbill_stat+'",' _ljson_string+='"CoinStat": "'+_lcoin_stat+'",' _ljson_string+='"CashlessStat": "'+_lcashless_stat+'",' _ljson_string+='"CashlessID": "'+_lcashless_id+'"' _ljson_string+='}\n' sock.send(_ljson_string.encode()) return True else: return False else: sock.send(json.dumps({"MDBCoinEnable" : "failed"}).encode()+b"\n") return False # MDB reset PMS statuses def mdb_reset_status(): ser.timeout=2 _ltmp_string=[0xFE,0x50,0x02,0xAC] ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBResetStatus" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBResetStatus" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBResetStatus" : "failed"}).encode()+b"\n") return False # MDB cashless INIT def mdb_cashless_init(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessInit": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessInit": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x01] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessInit" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessInit" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessInit" : "failed"}).encode()+b"\n") return False return True # MDB cashless ENABLE def mdb_cashless_enable(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessEnable": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessEnable": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x02] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessEnable" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessEnable" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessEnable" : "failed"}).encode()+b"\n") return False return True # MDB cashless DISABLE def mdb_cashless_disable(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessDisable": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessDisable": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x03] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessDisable" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessDisable" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessDisable" : "failed"}).encode()+b"\n") return False return True # MDB cashless VEDND CANCEL def mdb_cashless_vend_cancel(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessVendCancel": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessVendCancel": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x04] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessVendCancel" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessVendCancel" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessVendCancel" : "failed"}).encode()+b"\n") return False return True # MDB cashless VEND REQUEST def mdb_cashless_vend_request(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessVendRequest": "0"}' return 0 _ljson_string='{"MDBCashlessVendRequest": "'+str(_lvalue)+'"}\n' sock.send(_ljson_string.encode()) return _lvalue # MDB send cashless vend request commit def mdb_cashless_vend_request_ok(_llinput): global _gcashless_vend_request print(_gcashless_vend_request) try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessVendRequestOK": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessVendRequestOK": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x05] _ltmp_string.append(_lvalue) _lmask=0xFF000000 _ldeplasament=24 for _li in range(0,4): _ltmp_byte=_gcashless_vend_request & _lmask _ltmp_byte = _ltmp_byte >> _ldeplasament _ltmp_string.append(_ltmp_byte) _lmask=_lmask >> 8 _ldeplasament = _ldeplasament - 8 _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) print(_ltmp_string) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessVendRequestOK" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessVendRequestOK" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessVendRequestOK" : "failed"}).encode()+b"\n") return False # MDB cashless VEDND SUCCESS def mdb_cashless_vend_success(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessVendSuccess": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessVendSuccess": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x06] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessVendSuccess" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessVendSuccess" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessVendSuccess" : "failed"}).encode()+b"\n") return False return True # MDB cashless VEDND FAILED def mdb_cashless_vend_failed(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessVendFailed": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessVendFailed": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x07] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessVendFailed" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessVendFailed" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessVendFailed" : "failed"}).encode()+b"\n") return False return True # MDB cashless REVALUE def mdb_cashless_revalue(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessRevalue": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessRevalue": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x08] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessRevalue" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessRevalue" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessRevalue" : "failed"}).encode()+b"\n") return False return True # MDB cashless END SESSION def mdb_cashless_end_session(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessEndSession": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessEndSession": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x0A] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(5) if mdb_check_received_string(_ltmp_string)==1: if _ltmp_string[3]==0xFC: sock.send(json.dumps({"MDBCashlessEndSession" : "success"}).encode()+b"\n") return True else: sock.send(json.dumps({"MDBCashlessEndSession" : "failed"}).encode()+b"\n") return False else: sock.send(json.dumps({"MDBCashlessEndSession" : "failed"}).encode()+b"\n") return False return True # MDB get INTERNAL SETTINGS from cashless def mdb_cashless_get_settings(_llinput): try: _lvalue=int(_llinput[_llinput.find("(")+1:_llinput.find(")")]) except: _ljson_string='{"MDBCashlessSettings": "failed"}' return False if (_lvalue!=1) & (_lvalue!=2): _ljson_string='{"MDBCashlessSettings": "failed"}' return False ser.timeout=2 _ltmp_string=[0xFE,0x53,0x09] _ltmp_string.append(_lvalue) _lcrc=0 for _li in range(0,len(_ltmp_string)): _lcrc=_lcrc ^ _ltmp_string[_li] _ltmp_string.append(_lcrc) ser.write(_ltmp_string) _ltmp_string=ser.read(42) if mdb_check_received_string(_ltmp_string)==1: if len(_ltmp_string)>41: _ljson_string='{"Type": "Cashless",' _lfeature_level=str(_ltmp_string[4]) _lcountry_code=hex((_ltmp_string[5]*256)+_ltmp_string[6]) _lscaling_factor=str(_ltmp_string[7]) _ldecimal_places=str(_ltmp_string[8]) _lmanufacturer=_ltmp_string[12:15].decode() _lserial_number=_ltmp_string[15:27].decode() _lserial_model=_ltmp_string[27:39].decode() _lsoftware_version=str((_ltmp_string[40]*256)+_ltmp_string[41]) _ljson_string+='"level": "'+_lfeature_level+'",' _ljson_string+='"CurrencyCode": "'+_lcountry_code[2:]+'",' _ljson_string+='"ScalingFactor": "'+_lscaling_factor+'",' _ljson_string+='"DecimalPlaces": "'+_ldecimal_places+'",' _ljson_string+='"Manufacturer": "'+_lmanufacturer+'",' _ljson_string+='"SerialNumber": "'+_lserial_number+'",' _ljson_string+='"Model": "'+_lserial_model+'",' _ljson_string+='"SWVersion": "'+_lsoftware_version+'"' _ljson_string+='}\n' sock.send(_ljson_string.encode()) return True else: return False else: return False # server parse and execute received message def server_prel_messages(_llsir): global _gmax_credit global _gchange global _gcredit global _gcashless_vend_request try: _lsir=_llsir.decode() except: print("Malformated command") return _lsir=_lsir.upper() # daca e MDBBILLinit if _lsir.find("MDBBILLINIT")!=-1: print("Trying to INIT bill validator... ") if mdb_bill_init(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBBILLENABLE")!=-1: print("Trying to ENABLE bill validator... ") if mdb_bill_enable(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBBILLDISABLE")!=-1: print("Trying to DISABLE bill validator... ") if mdb_bill_disable(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBBILLSETTINGS")!=-1: print("Trying to get INTERNAL SETTINGS from bill validator... ") if mdb_bill_get_settings(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCOININIT")!=-1: print("Trying to INIT coin acceptor... ") if mdb_coin_init(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCOINENABLE")!=-1: print("Trying to ENABLE coin acceptor... ") if mdb_coin_enable(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCOINDISABLE")!=-1: print("Trying to DISABLE coin acceptor... ") if mdb_coin_disable(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCOINSETTINGS")!=-1: print("Trying to get INTERNAL SETTINGS from coin acceptor... ") if mdb_coin_get_settings(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBSETMAXCREDIT(")!=-1: print("Receiving MAX CREDIT... ") _gmax_credit=mdb_set_max_credit(_lsir) print(str(_gmax_credit)) elif _lsir.find("MDBSETMAXCREDITOK")!=-1: print("Trying to set MAX CREDIT to "+str(_gmax_credit)+"... ") if mdb_set_max_credit_ok(_gmax_credit): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCREDITRESET")!=-1: print("Trying to RESET CURRENT CREDIT... ") if mdb_credit_reset(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBSETCHANGE(")!=-1: print("Receiving CHANGE VALUE... ") _gchange=mdb_set_change(_lsir) print(str(_gchange)) elif _lsir.find("MDBSETCHANGEOK")!=-1: print("Trying to RETURN CHANGE... "+str(_gchange)+"... ") if mdb_set_change_ok(_gchange): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBSETCURRENTCREDIT(")!=-1: print("Receiving CURRENT CREDIT... ") _gcredit=mdb_set_current_credit(_lsir) print(str(_gcredit)) elif _lsir.find("MDBSETCURRENTCREDIT")!=-1: print("Trying to set CURRENT CREDIT... "+str(_gcredit)+"... ") if mdb_set_current_credit_ok(_gcredit): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBPOLL")!=-1: print("Trying to POLL MDB IFC... ") if mdb_poll(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBRESETSTATUS")!=-1: print("Trying to RESET PMS STATUSES... ") if mdb_reset_status(): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSINIT(")!=-1: print("Trying to INIT cashless... ") if mdb_cashless_init(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSENABLE(")!=-1: print("Trying to ENABLE cashless... ") if mdb_cashless_enable(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSDISABLE(")!=-1: print("Trying to ENABLE cashless... ") if mdb_cashless_disable(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSVENDCANCEL(")!=-1: print("Trying to VEND CANCEL on cashless... ") if mdb_cashless_vend_cancel(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSVENDREQUEST(")!=-1: print("Receiving VEND REQUEST for cashless... ") _gcashless_vend_request=mdb_cashless_vend_request(_lsir) print(str(_gcashless_vend_request)) elif _lsir.find("MDBCASHLESSVENDREQUESTOK(")!=-1: print("Trying to send VEND REQUEST to cashless... "+str(_gcashless_vend_request)+"... ") if mdb_cashless_vend_request_ok(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSVENDSUCCESS(")!=-1: print("Trying to send VEND SUCCESS to cashless... ") if mdb_cashless_vend_success(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSVENDFAILED(")!=-1: print("Trying to send VEND FAILED to cashless... ") if mdb_cashless_vend_failed(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSREVALUE(")!=-1: print("Trying to send REVALUE to cashless... ") if mdb_cashless_revalue(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSENDSESSION(")!=-1: print("Trying to send END SESSION to cashless... ") if mdb_cashless_end_session(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("MDBCASHLESSSETTINGS(")!=-1: print("Trying to get CASHLESS SETTINGS... ") if mdb_cashless_get_settings(_lsir): print("SUCCESS") else: print("FAIL") elif _lsir.find("BYE")!=-1: sys.exit(0) else: sock.send(json.dumps({"UnknownCommand" : "failed"}).encode()+b"\n") # Main Procedure def MainProcedure(): host = "0.0.0.0" port = 5127 if len(sys.argv)<2: print("You have to give me the serial port as a parameter :-)") sys.exit(1) print("Opening serial port") try: global ser ser=serial.Serial(port=sys.argv[1],baudrate=57600,timeout=2,rtscts=True,xonxoff=False) if ser.isOpen()==False: print("Cannot open serial port") sys.exit(2) except: print("Error opening serial port") sys.exit(3) try: global sock global conn global addr conn = socket.socket() conn.bind((host,port)) conn.listen(1) sock, addr = conn.accept() time.sleep(1) sock.send(json.dumps({"AppName" : "MDBMasterRS232IFC","Version" : "1.08","CreatedBy" : "www.vendingtools.ro"}).encode()+b"\n") except: print("Cannot open socket for listening. Maybe the port is in use.") sys.exit(4) while True: _gsir = sock.recv(1024) if len(_gsir)>3: # parse and execute received command server_prel_messages(_gsir); pass else: # connection closed, wait for the next one conn.listen(1) sock, addr = conn.accept() conn.close() if __name__ == '__main__': MainProcedure()