|
- """normalize.py
-
- Helper per normalizzare i MAC address in due formati:
-
- - compact: 12 hex uppercase senza separatori (es: AC233FC1DD3C)
- - colon: 6 byte separati da ":" (es: AC:23:3F:C1:DD:3C)
-
- Nota: nel progetto usiamo **compact** come chiave interna per fare matching tra:
- - gateway.csv (spesso con i ":")
- - topic MQTT (publish_out/<gw> in genere senza ":")
- - payload JSON (mac beacon/gateway spesso senza ":")
-
- Il formato colon rimane utile solo per *rendering* (es: header CSV).
- """
-
- from __future__ import annotations
-
- import re
-
- _HEX_ONLY = re.compile(r"[^0-9A-Fa-f]")
-
-
- def mac_to_compact(mac: object) -> str:
- """Ritorna 12 hex uppercase senza separatori."""
- if mac is None:
- return ""
- s = _HEX_ONLY.sub("", str(mac)).upper()
- if len(s) == 12:
- return s
- if len(s) > 12:
- # se arriva qualcosa di più lungo (es. UUID), prendiamo gli ultimi 12
- return s[-12:]
- return s
-
-
- def compact_to_colon(mac12: object) -> str:
- """Converte 'AC233FC1DD3C' -> 'AC:23:3F:C1:DD:3C'."""
- s = mac_to_compact(mac12)
- if len(s) != 12:
- return s
- return ":".join(s[i : i + 2] for i in range(0, 12, 2))
-
-
- def norm_mac(mac: object) -> str:
- """Alias storico: ritorna il formato con ':'."""
- return compact_to_colon(mac)
|