From 92e6aa79dd39bcdf0b9af7fca4ae745d986179cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bodn=C3=A1r=20Zsombor?= <bodzsoaa@sch.bme.hu>
Date: Tue, 29 Jan 2019 12:21:40 +0100
Subject: [PATCH] Change to socketserver, Update image output

---
 mueb_register/MRegister.py | 130 ++++++++++++++++++++-----------------
 1 file changed, 69 insertions(+), 61 deletions(-)

diff --git a/mueb_register/MRegister.py b/mueb_register/MRegister.py
index 0b9785a..1b0593a 100644
--- a/mueb_register/MRegister.py
+++ b/mueb_register/MRegister.py
@@ -1,82 +1,90 @@
 import qrcode
-import socket
 import sqlite3
+import socketserver
+from datetime import datetime
 from PIL import Image, ImageDraw, ImageFont
 
-def main():
-    qr = qrcode.QRCode(
-        version=1,
-        error_correction=qrcode.constants.ERROR_CORRECT_L,
-        box_size=10,
-        border=4,
-    )
-
-    conn = sqlite3.connect("MUEB_register.db")
-    c = conn.cursor()
-
-    # create mueb table
-    try:
-        c.execute('''
-        CREATE TABLE mueb (
-            mueb_id INTEGER     PRIMARY KEY,
-            mac     STRING (17) UNIQUE
-                                NOT NULL
-        );
-        ''')
-    except:
-        pass
-
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    s.bind(('', 67))
-
-    prev_MAC = None
-    id = 0
-
-    print("Listening for MUEB DHCP discover")
-    print("{:<5} {:<20} {:<5}".format("scan", "MAC", "MUEB id"))
-
-    while 1:
-        # wait for dhcp packet
-        data = s.recv(1024)
-        tmp = list(data[28:34])
-        if(hex(tmp[0]) != '0x54' or hex(tmp[1]) != '0x10' or hex(tmp[2]) != '0xec'):
-            continue
-
-        MAC = ':'.join(["{0:02X}".format(i) for i in list(data[28:34])])
-
-        # save to DB
-        c.execute("INSERT OR IGNORE INTO mueb(mac) VALUES('{}')".format(MAC))
-        conn.commit()
-
-        c.execute("SELECT mueb_id FROM mueb WHERE mac='{}'".format(MAC))
-        mueb_id = c.fetchall()[0][0]
-
-        print("{:<5} {:<20} {:<5}".format(id, MAC, mueb_id))
-        id += 1
-
-        # handle multiple requests
+qr = qrcode.QRCode(
+    version=1,
+    error_correction=qrcode.constants.ERROR_CORRECT_H,
+    box_size=10,
+    border=4,
+)
+
+conn = sqlite3.connect("MUEB_register.db")
+c = conn.cursor()
+
+# create mueb table
+try:
+    c.execute('''
+    CREATE TABLE mueb (
+        mueb_id INTEGER     PRIMARY KEY,
+        mac     STRING (17) UNIQUE
+                            NOT NULL
+    );
+    ''')
+except:
+    pass
+
+print("Listening for MUEB DHCP discover")
+print("{:<8} {:<17} {:<5}".format("scan", "MAC", "MUEB id"))
+
+prev_MAC = None
+
+
+class UDPHandler(socketserver.BaseRequestHandler):
+    def handle(self):
+        global prev_MAC
+        data = self.request[0].strip()
+        CHADDR = list(data[28:34])  # CHWADDR
+        if(hex(CHADDR[0]) != '0x54' or hex(CHADDR[1]) != '0x10' or hex(CHADDR[2]) != '0xec'):
+            return
+
+        MAC = ':'.join(["{0:02X}".format(i) for i in CHADDR])
+
+        # handle multiple requests from the same device
         if prev_MAC != MAC:
+            # save to DB
+            c.execute("INSERT OR IGNORE INTO mueb(mac) VALUES('{}')".format(MAC))
+            conn.commit()
+
+            c.execute("SELECT mueb_id FROM mueb WHERE mac='{}'".format(MAC))
+            mueb_id = c.fetchall()[0][0]
+
+            print("{:<8} {:<17} {:<5}".format(
+                datetime.now().strftime('%H:%M:%S'), MAC, mueb_id))
             qr.add_data(MAC)
             qr.make(fit=True)
 
             img = qr.make_image(fill_color="black", back_color="white")
-            width, height = img.size
+            W, H = img.size
 
-            finalImg = Image.new('RGBA', (width, height), 'white')
-            finalImg.paste(img)
+            font = ImageFont.truetype("arial.ttf", 30)
+            w, h = font.getsize(MAC)
+            caption = MAC+"\n\n{}".format(str(mueb_id).center(32))
 
-            caption = MAC+"/{}".format(mueb_id)
-            font = ImageFont.truetype("arial.ttf", 15)
-            w, h = font.getsize(caption)
+            finalImg = Image.new(
+                'RGBA', (W+w+qr.border*qr.box_size, H), 'white')
+            finalImg.paste(img)
 
             draw = ImageDraw.Draw(finalImg)
-            draw.text((round((width-w)/2), round(height-h-10)),
-                    caption, "black", font)
+            draw.text((W, (H-(qr.border*qr.box_size))/2),
+                      caption, "black", font)
 
             finalImg.show()
             finalImg.save("{}.png".format(mueb_id))
             qr.clear()
+
         prev_MAC = MAC
 
+
+def main():
+    with socketserver.UDPServer(('', 67), UDPHandler) as server:
+        try:
+            server.serve_forever()
+        except KeyboardInterrupt:
+            conn.close()
+
+
 if __name__ == '__main__':
     main()
-- 
GitLab