import { ref, watch, computed, onUnmounted } from 'vue' import { useMyStore } from '/@/store' import { postDrc } from '/@/api/drc' import { UranusMqtt } from '/@/mqtt' type StatusOptions = { status: 'close'; event?: CloseEvent; } | { status: 'open'; retryCount: number; } | { status: 'pending'; } export function useConnectMqtt() { const store = useMyStore() const dockOsdVisible = computed(() => { return store.state.osdVisible && store.state.osdVisible.visible && store.state.osdVisible.is_dock }) const mqttState = ref(null) // 监听已打开的设备小窗 窗口数量 watch(() => dockOsdVisible.value, async (val) => { // 1.打开小窗 // 2.设备拥有飞行控制权 // 3.请求建立mqtt连接的认证信息 if (val) { if (mqttState.value) return const result = await postDrc({}) if (result?.code === 0) { const { address, client_id, username, password, expire_time } = result.data // @TODO: 校验 expire_time mqttState.value = new UranusMqtt(address, { clientId: client_id, username, password, }) mqttState.value?.initMqtt() mqttState.value?.on('onStatus', (statusOptions: StatusOptions) => { // @TODO: 异常case }) store.commit('SET_MQTT_STATE', mqttState.value) store.commit('SET_CLIENT_ID', client_id) } // @TODO: 认证失败case return } // 关闭所有小窗后 // 1.销毁mqtt连接重置mqtt状态 if (mqttState?.value) { mqttState.value?.destroyed() mqttState.value = null store.commit('SET_MQTT_STATE', null) store.commit('SET_CLIENT_ID', '') } }, { immediate: true }) onUnmounted(() => { mqttState.value?.destroyed() }) }