为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
德玛西亚99 2022-10-17 09:54:24
我有一个用 Golang 为物联网设备开发的应用程序,它通过 MQTT 进行通信,这个应用程序也可以安装在任何支持 Docker 和 Golang 的设备上。现在,当我第一次在设备上运行我的应用程序时,我想为每个设备自动生成我的应用程序的唯一身份。我正在考虑使用永久 MAC 或序列号,这是一种好方法吗?所有设备都会有永久 MAC 或序列号吗?如果没有,那么实现这一目标的更好方法是什么。
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

绝对不能保证您的设备甚至会有序列号或 MAC 地址,更不用说唯一的了。

关于连续剧,每个设备制造商都做自己的事情。那些具有软件可访问序列号的设备通常会将它们刻录到需要特殊工具才能读取的某个地方的 EEPROM 中。您需要了解每个目标设备的过程和运行工具。

关于 MAC,如果您的设备有 WiFi 或以太网接口,那么制造商可能已经为其分配了一个全球唯一的 MAC 地址。但是,您可以自行查找相关的网络接口并读取其 MAC 地址。这将相当麻烦,因为您必须为网络接口发现系统,确定它是否是物理接口(与拨号、网桥、vpn 等虚拟接口相比)并读取其 MAC。最后,有些设备根本没有任何物理 WiFi 或以太网接口——它们可能带有 GSM 模块或 LoRA 或完全其他的东西。

我建议不要依赖 MAC 或串行。首次启动时生成您自己的 GUID,将其存储在配置中并用于后续识别。

PS - 我假设您的目标是运行 Linux 或其他桌面操作系统的更大的设备。微控制器通常不支持 Go,当然也不支持 Docker。


查看完整回答
反对 回复 2022-10-17
?
隔江千里

TA贡献1906条经验 获得超10个赞

尝试从以下代码中获得一些灵感:


package main


import (

    "crypto/sha1"

    "encoding/hex"

    "fmt"

    "time"

)


// SHA1 hashes using sha1 algorithm

func 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地址主要由设备制造商分配,因此通常称为烧录地址,或称为以太网硬件地址、硬件地址或物理地址。

  • 序列号允许公司识别产品并获取有关它的更多信息以进行更换或查找兼容部件


查看完整回答
反对 回复 2022-10-17
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

读取一些加密随机数据。将随机数据转换为字符串。

  // 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)


查看完整回答
反对 回复 2022-10-17
  • 3 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号