Las direcciones MAC no son únicas
Puede haber, y habrá duplicados con MAC. Hay varias razones para eso, una de ellas es que no necesitan ser (globalmente) únicos.
El MAC debe ser único en la red local, por lo que ARP / NDP puede hacer su trabajo, y el conmutador sabe a dónde enviar los datagramas entrantes. Por lo general (no necesariamente) esa condición previa se cumple y las cosas funcionan bien, simplemente porque la probabilidad de tener dos MAC idénticos en la misma LAN, incluso si no son únicos, es bastante baja.
Otra razón es que simplemente existen más dispositivos que direcciones. Si bien las direcciones de 48 bits parecen que hay suficientes direcciones para todos hasta el final de los días, ese no es el caso.
El espacio de direcciones se divide en dos mitades de 24 bits (es un poco más complicado, pero ignoremos los pequeños detalles). La mitad es el OUI que puede registrar en el IEEE y asignar a su empresa por alrededor de 2000 dólares. Los 24 bits restantes, haces lo que quieras. Por supuesto, puede registrar varias OUI, que es lo que hacen los jugadores más grandes.
Tome a Intel como ejemplo. Han registrado un total de 7 OUI, lo que les da un total de 116 millones de direcciones.
La placa base de mi computadora (que usa un conjunto de chips X99), así como la placa base de mi computadora portátil y la placa base de cada computadora basada en x86 que he tenido durante los últimos 10-15 años tenía una tarjeta de red Intel como parte del conjunto de chips. Ciertamente hay más de 116 millones de computadoras basadas en Intel en el mundo. Por lo tanto, sus MAC no pueden ser únicos (en un sentido globalmente único).
Además, se han reportado casos de fabricantes ... más baratos ... simplemente "robando" direcciones de la OUI de otra persona. En otras palabras, solo usaron alguna dirección aleatoria. También he oído hablar de fabricantes que solo usan la misma dirección para una gama completa de productos. Nada de eso es realmente conforme o tiene mucho sentido, pero ¿qué puede hacer al respecto? Estas tarjetas de red existen. Una vez más: la probabilidad de que se convierta en un problema práctico sigue siendo muy baja si las direcciones se utilizan para lo que están destinadas, debe tener dos de ellas en la misma LAN para incluso darse cuenta.
Ahora, ¿qué hacer con tu problema?
La solución es quizás más simple de lo que piensas. Sus dispositivos IoT probablemente necesitarán alguna noción de tiempo, generalmente el tiempo se obtiene automáticamente a través de NTP. La precisión típica de NTP está en el rango de microsegundos (sí, eso es micro, no mili). Simplemente corrí ntpq -c rl
para estar seguro y me dijeron 2-20 .
La probabilidad de que dos de sus dispositivos se enciendan por primera vez en el mismo microsegundo preciso es muy baja. En general, es posible que suceda (especialmente si vende millones de ellos en muy poco tiempo, ¡felicidades por su éxito!), Claro. Pero no es muy probable, en la práctica no sucederá. Por lo tanto, ahorre tiempo después del primer arranque en la tienda permanente.
El tiempo de arranque de su dispositivo IoT será el mismo en todos los dispositivos. Excepto que eso no es cierto en absoluto .
Dado un temporizador de alta resolución, los tiempos de arranque son considerablemente diferentes incluso en el mismo dispositivo, cada vez. Tal vez solo sean unos pocos tics de reloj diferentes (o unos pocos cientos de miles, si lees algo como el contador de sello de tiempo de la CPU), por lo que no es muy único en absoluto, pero seguro agrega algo de entropía.
Del mismo modo, el tiempo que lleva connect
regresar la primera vez que accede a su sitio API será leve, pero mensurable, diferente cada vez. Del mismo modo, getaddrinfo
tomará una cantidad de tiempo medible ligeramente diferente para cada dispositivo cuando busque el nombre de host de su API web por primera vez.
Concatene esas tres o cuatro fuentes de entropía (dirección MAC, hora del primer encendido, hora de arrancar por primera vez, hora de conexión) y calcule un hash a partir de eso. MD5 funcionará bien para ese propósito. Ahí eres único.
Si bien eso no garantiza realmente la unicidad, "prácticamente" lo garantiza, con una posibilidad insignificante de fracaso. Tendría que tener dos dispositivos con MAC idénticos que se enciendan por primera vez en el mismo microsegundo, y que se hayan tomado exactamente el mismo tiempo para arrancar y conectarse a su sitio. Eso no va a suceder. Si sucede, inmediatamente debe comenzar a jugar a la lotería porque, según todas las apariencias, tiene la garantía de ganar.
Sin embargo, si "no va a suceder" no es lo suficientemente bueno como garantía, simplemente transfiera a cada dispositivo un número creciente secuencial (generado en el servidor) la primera vez que acceda a su API web. Deje que el dispositivo almacene ese número, listo.