package handler import ( "crypto/rand" "encoding/json" "fmt" "log" "strings" "github.com/qy/hw-ws-service/internal/connection" ) // helloMessage 是硬件发来的 hello 握手消息。 type helloMessage struct { MAC string `json:"mac"` } // HandleHello 处理硬件的 hello 握手消息。 // 校验 MAC 地址,分配 session_id,返回握手响应。 func HandleHello(conn *connection.Connection, raw []byte) error { var msg helloMessage if err := json.Unmarshal(raw, &msg); err != nil { return fmt.Errorf("hello: invalid json: %w", err) } // MAC 地址与 URL 参数不一致时记录警告,但不拒绝连接 if msg.MAC != "" && !strings.EqualFold(msg.MAC, conn.DeviceID) { log.Printf("[hello][%s] MAC mismatch: url=%s body=%s", conn.DeviceID, conn.DeviceID, msg.MAC) } sessionID := newSessionID() conn.Handshake(sessionID) return conn.SendJSON(map[string]string{ "type": "hello", "status": "ok", "session_id": sessionID, }) } func newSessionID() string { b := make([]byte, 4) rand.Read(b) //nolint:errcheck // crypto/rand.Read 在标准库中不会返回错误 return fmt.Sprintf("%x", b) }