为物联网设备自动生成全球唯一身份的最佳方式
Best way to auto generate global unique identity for IoT devices
我有一个用 Golang 开发的应用程序,用于通过 MQTT 通信的物联网设备,这个应用程序也可以安装在任何支持 Docker 和 Golang 的设备上。
现在,当我 运行 我的应用程序首次在设备上运行时,我想为每台设备自动生成我的应用程序的唯一标识。
我正在考虑使用永久 MAC 或序列号,这是好方法吗?所有设备都会有永久 MAC 或序列号吗?如果不是,那么实现此目标的更好方法是什么。
阅读一些 crypto random data。将随机数据转换为字符串。
// 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)
试着从下面的代码中得到一些启发:
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 地址主要由设备制造商分配,因此通常称为烧录地址,或以太网硬件地址、硬件地址, 或物理地址。
- 序列号 允许公司识别产品并获取有关它的更多信息以进行更换或查找兼容部件
绝对不能保证您的设备会有序列号或 MAC 地址,更不用说唯一的了。
关于序列号,每个设备制造商都各司其职。那些具有软件可访问序列号的设备通常将它们烧入 EEPROM 某处,需要特殊工具才能读取。您需要了解针对每个目标设备的过程和 运行 工具。
关于 MACs,如果您的设备有 WiFi 或以太网接口,那么制造商可能已经为其分配了全球唯一的 MAC 地址。但是,您需要找到相关的网络接口并读取其 MAC 地址。这将相当麻烦,因为您必须发现系统的网络接口,确定它是否是物理接口(相对于拨号、网桥、vpn 等虚拟接口)并阅读其 MAC。最后,有些设备根本没有任何物理 WiFi 或以太网接口 - 它们可能完全带有 GSM 模块或 LoRA 或其他东西。
我建议不要依赖 MAC 或连续剧。首次启动时生成您自己的 GUID,将其存储在配置中并用于后续识别。
PS - 我假设您的目标是更大的设备 运行ning Linux 或其他桌面设备 OS。微控制器一般不支持Go,当然也不Docker.
我有一个用 Golang 开发的应用程序,用于通过 MQTT 通信的物联网设备,这个应用程序也可以安装在任何支持 Docker 和 Golang 的设备上。
现在,当我 运行 我的应用程序首次在设备上运行时,我想为每台设备自动生成我的应用程序的唯一标识。 我正在考虑使用永久 MAC 或序列号,这是好方法吗?所有设备都会有永久 MAC 或序列号吗?如果不是,那么实现此目标的更好方法是什么。
阅读一些 crypto random data。将随机数据转换为字符串。
// 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)
试着从下面的代码中得到一些启发:
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 地址主要由设备制造商分配,因此通常称为烧录地址,或以太网硬件地址、硬件地址, 或物理地址。
- 序列号 允许公司识别产品并获取有关它的更多信息以进行更换或查找兼容部件
绝对不能保证您的设备会有序列号或 MAC 地址,更不用说唯一的了。
关于序列号,每个设备制造商都各司其职。那些具有软件可访问序列号的设备通常将它们烧入 EEPROM 某处,需要特殊工具才能读取。您需要了解针对每个目标设备的过程和 运行 工具。
关于 MACs,如果您的设备有 WiFi 或以太网接口,那么制造商可能已经为其分配了全球唯一的 MAC 地址。但是,您需要找到相关的网络接口并读取其 MAC 地址。这将相当麻烦,因为您必须发现系统的网络接口,确定它是否是物理接口(相对于拨号、网桥、vpn 等虚拟接口)并阅读其 MAC。最后,有些设备根本没有任何物理 WiFi 或以太网接口 - 它们可能完全带有 GSM 模块或 LoRA 或其他东西。
我建议不要依赖 MAC 或连续剧。首次启动时生成您自己的 GUID,将其存储在配置中并用于后续识别。
PS - 我假设您的目标是更大的设备 运行ning Linux 或其他桌面设备 OS。微控制器一般不支持Go,当然也不Docker.