为物联网设备自动生成全球唯一身份的最佳方式

我有一个用 Golang 为物联网设备开发的应用程序,它通过 MQTT 进行通信,这个应用程序也可以安装在任何支持 Docker 和 Golang 的设备上。

现在,当我第一次在设备上运行我的应用程序时,我想为每个设备自动生成我的应用程序的唯一身份。我正在考虑使用永久 MAC 或序列号,这是一种好方法吗?所有设备都会有永久 MAC 或序列号吗?如果没有,那么实现这一目标的更好方法是什么。


德玛西亚99
浏览 161回答 3
3回答

qq_笑_17

绝对不能保证您的设备甚至会有序列号或 MAC 地址,更不用说唯一的了。关于连续剧,每个设备制造商都做自己的事情。那些具有软件可访问序列号的设备通常会将它们刻录到需要特殊工具才能读取的某个地方的 EEPROM 中。您需要了解每个目标设备的过程和运行工具。关于 MAC,如果您的设备有 WiFi 或以太网接口,那么制造商可能已经为其分配了一个全球唯一的 MAC 地址。但是,您可以自行查找相关的网络接口并读取其 MAC 地址。这将相当麻烦,因为您必须为网络接口发现系统,确定它是否是物理接口(与拨号、网桥、vpn 等虚拟接口相比)并读取其 MAC。最后,有些设备根本没有任何物理 WiFi 或以太网接口——它们可能带有 GSM 模块或 LoRA 或完全其他的东西。我建议不要依赖 MAC 或串行。首次启动时生成您自己的 GUID,将其存储在配置中并用于后续识别。PS - 我假设您的目标是运行 Linux 或其他桌面操作系统的更大的设备。微控制器通常不支持 Go,当然也不支持 Docker。

隔江千里

尝试从以下代码中获得一些灵感:package mainimport (    "crypto/sha1"    "encoding/hex"    "fmt"    "time")// SHA1 hashes using sha1 algorithmfunc SHA1(text string) string {    algorithm := sha1.New()    algorithm.Write([]byte(text))    return hex.EncodeToString(algorithm.Sum(nil))}func main() {    var macAddress = "00:00:00:00:00:00"    var deviceType = "deviceType"    var deviceName = "deviceName"    var deviceModel = "deviceModel"    var deviceManufacturer = "deviceManufacturer"    var deviceVersion = "deviceVersion"    var deviceSerialNumber = "deviceSerialNumber"    var timeInMilliseconds = time.Now().UnixNano() / int64(time.Millisecond)    // convert time to string    var timeString = fmt.Sprintf("%d", timeInMilliseconds)    var conc = macAddress + "-" + deviceType + "-" + deviceName + "-" + deviceModel + "-" + deviceManufacturer + "-" + deviceVersion + "-" + deviceSerialNumber + "-" + timeString    // calculate the uuid using the sha256 algorithm    // and the concatenated string    var uuid = SHA1(conc)    fmt.Println(uuid)}MAC地址主要由设备制造商分配,因此通常称为烧录地址,或称为以太网硬件地址、硬件地址或物理地址。序列号允许公司识别产品并获取有关它的更多信息以进行更换或查找兼容部件

蝴蝶刀刀

读取一些加密随机数据。将随机数据转换为字符串。  // N is number of bytes of random data to   // to read. I set to N, the same number of   // bytes in a UUID.  const N = 16  p := make([]byte, N)  if _, err := rand.Read(p); err != nil {      // TODO: handle error  }  id := fmt.Sprintf("%x", p)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go