我有一個用 Golang 開發的用于物聯網設備的應用程式,它通過 MQTT 進行通信,這個應用程式也可以安裝在任何支持 Docker 和 Golang 的設備上。
現在,當我第一次在設備上運行我的應用程式時,我想為每個設備自動生成我的應用程式的唯一標識。我正在考慮使用永久 MAC 或序列號,這是一個好方法嗎?所有設備都會有永久 MAC 或序列號嗎?如果沒有,那么實作這一目標的更好方法是什么。
uj5u.com熱心網友回復:
絕對不能保證您的設備甚至會有序列號或 MAC 地址,更不用說唯一的了。
關于序列號,每個設備制造商都做自己的事情。那些具有軟體可訪問序列號的設備通常會將它們刻錄到需要特殊工具才能讀取的 EEPROM 中。您需要了解每個目標設備的程式和運行工具。
關于 MAC,如果您的設備具有 WiFi 或以太網介面,那么制造商可能已為其分配了全球唯一的 MAC 地址。但是,您需要找到相關的網路介面并讀取其 MAC 地址。這將相當麻煩,因為您必須發現系統的網路介面,確定它是否是物理介面(與虛擬介面,如撥號、橋接、VPN 等)并讀取其 MAC。最后,有些設備根本沒有任何物理 WiFi 或以太網介面——它們可能帶有 GSM 模塊或 LoRA 或其他東西。
我建議不要依賴 MAC 或串行。首次啟動時生成您自己的 GUID,將其存盤在配置中并用于后續識別。
PS - 我假設您的目標是運行 Linux 或其他桌面作業系統的更大的設備。微控制器通常不支持 Go,當然也不支持 Docker。
uj5u.com熱心網友回復:
讀取一些加密隨機資料。將隨機資料轉換為字串。
// 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)
uj5u.com熱心網友回復:
嘗試從以下代碼中獲得一些靈感:
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地址主要由設備制造商分配,因此通常稱為燒入地址,或以太網硬體地址、硬體地址或物理地址。
- 一個序列號可以讓公司識別產品并獲得其更換更多資訊或找到兼容的配件
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/362228.html
