Os endereços MAC não são exclusivos
Pode haver e será duplicado com MACs. Há várias razões para isso, uma delas é que elas não precisam ser (globalmente) únicas.
O MAC deve ser único na rede local, então o ARP / NDP pode fazer seu trabalho, e o switch sabe para onde enviar os datagramas recebidos. Geralmente (não necessariamente) essa pré-condição é satisfeita e as coisas funcionam bem, simplesmente porque a probabilidade de ter dois MACs idênticos na mesma LAN, mesmo que não sejam exclusivos, é bastante baixa.
Outra razão é que simplesmente existem mais dispositivos do que endereços. Embora os endereços de 48 bits pareçam ter endereços suficientes para todos até o final 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). Uma 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ários OUIs, que é o que os jogadores maiores fazem.
Considere a Intel como um exemplo. Eles registraram um total de 7 OUIs, dando a eles um total de 116 milhões de endereços.
A placa-mãe do meu computador (que usa um chipset X99), bem como a placa-mãe do meu laptop, bem como a placa-mãe de todo computador x86 que possuí durante os últimos 10 a 15 anos, tinham uma placa de rede Intel como parte do chipset.
Certamente há mais de 116 milhões de computadores baseados em Intel no mundo. Assim, seus MACs não podem possivelmente ser únicos (em um sentido globalmente único).
Além disso, casos foram relatados de uh ... mais barato ... fabricantes simplesmente "roubando" endereços de outra pessoa OUI. Em outras palavras, eles apenas usaram algum endereço aleatório. Já ouvi falar de fabricantes que usam o mesmo endereço para uma gama completa de produtos também. Nenhum dos dois é realmente conforme ou faz muito sentido, mas o que você pode fazer a respeito. Essas placas de rede existem. Novamente: A probabilidade de que se torne um problema prático ainda é muito baixa se os endereços forem usados para o que eles pretendem, você precisa ter dois deles na mesma LAN até notar.
Agora, o que fazer com o seu problema?
A solução é talvez mais simples do que você pensa. Seus dispositivos de 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 milli). Acabei de executar ntpq -c rl
para ter certeza e foi-me dito 2 -20 .
A probabilidade de dois dispositivos serem ligados pela primeira vez no mesmo microssegundo é muito baixa. Geralmente é possível acontecer (especialmente se você vender milhões deles em um tempo muito curto, parabéns pelo seu sucesso!), Com certeza. Mas não é muito provável - na prática isso não acontecerá. Assim, salve o tempo após a primeira inicialização em armazenamento permanente.
O tempo de inicialização do seu dispositivo IoT será o mesmo em todos os dispositivos. Exceto que isso não é verdade em tudo .
Dado um temporizador de alta resolução, os tempos de inicialização são consideravelmente diferentes, mesmo no mesmo dispositivo, sempre. É talvez apenas alguns ticks de clock diferentes (ou algumas centenas de milhares, se você ler algo como o contador de tempo da CPU), então não é muito original, mas com certeza adiciona alguma entropia.
Da mesma forma, o tempo que leva connect
para retornar na primeira vez que você acessa sua API site será um pouco, mas mensurável, diferente a cada vez. Da mesma forma, getaddrinfo
terá uma quantidade de tempo um pouco diferente e mensurável para cada dispositivo ao procurar 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, tempo para inicializar pela primeira vez, tempo de conexão) e calcule um hash a partir disso. O MD5 se sairá bem para esse propósito. Lá você é único.
Embora isso não realmente garanta exclusividade, "praticamente" garante isso, com uma chance neglegível de falha. Você teria que ter dois dispositivos com MACs idênticos que são ativados pela primeira vez no mesmo microssegundo e levava exatamente o mesmo tempo para inicializar e se conectar ao seu site. Isso não vai acontecer. Se isso acontecer, você deve começar imediatamente a jogar na loteria, porque, com todas as aparências, você tem a garantia de ganhar.
Se, no entanto, "não acontecer" não for suficiente como garantia, basta passar a cada dispositivo um número sequencialmente crescente (gerado no servidor) na primeira vez que acessar sua API da web. Deixe o dispositivo armazenar esse número, pronto.