fix(mqtt): MQTT 连接成功后自动周期上报心跳(绑定页/主屏通用)
- mqtt.js:connect 后立即+每10s 上报 opc/display/heartbeat(client_id/tenant_id/page), 绑定页(BindScreen)不再只连不报——admin 端屏幕管理即可看到在线大屏; 断线 close 时清定时器,重连后自动恢复 - useMqttControl.js:移除重复心跳(避免双发),保留注册/状态上报/订阅逻辑
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { useEffect } from 'react';
|
||||
import { useNavigate, useLocation } from 'react-router-dom';
|
||||
import { onMqttMessage, connectMqtt, publishMqtt, getClientId, useMqttStatus } from './mqtt';
|
||||
import { MQTT_TOPIC_HEARTBEAT, MQTT_TOPIC_COMMAND, MQTT_TOPIC_BIND, getApiBase as API_BASE } from '../config';
|
||||
import { MQTT_TOPIC_COMMAND, MQTT_TOPIC_BIND, getApiBase as API_BASE } from '../config';
|
||||
import { getTenantId, clearBinding } from './tenant';
|
||||
import { Sfx } from './sounds';
|
||||
import { PAGE_ORDER } from './pageNav';
|
||||
@@ -75,23 +75,7 @@ export function useMqttControl() {
|
||||
return off;
|
||||
}, []);
|
||||
|
||||
// 大屏在线心跳(后端据此统计在线大屏数)
|
||||
useEffect(() => {
|
||||
connectMqtt();
|
||||
const sendHeartbeat = () => {
|
||||
if (mqttStatus === 'connected') {
|
||||
publishMqtt(MQTT_TOPIC_HEARTBEAT, {
|
||||
client_id: getClientId(),
|
||||
tenant_id: getTenantId(),
|
||||
page: location.pathname,
|
||||
ts: Date.now(),
|
||||
});
|
||||
}
|
||||
};
|
||||
sendHeartbeat();
|
||||
const hb = setInterval(sendHeartbeat, 10000);
|
||||
return () => clearInterval(hb);
|
||||
}, [mqttStatus, location.pathname]);
|
||||
// 大屏在线心跳已由 mqtt.js 连接成功后自动周期上报(绑定页/主屏通用),此处不再重复发送
|
||||
|
||||
// 页面状态即时上报:路由变化即通知服务端当前所在页面
|
||||
useEffect(() => {
|
||||
|
||||
Reference in New Issue
Block a user