3 回答

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

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地址主要由设备制造商分配,因此通常称为烧录地址,或称为以太网硬件地址、硬件地址或物理地址。
序列号允许公司识别产品并获取有关它的更多信息以进行更换或查找兼容部件
- 3 回答
- 0 关注
- 160 浏览
添加回答
举报