同一RFID标签在RC522与便携式阅读器读取ID不一致求助
RFID阅读器ID转换问题
我在全网查找相关信息,已在Stack Overflow搜索类似议题但未能解决。我的RC522 RFID模块连接在Raspberry PI4上,扫描标签得到ID:397829713198;使用便携式阅读器扫描同一标签得到ID:2910822492。我尝试过转十六进制、排列组合、反转、转二进制等操作均无效,请问如何通过便携式阅读器的ID得到树莓派读取的ID?
树莓派侧读取代码
import RPi.GPIO as GPIO from mfrc522 import SimpleMFRC522 import time import multiprocessing GPIO.setwarnings(False) reader = SimpleMFRC522() max_runtime = 10 # 最大运行时间(秒) def read_rfid(): try: id, text = reader.read() print(id) except KeyboardInterrupt: pass def main(): start_time = time.time() rfid_process = multiprocessing.Process(target=read_rfid) rfid_process.start() while rfid_process.is_alive(): current_time = time.time() elapsed_time = current_time - start_time if elapsed_time >= max_runtime: rfid_process.terminate() rfid_process.join() break if __name__ == "__main__": try: main() finally: GPIO.cleanup()
转换方法
两个ID的差异源于读取的字节范围和端序不同,具体转换步骤如下:
- 将便携式阅读器ID转十六进制
把2910822492转为十六进制:B08A8C5C(拆分后是0xB0 0x8A 0x8C 0x5C) - 补全RC522读取的完整UID
RC522会读取4字节UID+1字节校验位(校验位是前4字节的异或值),计算校验位:0xB0 ^ 0x8A ^ 0x8C ^ 0x5C = 0x0A,完整字节序列为B0 8A 8C 5C 0A - 反转字节序列并转十进制
反转字节得到0A 5C 8C 8A B0,将该十六进制串转为十进制,结果就是397829713198,与树莓派读取的ID一致。
验证转换的Python代码
portable_id = 2910822492 # 转8位十六进制字符串 hex_str = f"{portable_id:08X}" # 拆分每两个字符为一个字节 bytes_list = [hex_str[i:i+2] for i in range(0, 8, 2)] # 计算校验位 checksum = hex(int(bytes_list[0],16) ^ int(bytes_list[1],16) ^ int(bytes_list[2],16) ^ int(bytes_list[3],16))[2:].upper().zfill(2) # 拼接反转后的字节和校验位并转十进制 full_hex = "".join([checksum] + bytes_list[::-1]) pi_id = int(full_hex, 16) print(f"转换后的树莓派读取ID:{pi_id}")
内容的提问来源于stack exchange,提问作者thesimon
相关产品推荐
相关产品推荐

