Endereços MAC não são exclusivos
Pode haver, e haverá duplicatas nos MACs. Existem várias razões para isso, uma delas é que elas não precisam ser (globalmente) únicas.
O MAC deve ser exclusivo na rede local, para que o ARP / NDP possa fazer seu trabalho, e o switch sabe para onde enviar os datagramas recebidos. Geralmente (não necessariamente) essa pré-condição é atendida e as coisas funcionam muito bem, simplesmente porque a probabilidade de ter dois MACs idênticos na mesma LAN, mesmo que não sejam únicos, é bastante baixa.
Outro motivo é que simplesmente existem mais dispositivos do que endereços. Embora os endereços de 48 bits pareçam endereços suficientes para todo mundo até o fim dos dias, esse não é o caso.
O espaço de endereço é dividido em duas metades de 24 bits (é um pouco mais complicado, mas vamos ignorar os detalhes mesquinhos). Metade é a OUI que você pode registrar no IEEE e atribuir à sua empresa por cerca de 2000 dólares. Os 24 bits restantes, você faz o que quiser. Claro que você pode registrar várias OUIs, que é o que os grandes players fazem.
Tome a Intel como exemplo. Eles registraram um total de 7 OUIs, dando a eles um total de 116 milhões de endereços.
A placa principal do meu computador (que usa um chipset X99), bem como a placa principal do meu laptop e a placa mãe de todos os computadores baseados em x86 que eu possuía nos últimos 10 a 15 anos tinham uma placa de rede Intel como parte do chipset. Certamente há muito mais de 116 milhões de computadores baseados em Intel no mundo. Portanto, seus MACs não podem ser únicos (em um sentido globalmente único).
Além disso, foram relatados casos de ... mais baratos ... fabricantes simplesmente "roubam" endereços da OUI de outra pessoa. Em outras palavras, eles apenas usaram algum endereço aleatório. Já ouvi falar de fabricantes que também usam o mesmo endereço para uma gama completa de produtos. Nada disso está realmente em conformidade ou faz muito sentido, mas o que você pode fazer sobre isso. Essas placas de rede existem. Novamente: A probabilidade de se tornar um problema prático ainda é muito baixa se os endereços forem usados para o que eles se destinam, você precisará de dois na mesma LAN para notar.
Agora, o que fazer com seu problema?
A solução é talvez mais simples do que você pensa. Seus dispositivos IoT provavelmente precisarão de alguma noção de tempo, geralmente o tempo é obtido automaticamente via NTP. A precisão típica do NTP está na faixa de microssegundos (sim, isso é micro, não mili). Eu só corri ntpq -c rl
para ter certeza e me disseram 2 -20 .
A probabilidade de dois de seus dispositivos serem ligados pela primeira vez no mesmo microssegundo é muito baixa. Geralmente é possível acontecer (especialmente se você vender milhões deles em muito pouco tempo, parabéns pelo seu sucesso!), Com certeza. Mas não é muito provável - na prática, isso não acontecerá. Assim, economize tempo após a primeira inicialização na loja permanente.
O tempo de inicialização do seu dispositivo IoT será o mesmo em todos os dispositivos. Exceto que isso não é verdade .
Dado um timer de alta resolução, os tempos de inicialização são mensuráveis diferentes mesmo no mesmo dispositivo, sempre. Talvez seja apenas alguns cliques do relógio diferentes (ou algumas centenas de milhares, se você ler algo como o contador de data e hora da CPU), portanto, não muito único, mas com certeza adiciona alguma entropia.
Da mesma forma, o tempo necessário connect
para retornar na primeira vez em que você acessa o site da API será um pouco, mas mensurável, diferente a cada vez. Da mesma forma, getaddrinfo
levará um tempo mensurável ligeiramente diferente para cada dispositivo ao pesquisar o nome do host da sua API da web pela primeira vez.
Concatene essas três ou quatro fontes de entropia (endereço MAC, hora da primeira inicialização, hora da inicialização pela primeira vez, hora da conexão) e calcule um hash a partir disso. O MD5 funcionará bem para esse propósito. Lá, você é único.
Embora isso não garanta verdadeiramente a singularidade, "praticamente" garante, com uma chance negligenciável de falha. Você precisaria ter dois dispositivos com MACs idênticos que foram ativados pela primeira vez no mesmo microssegundo e levaram exatamente o mesmo tempo para inicializar e conectar-se ao seu site. Isso não vai acontecer. Se isso acontecer, você deve começar a jogar imediatamente na loteria, porque, para todas as aparências, você está garantido para ganhar.
Se, no entanto, "não acontecerá" não for bom o suficiente como garantia, basta passar para cada dispositivo um número sequencialmente crescente (gerado no servidor) na primeira vez em que eles acessam sua API da web. Deixe o dispositivo armazenar esse número, pronto.