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