From d4aae20bd0f2ffe024725669841d3fa42b877fd6 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 26 Dec 2025 17:06:42 +0100 Subject: [PATCH] Enclose rfid reading --- rpi/{scripts => hardware}/__init__.py | 0 rpi/{scripts => hardware}/rfid/__init__.py | 0 rpi/hardware/rfid/main.py | 63 +++++++++++++++++++ rpi/{scripts => hardware}/timer/__init__.py | 0 .../timer/grove_rgb_lcd.py | 0 rpi/{scripts => hardware}/timer/led.py | 0 rpi/{scripts => hardware}/timer/main.py | 0 rpi/requirements.txt | 4 +- rpi/scripts/rfid/main.py | 30 --------- rpi/services/mqtt_service.py | 32 ++++++++++ 10 files changed, 98 insertions(+), 31 deletions(-) rename rpi/{scripts => hardware}/__init__.py (100%) rename rpi/{scripts => hardware}/rfid/__init__.py (100%) create mode 100644 rpi/hardware/rfid/main.py rename rpi/{scripts => hardware}/timer/__init__.py (100%) rename rpi/{scripts => hardware}/timer/grove_rgb_lcd.py (100%) rename rpi/{scripts => hardware}/timer/led.py (100%) rename rpi/{scripts => hardware}/timer/main.py (100%) delete mode 100644 rpi/scripts/rfid/main.py create mode 100644 rpi/services/mqtt_service.py diff --git a/rpi/scripts/__init__.py b/rpi/hardware/__init__.py similarity index 100% rename from rpi/scripts/__init__.py rename to rpi/hardware/__init__.py diff --git a/rpi/scripts/rfid/__init__.py b/rpi/hardware/rfid/__init__.py similarity index 100% rename from rpi/scripts/rfid/__init__.py rename to rpi/hardware/rfid/__init__.py diff --git a/rpi/hardware/rfid/main.py b/rpi/hardware/rfid/main.py new file mode 100644 index 00000000..b5d0a9bf --- /dev/null +++ b/rpi/hardware/rfid/main.py @@ -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() \ No newline at end of file diff --git a/rpi/scripts/timer/__init__.py b/rpi/hardware/timer/__init__.py similarity index 100% rename from rpi/scripts/timer/__init__.py rename to rpi/hardware/timer/__init__.py diff --git a/rpi/scripts/timer/grove_rgb_lcd.py b/rpi/hardware/timer/grove_rgb_lcd.py similarity index 100% rename from rpi/scripts/timer/grove_rgb_lcd.py rename to rpi/hardware/timer/grove_rgb_lcd.py diff --git a/rpi/scripts/timer/led.py b/rpi/hardware/timer/led.py similarity index 100% rename from rpi/scripts/timer/led.py rename to rpi/hardware/timer/led.py diff --git a/rpi/scripts/timer/main.py b/rpi/hardware/timer/main.py similarity index 100% rename from rpi/scripts/timer/main.py rename to rpi/hardware/timer/main.py diff --git a/rpi/requirements.txt b/rpi/requirements.txt index d61d48ea..6acf765b 100644 --- a/rpi/requirements.txt +++ b/rpi/requirements.txt @@ -14,4 +14,6 @@ opencv-python numpy ultralytics torch -flask \ No newline at end of file +flask +paho-mqtt +grovepi \ No newline at end of file diff --git a/rpi/scripts/rfid/main.py b/rpi/scripts/rfid/main.py deleted file mode 100644 index abc6023b..00000000 --- a/rpi/scripts/rfid/main.py +++ /dev/null @@ -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) \ No newline at end of file diff --git a/rpi/services/mqtt_service.py b/rpi/services/mqtt_service.py new file mode 100644 index 00000000..da3d74cc --- /dev/null +++ b/rpi/services/mqtt_service.py @@ -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 \ No newline at end of file