Я пытаюсь написать простую программу на Python (используя эту обертку: https://github.com/gotthardp/python-mercuryapi), которая может хранить свойства rfid. Я сделал это успешно, используя словарь, но я хотел бы создать свой собственный класс, чтобы я мог добавить больше информации в класс, а не просто ключ и значение, как в случае со словарем Python. В качестве «ключа» используется тег epc (электронный код продукта), а используется значение rssi (сила сигнала) в качестве «значения» в словаре.
Это мой код, таким образом:
# Importing modules
from __future__ import print_function
import time
import mercury
# Variables
protocol = "GEN2"
region = "EU3"
reader_power = 2000
count = 0
all_reads = {}
final_reads = []
# Trying different USB connections for the RFID-reader, gives an error if nothing is found
try:
reader = mercury.Reader("tmr:///dev/ttyACM1", baudrate=115200)
except TypeError:
try:
reader = mercury.Reader("tmr:///dev/ttyACM0", baudrate=115200)
except TypeError:
reader = mercury.Reader("tmr:///dev/ttyAMA0", baudrate=115200)
except:
raise TypeError('RFID-reader not found, check ls /dev/')
def test_func(tag):
if str(tag.epc) not in all_reads.keys():
all_reads[str(tag.epc)] = int(tag.rssi)
else:
if int(tag.rssi) > all_reads[str(tag.epc)]:
print("should update for epc = ", tag.epc, "old rssi = ", all_reads[str(tag.epc)], "with new rssi = ", tag.rssi)
all_reads.update({str(tag.epc): int(tag.rssi)})
# Mandatory sets for the reader
reader.set_region(region) # Setting the correct region
reader.set_read_powers([1, 2], [reader_power, reader_power]) # Setting the reader power
reader.set_read_plan([1, 2], protocol) # Setting the correct RFID-reading protocol
#Start rfid Reading
reader.start_reading(lambda tag: test_func(tag))
time.sleep(5)
reader.stop_reading()
print(all_reads)
Большинство частей кода на самом деле не так интересны, они просто обязательные части, чтобы rfid-reader мог функционировать. Как импорт правильных библиотек, попытка подключения к правильному USB-устройству и т. Д. Определение функции: test_func (tag) - это место, где логика действительно начинается. Сначала проверяется, доступен ли вновь прочитанный epc в качестве ключа в словаре all_reads. Если он недоступен, то epc добавляется в качестве ключа в сочетании со значением rssi в качестве значения для словаря. Если epc уже есть в словаре, то программа проверяет, найдено ли новое лучшее значение rssi, и обновляет словарь, если это так. Это выводит что-то вроде:
should update for epc = b'E20000000000000000000003' old rssi = -46 with new rssi = -45
should update for epc = b'E20000000000000000000000' old rssi = -50 with new rssi = -49
should update for epc = b'E20000000000000000000002' old rssi = -41 with new rssi = -40
should update for epc = b'E20000000000000000000001' old rssi = -36 with new rssi = -35
should update for epc = b'E20000000000000000000000' old rssi = -49 with new rssi = -47
should update for epc = b'E20000000000000000000000' old rssi = -47 with new rssi = -43
{"b'E20000000000000000000003'": -45, "b'E20000000000000000000002'": -40, "b'E20000000000000000000000'": -43, "b'E20000000000000000000001'": -35}
Это все работает нормально, вы получаете один объект с отдельным epc с лучшим значением rssi, но я хотел бы иметь возможность добавить больше информации для каждого "ключа" epc. Поэтому я подумал, что решением будет создание моего собственного класса. Я попытался воссоздать ранее описанное поведение кода с помощью собственного класса: это моя попытка сделать это:
class tags:
def __init__(self, epc, rssi):
self.epc = epc
self.rssi = rssi
Как я мог воссоздать поведение с помощью самодельного класса? Хранить классы тегов таким же образом, как со словарем?
Любая помощь очень ценится!