Чтение тегов UID с RC522 и USB SERIAL в Python с RPi2 - PullRequest
1 голос
/ 28 июня 2019

У меня есть RPi2 (Python 2.7) с двумя считывателями RFID.Один считыватель - это USB SERIAL hex Gigatek MF7 (подключенный к последовательному порту), а другой - RFID-RC522 (подключенный к выводам GPIO).RC522 подключен правильно, следуя инструкциям на pimylifeup.com / raspberry-pi-rfid-rc522 .Оба читателя работают и читают теги, но их выходные строки различаются для одного и того же тега.

Я знаю структуру данных (Serial ASCII) и скорость передачи: 9600, N, 8,1, для чтения из Gigatek - ссылка .Мой сценарий читает строку из 12 символов из последовательного порта и извлекает из нее UID reply_rfid_1[1:9]:

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

"""
Convenient python function to read RFID tags with GIGATEK MF7

Created by B.Parovel on 3. 7. 2019
Last modified on 3. 7. 2019
"""

############################

#from collections import defaultdict
#import csv
import sys
import serial
import time
from datetime import datetime



# define variables
global value_rfid, reply_rfid, refTime



# assign values
refTime = datetime.now()



# open the serial port /dev/ttyUSB1 and check if the port is really open
rfid_port_1 = serial.Serial("/dev/ttyUSB1", 9600)    # omit if not in use
print 'rfid_read.py -> rfid reader on port', rfid_port_1.name
rfid_port_1.isOpen()



def Read_Tag():
    # define variables
    global value_rfid_1, reply_rfid_1, tag

    # read port
    while int((datetime.now()-refTime).seconds) < 5:
        if (rfid_port_1.inWaiting() > 0):
            reply_rfid_1 = rfid_port_1.read(12)
            value_rfid_1 = str(reply_rfid_1[1:9])
            tag = str(value_rfid_1)
            print 'rfid_read.py -> tag hex', tag
            tag = int(tag, 16)
            print 'rfid_read.py -> tag dec ', tag
            break
        else:
            tag = None
    return tag



def Output_Tag():
    if tag == None:
        print 'rfid_read.py -> no tag'



def Flush_Port():
    rfid_port_1.flushInput()        # Clear input buffer
    time.sleep(0.1)



Read_Tag()
Output_Tag()
Flush_Port()
exit()

Для чтения из RC522 я использую следующий код:

reader = SimpleMFRC522()

print("Hold a tag near the reader")

try:
    id, text = reader.read()
    print(id)
    print(text)

finally:
    GPIO.cleanup()

Я могу определить длину и числовой формат строки, выходящей из читателя SERIAL, но я не могу сделать это для RC522.Я нашел некоторую информацию о библиотеках на этих страницах github.com / mxgxw / MFRC522-python , github.com / pimylifeup / MFRC522-python , но не смог расшифровать структуру данныхБлок вывода, и я был бы очень признателен за помощь в этом вопросе.

ОБНОВЛЕНИЕ 1. 7. 2019

Как предлагается ниже, два выхода и состояние SPI.

Выход считывателя USB представлен в числовом формате HEX и DEC:

pi@raspberrypi:~/Desktop/Biovalley $ python rfid_read.py
rfid_read.py -> rfid reader on port /dev/ttyUSB1
rfid_read.py -> tag hex AC8C5E0A
rfid_read.py -> tag dec  2894880266

Выход считывателя RC522 для того же тега:

pi@raspberrypi:~/Desktop/Biovalley $ python rfidreader.py 
Hold a tag near the reader
44535950452

Статус SPI:

pi@raspberrypi:~/Desktop/Biovalley $ lsmod | grep spi
spidev                 20480  0
spi_bcm2835            20480  0

1 Ответ

0 голосов
/ 10 июля 2019

Я попробовал другой подход, следуя инструкциям на raspberrypi-spy.co.uk / 2018/02 / rc522-rfid-tag-read-raspberry-pi с использованием библиотеки github.ком / mxgxw / MFRC522-питон .Выходной UID, использующий эту библиотеку для имеющегося у меня тега:

Card read UID: 86,209,188,187

В то время как выходной UID считывателя GIGATEK MF7 с тем же тегом:

hex: BBBCD156
dec: 3149713750

ЗАКЛЮЧЕНИЕ11. 7. 2019 Вывод с использованием библиотеки MFRC522-python правильный, но перевернут и не в правильном числовом формате:

BB BC D1 56 = 187 188 209 86

Поэтому я изменил скрипт чтения UID тега Read.py, которыйпоставляется с файлами библиотеки, чтобы преобразовать вывод в десятичное число, как я хотел:

86 209 188 187 -> 56 D1 BC BB -> 3149713750

Рабочий скрипт:

def Read_Bag_Tag(self):
    # read with MFRC522 on GPIO
    # define variables
    global value_rfid_2, reply_rfid_2, bag_tag, refTime

    # assign values
    refTime = datetime.now()

    # Create an object of the class MFRC522
    MIFAREReader = MFRC522.MFRC522()

    # read port
    while int((datetime.now()-refTime).seconds) < 5:
        # Scan for cards    
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

        # If a card is found
        if status == MIFAREReader.MI_OK:
            print "Card detected"

        # Get the UID of the card
        (status,uid) = MIFAREReader.MFRC522_Anticoll()

        # If we have the UID, continue
        if status == MIFAREReader.MI_OK:

            # Print UID
            print "bag tag UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
            bag_tag_endian = (uid[3], uid[2], uid[1], uid[0])
            print 'bag tag endian:', bag_tag_endian
            bag_tag_hex = hex(uid[3]), hex(uid[2]), hex(uid[1]), hex(uid[0])
            print 'bag tag hex:', bag_tag_hex
            bag_tag_str = str(hex(uid[3])[2:]), str(hex(uid[2])[2:]), str(hex(uid[1])[2:]), str(hex(uid[0])[2:])
            print "bag tag hex string:", bag_tag_str
            bag_tag_str = str(hex(uid[3])[2:])+str(hex(uid[2])[2:])+str(hex(uid[1])[2:])+str(hex(uid[0])[2:])
            print "bag tag hex string concatenated:", bag_tag_str
            bag_tag = int(bag_tag_str, 16)
            print 'bag tag dec:', bag_tag

            # This is the default key for authentication
            key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]

            # Select the scanned tag
            MIFAREReader.MFRC522_SelectTag(uid)

            # Authenticate
            status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)

            # Check if authenticated
            if status == MIFAREReader.MI_OK:
                MIFAREReader.MFRC522_Read(8)
                MIFAREReader.MFRC522_StopCrypto1()
            else:
                print "Authentication error"

    GPIO.cleanup()      # Clear input buffer
    time.sleep(0.1)
    return bag_tag
...