// Package devcode 设备码解析:从一条「设备码」反推出它属于哪个产品(PID)。 // // **设备码就是 MAC**(2026-09-02 起)。此前还有一种 20 字符的 license 串形态, // 与 MAC 并存指向同一台设备;那套已整体移除(utils/license 包已删除), // 库里的存量 license 码也已就地改写成对应的 MAC。 // // MAC 的前 2 字节就是 PID(见 utils/mac),所以「这台设备属于哪个产品」不需要查库。 // // ⚠️ 存在的理由是「别再写 `解析失败就回退写死 pid` 那种代码」:回退到一个固定 PID // 会静默去查错误的 license_ 分表,解绑/重置看起来成功、实际什么都没改。 // 解不出就返回错误,让调用方报出来。 package devcode import ( "strings" "yunyan/utils/mac" ) // ProductID 从设备码(MAC)解析出 PID。 func ProductID(code string) (uint16, error) { pid, _, err := mac.Parse(strings.TrimSpace(code)) return pid, err } // NormalizeMac 把用户输入的 MAC 规范成落库形态:大写、冒号分隔。 // 解析不了则返回 ok=false —— MAC 现在是授权码分表的主键,也是绑定时精确匹配的键, // 格式不一致会让同一台设备存成两行、也会让按 MAC 反查绑定的路径查不到。 func NormalizeMac(s string) (string, bool) { pid, serial, err := mac.Parse(strings.TrimSpace(s)) if err != nil { return "", false } return mac.Generate(pid, serial), true }