Enclose rfid reading

This commit is contained in:
2025-12-26 17:06:42 +01:00
parent 126a266321
commit d4aae20bd0
10 changed files with 98 additions and 31 deletions

63
rpi/hardware/rfid/main.py Normal file
View File

@@ -0,0 +1,63 @@
#!/usr/bin/env python3
from collections.abc import Callable
from threading import Thread
import threading
from serial import Serial
class RfidReader:
__serial : Serial = None
__thread : Thread | None = None
__listeners : list[Callable] = None
def __init__(self, port : str, baudrate: int):
self.__serial = Serial(port, baudrate)
self._run_event = threading.Event()
self.__listeners = []
def start(self) -> None:
self._run_event.set()
if self.__thread is None or not self.__thread.is_alive():
self.__thread = Thread(target=self.__read, daemon=True)
self.__thread.start()
def stop(self) -> None:
if self._run_event.is_set():
self._run_event.clear()
def subscribe(self, listener : Callable) -> None:
self.__listeners.append(listener)
def __notify(self, uid : int):
for listener in self.__listeners:
listener(uid)
def __read(self):
while self._run_event.is_set():
data = b""
while len(data) < 14 and self._run_event.is_set():
character = self.__serial.read(1)
if not character: continue
data += character
if len(data) >= 11:
hex_value = data[5:11].decode(errors='ignore')
try:
res = int(hex_value, 16)
self.__notify(res)
except ValueError:
print("Invalid hex:", hex_value)
else:
print("Received incomplete data:", data)
if __name__ == "__main__":
def callback(uid):
print("UID:", uid)
reader = RfidReader("/dev/serial0", 9600)
reader.subscribe(callback)
reader.start()

View File

@@ -14,4 +14,6 @@ opencv-python
numpy
ultralytics
torch
flask
flask
paho-mqtt
grovepi

View File

@@ -1,30 +0,0 @@
#!/usr/bin/env python3
import serial
import time
from grovepi import *
ser = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=1)
ser.flush()
while True:
data = b""
print(data)
while len(data) < 14:
c = ser.read(1)
if c:
data += c
else:
continue
if len(data) >= 11:
hex_value = data[5:11].decode(errors='ignore')
try:
res = int(hex_value, 16)
print(res)
except ValueError:
print("Invalid hex:", hex_value)
else:
print("Received incomplete data:", data)

View File

@@ -0,0 +1,32 @@
import paho.mqtt.client as mqtt
import json
import time
class MQTTService:
address : str = None
port : int = None
def __init__(self, address : str, port : int):
self.address = address
self.port = port
def publish(self, client_id : str, topic: str, data: bytes, qos: int = 0):
client = mqtt.Client(client_id=client_id)
try :
client.connect(self.address, self.port)
payload = {
"timestamp": int(time.time()),
"data": data,
}
client.publish(topic, json.dumps(payload), qos)
except Exception as e:
print(e)
finally:
client.loop_stop()
client.disconnect()
if __name__ == "__main__":
pass