Repository navigation
Expand file tree
/
Copy pathreader_cmd_utils.py
More file actions
50 lines (40 loc) · 1.7 KB
/
Copy pathreader_cmd_utils.py
File metadata and controls
50 lines (40 loc) · 1.7 KB
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import dataclasses
from ber_tlv.tlv import Tlv
from reader_connection import ReaderConnection
@dataclasses.dataclass
class DeviceInfo:
cmd_return: bytes
base_firmware_version: str
base_firmware_version_int: int
battery_state: int
display_text_version: bytes
emv_cfg: bytes
emvl1_kernel_version: str
emvl2_kernel_version: str
max_payload_size: str
part_number: bytes
svpp_software_version: str
svpp_software_version_int: int
terminal_serial_number: str
async def get_device_info(conn: ReaderConnection) -> DeviceInfo:
response = await conn.exchange_command(b"\x01\x01\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF")
tlv = {key: value for key, value in Tlv.parse(response[5:], verbose=True)}
def parse_version(value):
return f"{value[0]}.{value[1]}.{value[2]}.{value[3]}"
return DeviceInfo(
cmd_return=response,
svpp_software_version=parse_version(tlv[193]),
svpp_software_version_int=int.from_bytes(tlv[193], byteorder="big"),
emvl1_kernel_version=parse_version(tlv[194]),
emvl2_kernel_version=tlv[195].decode("ASCII"),
emv_cfg=tlv[196],
part_number=tlv[198],
terminal_serial_number=f"{(int.from_bytes(tlv[199], byteorder='big') >> 2):012}",
display_text_version=tlv[200],
max_payload_size=tlv[202][0] << 8 | tlv[202][1],
battery_state=tlv[204][0],
base_firmware_version=parse_version(tlv[206]),
base_firmware_version_int=int.from_bytes(tlv[206], byteorder="big"))
async def echo(conn: ReaderConnection, b: bytes):
response = await conn.exchange_command(b"\x01\xFE" + len(b).to_bytes(2, byteorder="big") + b)
print(response)