Skip to content
Snippets Groups Projects
MRegister.py 2.36 KiB
Newer Older
bodzsoaa's avatar
bodzsoaa committed
import qrcode
import sqlite3
import socketserver
from datetime import datetime
bodzsoaa's avatar
bodzsoaa committed
from PIL import Image, ImageDraw, ImageFont

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
bodzsoaa's avatar
bodzsoaa committed
        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))
bodzsoaa's avatar
bodzsoaa committed
            qr.add_data(MAC)
            qr.make(fit=True)

            img = qr.make_image(fill_color="black", back_color="white")
            W, H = img.size
bodzsoaa's avatar
bodzsoaa committed

            font = ImageFont.truetype("arial.ttf", 30)
            w, h = font.getsize(MAC)
            caption = MAC+"\n\n{}".format(str(mueb_id).center(32))
bodzsoaa's avatar
bodzsoaa committed

            finalImg = Image.new(
                'RGBA', (W+w+qr.border*qr.box_size, H), 'white')
            finalImg.paste(img)
bodzsoaa's avatar
bodzsoaa committed

            draw = ImageDraw.Draw(finalImg)
            draw.text((W, (H-(qr.border*qr.box_size))/2),
                      caption, "black", font)
bodzsoaa's avatar
bodzsoaa committed

            finalImg.show()
            finalImg.save("{}.png".format(mueb_id))
            qr.clear()
bodzsoaa's avatar
bodzsoaa committed
        prev_MAC = MAC


def main():
    with socketserver.UDPServer(('', 67), UDPHandler) as server:
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            conn.close()


bodzsoaa's avatar
bodzsoaa committed
if __name__ == '__main__':
    main()