feat(大屏): 设备绑定流 — 永久设备ID+待绑定页(连接码)+MQTT绑定确认

- config.getDeviceId:首启生成并持久化永久设备ID,作为 MQTT client_id(稳定可控)。
- tenant.js 改设备绑定:registerDevice/requestBindCode/applyBound(存 token+tenant)/isDeviceBound。
- mqtt.js:client_id=device_id;订阅 bind/<dev>(未绑定确认)+command/tick(租户)。
- main.jsx:未绑定→BindScreen(注册+取8位码+监听绑定频道, 绑定后 reload);已绑定→App。
- BindScreen:展示 8 位连接码+设备ID+等待园区端绑定。yarn build 通过。
This commit is contained in:
Pine
2026-08-24 20:14:15 +08:00
parent 225c22ad62
commit 4257db2e26
5 changed files with 101 additions and 36 deletions
+12
View File
@@ -60,3 +60,15 @@ export function getVoiceWsUrl() {
export const MQTT_TOPIC_COMMAND = 'opc/display/command';
export const MQTT_TOPIC_TICK = 'opc/dashboard/tick';
export const MQTT_TOPIC_HEARTBEAT = 'opc/display/heartbeat';
export const MQTT_TOPIC_BIND = 'opc/display/bind';
/* ---- 大屏永久设备 ID:首次生成并持久化,作为 MQTT 客户端名 / 绑定凭据 ---- */
const DEVICE_ID_KEY = 'dpm_device_id';
export function getDeviceId() {
let id = localStorage.getItem(DEVICE_ID_KEY);
if (!id) {
id = 'DP-' + Math.random().toString(36).slice(2, 8).toUpperCase() + Date.now().toString(36).slice(-6).toUpperCase();
localStorage.setItem(DEVICE_ID_KEY, id);
}
return id;
}