From a2bea34ac114e5b37dfb3b61612dc2e2a9112bd9 Mon Sep 17 00:00:00 2001
From: lawrencehj <1934378145@qq.com>
Date: 星期日, 14 三月 2021 21:03:53 +0800
Subject: [PATCH] 增加上级平台查询DeviceInfo和DeviceStatus的响应功能
---
src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java | 81 ++++++++++++++++++++++++++++++++++++++--
1 files changed, 77 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java
index f4bdd2b..db1e345 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java
@@ -4,19 +4,27 @@
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaServerConfig;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
+import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
+import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
+import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import com.genersoft.iot.vmp.vmanager.play.PlayController;
+import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.async.DeferredResult;
-import java.text.DecimalFormat;
+import javax.sip.message.Response;
+import java.util.UUID;
@Service
public class PlayServiceImpl implements IPlayService {
@@ -27,10 +35,75 @@
private IVideoManagerStorager storager;
@Autowired
+ private SIPCommander cmder;
+
+ @Autowired
private IRedisCatchStorage redisCatchStorage;
@Autowired
private DeferredResultHolder resultHolder;
+
+ @Autowired
+ private ZLMRESTfulUtils zlmresTfulUtils;
+
+
+ @Override
+ public PlayResult play(String deviceId, String channelId, ZLMHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent) {
+ PlayResult playResult = new PlayResult();
+ Device device = storager.queryVideoDevice(deviceId);
+ StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
+ playResult.setDevice(device);
+ UUID uuid = UUID.randomUUID();
+ playResult.setUuid(uuid.toString());
+ DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
+ playResult.setResult(result);
+ // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
+ resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid, result);
+
+ if (streamInfo == null) {
+ // 鍙戦�佺偣鎾秷鎭�
+ cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
+ logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
+ onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
+ if (hookEvent != null) {
+ hookEvent.response(response);
+ }
+ }, event -> {
+ RequestMessage msg = new RequestMessage();
+ msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
+ Response response = event.getResponse();
+ msg.setData(String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", response.getStatusCode(), response.getReasonPhrase()));
+ resultHolder.invokeResult(msg);
+ if (errorEvent != null) {
+ errorEvent.response(event);
+ }
+ });
+ } else {
+ String streamId = streamInfo.getStreamId();
+ JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId);
+ if (rtpInfo.getBoolean("exist")) {
+ RequestMessage msg = new RequestMessage();
+ msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
+ msg.setData(JSON.toJSONString(streamInfo));
+ resultHolder.invokeResult(msg);
+ } else {
+ redisCatchStorage.stopPlay(streamInfo);
+ storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
+ cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
+ logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
+ onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
+ }, event -> {
+ RequestMessage msg = new RequestMessage();
+ msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
+ Response response = event.getResponse();
+ msg.setData(String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", response.getStatusCode(), response.getReasonPhrase()));
+ resultHolder.invokeResult(msg);
+ });
+ }
+ }
+
+ return playResult;
+ }
@Override
public void onPublishHandlerForPlay(JSONObject resonse, String deviceId, String channelId, String uuid) {
@@ -41,7 +114,7 @@
DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
if (deviceChannel != null) {
deviceChannel.setStreamId(streamInfo.getStreamId());
- storager.updateChannel(deviceId, deviceChannel);
+ storager.startPlay(deviceId, channelId, streamInfo.getStreamId());
}
redisCatchStorage.startPlay(streamInfo);
@@ -75,7 +148,7 @@
StreamInfo streamInfo = new StreamInfo();
streamInfo.setStreamId(streamId);
streamInfo.setDeviceID(deviceId);
- streamInfo.setCahnnelId(channelId);
+ streamInfo.setChannelId(channelId);
MediaServerConfig mediaServerConfig = redisCatchStorage.getMediaInfo();
streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
--
Gitblit v1.8.0