2025-12-12 zwy 优化,订阅视频时,谁订阅发给谁直播地址,其他订阅不变
| | |
| | | String dockControl=""; |
| | | dockControl=mapper.writeValueAsString(receiver); |
| | | |
| | | _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl, ""); |
| | | } |
| | | } |
| | |
| | | String dockControl=""; |
| | | dockControl=mapper.writeValueAsString(receiver); |
| | | |
| | | _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl, ""); |
| | | |
| | | // DockControlProgressWebSockerHandler. |
| | | } |
| | |
| | | // 3. 处理订阅/取消订阅逻辑 |
| | | handleSubscription(userId, messageType, payload); |
| | | |
| | | // 直播类型订阅:触发开启直播 |
| | | if (MessageType.LIVESTREAM.getType().equals(messageType) && payload.isSubscribe()) { |
| | | String sn = payload.getSn(); |
| | | _liveStreamService.StartLiveStreaming(sn,userId); |
| | | log.info("设备[{}]直播流已开启(用户[{}]订阅触发)", sn, userId); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("用户[{}]消息处理异常", userId, e); |
| | | sendMessage(session, "消息格式错误或处理失败:" + e.getMessage()); |
| | |
| | | subscriptions.computeIfAbsent(subscriptionKey, k -> ConcurrentHashMap.newKeySet()).add(userId); |
| | | // log.info("用户[{}]订阅设备[{}]的[{}]类型消息", userId, sn, type); |
| | | |
| | | // 直播类型订阅:触发开启直播 |
| | | if (MessageType.LIVESTREAM.getType().equals(type)) { |
| | | _liveStreamService.StartLiveStreaming(sn); |
| | | log.info("设备[{}]直播流已开启(用户[{}]订阅触发)", sn, userId); |
| | | } |
| | | // // 直播类型订阅:触发开启直播 |
| | | // if (MessageType.LIVESTREAM.getType().equals(type)) { |
| | | // _liveStreamService.StartLiveStreaming(sn); |
| | | // log.info("设备[{}]直播流已开启(用户[{}]订阅触发)", sn, userId); |
| | | // } |
| | | } else { |
| | | // 取消订阅操作 |
| | | if (subscriptions.containsKey(subscriptionKey)) { |
| | |
| | | * @param type 消息类型(对应MessageType) |
| | | * @param content 消息内容(JSON字符串) |
| | | */ |
| | | public void sendMessageToSubscribers(String sn, String type, String content) { |
| | | public void sendMessageToSubscribers(String sn, String type, String content, String uId) { |
| | | String subscriptionKey = getSubscriptionKey(sn, type); |
| | | Set<String> subscriberIds = subscriptions.getOrDefault(subscriptionKey, Collections.emptySet()); |
| | | |
| | |
| | | |
| | | // 线程安全发送消息 |
| | | try { |
| | | if(MessageType.LIVESTREAM.getType().equals(type)) { |
| | | WebSocketSession liveSession = userSessions.get(uId); |
| | | sendMessage(liveSession, content); |
| | | log.info("单独向用户[{}]推送设备[{}]的[{}]类型消息:{}", uId, sn, type, content); |
| | | return; |
| | | } |
| | | sendMessage(session, content); |
| | | log.debug("向用户[{}]推送设备[{}]的[{}]类型消息:{}", userId, sn, type, content); |
| | | } catch (IOException e) { |
| | |
| | | /** |
| | | * 开启直播 |
| | | */ |
| | | public void StartLiveStreaming(String sn) { |
| | | public void StartLiveStreaming(String sn ,String userId) { |
| | | //调用开始直播 |
| | | ResponseResult rlive = null; |
| | | String resultLive = ""; |
| | |
| | | } |
| | | } |
| | | } |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.LIVESTREAM.getType(), resultLive, userId); |
| | | log.info("SN: {}-直播地址:{}", sn, resultLive); |
| | | } catch (Exception e) { |
| | | log.info("SN: {}-开启直播失败!原因:{}", sn, e.getMessage()); |
| | |
| | | e.printStackTrace(); |
| | | } |
| | | // 设备控制进度消息websocket发给前端 |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.PROGRESS.getType(), dockProgress); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.PROGRESS.getType(), dockProgress, ""); |
| | | |
| | | if (receiver.getNeedReply() != null && receiver.getNeedReply() == 1) { |
| | | String topic = headers.get(MqttHeaders.RECEIVED_TOPIC) + TopicConst._REPLY_SUF; |
| | |
| | | wsMessage.getData().setHost(data); |
| | | |
| | | // 发送给websocket客户端 |
| | | _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd, ""); |
| | | |
| | | sendMessageService.sendBatch(webSessions, wsMessage); |
| | | this.pushTelemetryData(data, device.getDeviceSn()); |
| | |
| | | package com.ard.sample.manage.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.ard.common.core.domain.model.LoginUser; |
| | | import com.ard.common.utils.SecurityUtils; |
| | | import com.ard.device.camera.domain.ArdCamera; |
| | | import com.ard.device.camera.service.IArdCameraService; |
| | | import com.ard.device.channel.domain.ArdChannel; |
| | |
| | | //region 单独写一个方法做权限验证,由于有好多定时任务也在实时获取设备列表,原方法不适用再添加权限注解 |
| | | @Override |
| | | public List<DeviceDTO> getDockList(String nickname) { |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | List<DeviceDTO> devicesList = this.getDockListByParams( |
| | | DeviceQueryParam.builder() |
| | | .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal())) |
| | |
| | | .build()); |
| | | // 在獲取设备列表时,顺便获取直播地址 |
| | | for(DeviceDTO devices : devicesList){ |
| | | _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn()); |
| | | _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn()); |
| | | _liveStreamHandler.StartLiveStreaming(devices.getDeviceSn(), loginUser.getUserId().toString()); |
| | | _liveStreamHandler.StartLiveStreaming(devices.getChildDeviceSn(), loginUser.getUserId().toString()); |
| | | ArdCamera ardCamera = new ArdCamera(); |
| | | ardCamera.setDockId(devices.getId()); |
| | | List<ArdCamera> ardCameraList = _cameraService.selectArdCameraList(ardCamera); |
| | |
| | | wsMessage.getData().setHost(data); |
| | | sendMessageService.sendBatch(webSessions, wsMessage); |
| | | // 发送给websocket客户端 |
| | | _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd, ""); |
| | | } |
| | | } |
| | | } |
| | |
| | | String json = getJSONString(MessageType.STATE.getType(), device.getDeviceSn(), dockStatus, droneStatus); |
| | | |
| | | // 发送给websocket客户端 |
| | | _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATE.getType(), json); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATE.getType(), json, ""); |
| | | } |
| | | } |
| | | |
| | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | _dockWebSocketHandler.sendMessageToSubscribers(dockSn, MessageType.STATUS.getType(), json); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(dockSn, MessageType.STATUS.getType(), json, ""); |
| | | } |
| | | |
| | | /** |
| | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | _dockWebSocketHandler.sendMessageToSubscribers(jobArr[0], MessageType.STATUS.getType(), json); |
| | | _dockWebSocketHandler.sendMessageToSubscribers(jobArr[0], MessageType.STATUS.getType(), json, ""); |
| | | log.info("定时任务自定义状态为待执行,json: {}", json); |
| | | // endregion |
| | | long now = System.currentTimeMillis(); |