MACアドレスは一意ではありません
存在する可能性があり、MACと重複します。その理由はいくつかありますが、1つは(グローバルに)一意である必要はないということです。
MACはローカルネットワーク上で一意である必要があるため、ARP / NDPはその役割を果たし、スイッチは着信データグラムの送信先を認識します。通常、(必ずしもそうではない)その前提条件が満たされ、物事がうまく機能するのは、同じLAN上に2つの同一のMACが存在する可能性が、たとえそれらが一意でなくても非常に低いためです。
もう1つの理由は、アドレスよりも多くのデバイスが単に存在することです。48ビットアドレスは、数日が終わるまですべての人に十分なアドレスがあるように聞こえますが、そうではありません。
アドレス空間は2つの24ビットの半分に分割されます(少し複雑ですが、ささいな詳細は無視しましょう)。半分はOUIで、IEEEに登録して約2000ドルで会社に割り当てることができます。残りの24ビットは、好きなことをします。もちろん、いくつかのOUIを登録できます。これは、より大きなプレーヤーが行うことです。
例としてIntelを取り上げます。彼らは合計7つのOUIを登録し、合計1億1,600万のアドレスを割り当てました。
私のコンピューターのメインボード(X99チップセットを使用)とラップトップのメインボード、そして過去10〜15年間に所有していたすべての x86ベースのコンピューターのメインボードには、チップセットの一部としてIntelネットワークカードがありました。確かに、世界中に1億1600万台以上のIntelベースのコンピューターがあります。したがって、それらのMAC を一意にすることはできません(グローバルに一意の意味で)。
また、場合によっては、...安く...メーカーは、単に他の誰かのOUIからアドレスを「盗む」という報告もあります。言い換えれば、彼らはランダムなアドレスを使用しただけです。製品の完全な範囲に同じ住所を使用するだけのメーカーも聞いたことがあります。どちらも実際には準拠していないか、あまり意味がありませんが、それについて何ができますか。これらのネットワークカードが存在します。繰り返しますが、アドレスが意図された目的に使用される場合、それが実際的な問題になる可能性はまだ非常に低く、気付くために同じLAN上に 2つ持つ必要があります。
さて、あなたの問題についてどうすればいいですか?
解決策は、おそらくあなたが思っているより簡単です。ほとんどの場合、IoTデバイスには時間の概念が必要になります。通常、時間はNTPを介して自動的に取得されます。NTPの一般的な精度はマイクロ秒の範囲です(はい、ミリではなくマイクロです)。ntpq -c rl
確かに走って、2 -20と言われました。
2つのデバイスがまったく同じマイクロ秒で初めてオンになる可能性は非常に低いです。一般的に起こり得ることです(特に、非常に短い時間で数百万個を販売している場合、成功をおめでとうございます!)。しかし、そうなる可能性は非常に低く、実際には起こりません。したがって、永続ストアで最初に起動した後の時間を節約してください。
IoTデバイスの起動時間は、すべてのデバイスで同じです。それがまったく真実でないことを除いて。
高解像度のタイマーを使用すると、同じデバイスであっても毎回起動時間がかなり異なります。CPUのタイムスタンプカウンターのようなものを読んだ場合、それはたぶん数クロックティックだけ異なる(または数十万)ので、完全に一意ではありませんが、確かにいくらかのエントロピーを追加します。
同様に、connect
APIサイトに初めてアクセスしたときに戻るのにかかる時間は、わずかですが、測定可能なほど毎回異なります。同様に、getaddrinfo
Web APIのホスト名を初めて検索する場合、デバイスごとにわずかに異なる測定可能な時間がかかります。
エントロピーの3つまたは4つのソース(MACアドレス、最初の電源投入時、最初の起動時間、接続時間)を連結し、そこからハッシュを計算します。MD5はその目的のためにうまく機能します。そこで、あなたはユニークです。
それは真に一意性を保証するものではありませんが、「ほとんど」それを保証し、失敗する可能性は無視できます。同じマイクロ秒で初めてオンになり、起動とサイトへの接続にまったく同じ時間がかかった同一のMACを持つ2つのデバイスが必要になります。それは起こりません。それが起こった場合、すべての出現に対して、あなたが勝つことが保証されているので、あなたはすぐに宝くじのプレイを開始する必要があります。
ただし、「発生しない」が保証として十分でない場合は、Web APIに初めてアクセスするときに、各デバイスに(サーバーで生成された)連続して増加する番号を渡すだけです。デバイスにその番号を保存させてください。