| | |
| | | } |
| | | } |
| | | } else if (gbStream != null) { |
| | | if (streamPushItem.isStatus()) { |
| | | if (streamPushItem != null && streamPushItem.isStatus()) { |
| | | // 在线状态 |
| | | pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, |
| | | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
| | |
| | | notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, |
| | | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | } catch (SipException | InvalidArgumentException | ParseException e) { |
| | |
| | | */ |
| | | void online(List<StreamPushItemFromRedis> onlineStreams); |
| | | |
| | | /** |
| | | * 增加推流 |
| | | */ |
| | | boolean add(StreamPushItem stream); |
| | | } |
| | |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.jdbc.datasource.DataSourceTransactionManager; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.TransactionDefinition; |
| | | import org.springframework.transaction.TransactionStatus; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.util.*; |
| | |
| | | |
| | | @Autowired |
| | | private IMediaServerService mediaServerService; |
| | | |
| | | @Autowired |
| | | DataSourceTransactionManager dataSourceTransactionManager; |
| | | |
| | | @Autowired |
| | | TransactionDefinition transactionDefinition; |
| | | |
| | | @Override |
| | | public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) { |
| | |
| | | // 发送通知 |
| | | eventPublisher.catalogEventPublishForStream(null, onlinePushers, CatalogEvent.ON); |
| | | } |
| | | |
| | | @Override |
| | | public boolean add(StreamPushItem stream) { |
| | | stream.setUpdateTime(DateUtil.getNow()); |
| | | stream.setCreateTime(DateUtil.getNow()); |
| | | stream.setServerId(userSetting.getServerId()); |
| | | |
| | | // 放在事务内执行 |
| | | boolean result = false; |
| | | TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); |
| | | try { |
| | | int addStreamResult = streamPushMapper.add(stream); |
| | | if (!StringUtils.isEmpty(stream.getGbId())) { |
| | | gbStreamMapper.add(stream); |
| | | } |
| | | dataSourceTransactionManager.commit(transactionStatus); |
| | | result = true; |
| | | }catch (Exception e) { |
| | | logger.error("批量移除流与平台的关系时错误", e); |
| | | dataSourceTransactionManager.rollback(transactionStatus); |
| | | } |
| | | return result; |
| | | } |
| | | } |
| | |
| | | @Select("SELECT pc.* FROM platform_catalog pc WHERE pc.id = #{id}") |
| | | PlatformCatalog selectParentCatalog(String id); |
| | | |
| | | @Select("SELECT pc.id as channelId, pc.name, pc.civilCode, pc.businessGroupId,'0' as parental, pc.parentId " + |
| | | @Select("SELECT pc.id as channelId, pc.name, pc.civilCode, pc.businessGroupId,'1' as parental, pc.parentId " + |
| | | " FROM platform_catalog pc WHERE pc.platformId=#{platformId}") |
| | | List<DeviceChannel> queryCatalogInPlatform(String platformId); |
| | | } |
| | |
| | | if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) { |
| | | // 第一层节点 |
| | | platformCatalog.setBusinessGroupId(platformCatalog.getId()); |
| | | platformCatalog.setParentId(platform.getDeviceGBId()); |
| | | }else { |
| | | // 获取顶层的 |
| | | PlatformCatalog topCatalog = getTopCatalog(platformCatalog.getParentId(), platformCatalog.getPlatformId()); |
| | |
| | | } |
| | | if (platform.getTreeType().equals(TreeType.CIVIL_CODE)) { |
| | | platformCatalog.setCivilCode(platformCatalog.getId()); |
| | | if (platformCatalog.getPlatformId().equals(platformCatalog.getParentId())) { |
| | | // 第一层节点 |
| | | platformCatalog.setParentId(platform.getDeviceGBId()); |
| | | } |
| | | } |
| | | |
| | | int result = catalogMapper.add(platformCatalog); |
| | |
| | | this.data = data; |
| | | } |
| | | |
| | | |
| | | private int code; |
| | | private String msg; |
| | | private T data; |
| | |
| | | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| | | import com.genersoft.iot.vmp.gb28181.bean.PlatformCatalog; |
| | | import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; |
| | | import com.genersoft.iot.vmp.gb28181.bean.TreeType; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| | | import com.genersoft.iot.vmp.service.IPlatformChannelService; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | |
| | | if (logger.isDebugEnabled()) { |
| | | logger.debug("查询目录,platformId: {}, parentId: {}", platformId, parentId); |
| | | } |
| | | ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); |
| | | if (platform == null) { |
| | | return new ResponseEntity<>(new WVPResult<>(400, "平台未找到", null), HttpStatus.OK); |
| | | } |
| | | if (platformId.equals(parentId)) { |
| | | parentId = platform.getDeviceGBId(); |
| | | } |
| | | List<PlatformCatalog> platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId); |
| | | // 查询下属的国标通道 |
| | | // List<PlatformCatalog> catalogsForChannel = storager.queryChannelInParentPlatformAndCatalog(platformId, parentId); |
| | | // 查询下属的直播流通道 |
| | | // List<PlatformCatalog> catalogsForStream = storager.queryStreamInParentPlatformAndCatalog(platformId, parentId); |
| | | // platformCatalogList.addAll(catalogsForChannel); |
| | | // platformCatalogList.addAll(catalogsForStream); |
| | | // if (platform.getTreeType().equals(TreeType.BUSINESS_GROUP)) { |
| | | // platformCatalogList = storager.getChildrenCatalogByPlatform(platformId, parentId); |
| | | // }else { |
| | | // |
| | | // } |
| | | |
| | | WVPResult<List<PlatformCatalog>> result = new WVPResult<>(); |
| | | result.setCode(0); |
| | | result.setMsg("success"); |
| | |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * 获取推流播放地址 |
| | | * @param stream 推流信息 |
| | | * @return |
| | | */ |
| | | @ApiOperation("获取推流播放地址") |
| | | @ApiImplicitParams({ |
| | | @ApiImplicitParam(name = "stream", value = "推流信息", dataTypeClass = StreamPushItem.class), |
| | | }) |
| | | @PostMapping(value = "/add") |
| | | @ResponseBody |
| | | public WVPResult<StreamInfo> add(@RequestBody StreamPushItem stream){ |
| | | if (StringUtils.isEmpty(stream.getGbId())) { |
| | | |
| | | return new WVPResult<>(400, "国标ID不可为空", null); |
| | | } |
| | | if (StringUtils.isEmpty(stream.getApp()) && StringUtils.isEmpty(stream.getStream())) { |
| | | return new WVPResult<>(400, "app或stream不可为空", null); |
| | | } |
| | | stream.setStatus(false); |
| | | stream.setPushIng(false); |
| | | stream.setAliveSecond(0L); |
| | | stream.setTotalReaderCount("0"); |
| | | boolean result = streamPushService.add(stream); |
| | | |
| | | if (result) { |
| | | return new WVPResult<>(0, "success", null); |
| | | }else { |
| | | return new WVPResult<>(-1, "fail", null); |
| | | } |
| | | } |
| | | } |
| | |
| | | <el-button icon="el-icon-delete" size="mini" style="margin-right: 1rem;" |
| | | :disabled="multipleSelection.length === 0" type="danger" @click="batchDel">批量移除 |
| | | </el-button> |
| | | <el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStream">添加通道 |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button> |
| | | </div> |
| | | </div> |
| | |
| | | <script> |
| | | import streamProxyEdit from './dialog/StreamProxyEdit.vue' |
| | | import devicePlayer from './dialog/devicePlayer.vue' |
| | | import addStreamTOGB from './dialog/addStreamTOGB.vue' |
| | | import addStreamTOGB from './dialog/pushStreamEdit.vue' |
| | | import uiHeader from '../layout/UiHeader.vue' |
| | | import importChannel from './dialog/importChannel.vue' |
| | | import MediaServer from './service/MediaServer' |
| | |
| | | |
| | | }) |
| | | }, |
| | | addStream: function (){ |
| | | this.$refs.addStreamTOGB.openDialog(null, this.initData); |
| | | }, |
| | | batchDel: function () { |
| | | this.$confirm(`确定删除选中的${this.multipleSelection.length}个通道?`, '提示', { |
| | | confirmButtonText: '确定', |
| | |
| | | import devicePlayer from './dialog/devicePlayer.vue' |
| | | import uiHeader from '../layout/UiHeader.vue' |
| | | import moment from "moment"; |
| | | import DviceService from "./service/DeviceService"; |
| | | import DeviceService from "./service/DeviceService"; |
| | | import DeviceTree from "./common/DeviceTree"; |
| | | |
| | |
| | | changeSubchannel(itemData) { |
| | | this.beforeUrl = this.$router.currentRoute.path; |
| | | |
| | | var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}/${this.$router.currentRoute.params.count}/1` |
| | | var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}` |
| | | this.$router.push(url).then(() => { |
| | | this.searchSrt = ""; |
| | | this.channelType = ""; |
| | |
| | | }, |
| | | rules: { |
| | | name: [{ required: true, message: "请输入名称", trigger: "blur" }], |
| | | id: [{ trigger: "blur",validator: checkId }] |
| | | id: [{ required: true, trigger: "blur",validator: checkId }] |
| | | }, |
| | | }; |
| | | }, |
File was renamed from web_src/src/components/dialog/addStreamTOGB.vue |
| | |
| | | <el-input v-model="proxyParam.name" clearable></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="流应用名" prop="app"> |
| | | <el-input v-model="proxyParam.app" clearable :disabled="true"></el-input> |
| | | <el-input v-model="proxyParam.app" clearable :disabled="edit"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="流ID" prop="stream"> |
| | | <el-input v-model="proxyParam.stream" clearable :disabled="true"></el-input> |
| | | <el-input v-model="proxyParam.stream" clearable :disabled="edit"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="国标编码" prop="gbId"> |
| | | <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input> |
| | |
| | | <el-button type="primary" @click="onSubmit">保存</el-button> |
| | | <el-button @click="close">取消</el-button> |
| | | </div> |
| | | |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | |
| | | |
| | | <script> |
| | | export default { |
| | | name: "streamProxyEdit", |
| | | name: "pushStreamEdit", |
| | | props: {}, |
| | | computed: {}, |
| | | created() {}, |
| | |
| | | listChangeCallback: null, |
| | | showDialog: false, |
| | | isLoging: false, |
| | | edit: false, |
| | | proxyParam: { |
| | | name: null, |
| | | app: null, |
| | | stream: null, |
| | | gbId: null, |
| | | }, |
| | | |
| | | rules: { |
| | | name: [{ required: true, message: "请输入名称", trigger: "blur" }], |
| | | app: [{ required: true, message: "请输入应用名", trigger: "blur" }], |
| | |
| | | this.listChangeCallback = callback; |
| | | if (proxyParam != null) { |
| | | this.proxyParam = proxyParam; |
| | | } |
| | | this.edit = true |
| | | } |
| | | }, |
| | | onSubmit: function () { |
| | | console.log("onSubmit"); |
| | | var that = this; |
| | | that.$axios({ |
| | | method:"post", |
| | | url:`/api/push/save_to_gb`, |
| | | data: that.proxyParam |
| | | }).then(function (res) { |
| | | if (this.edit) { |
| | | this.$axios({ |
| | | method:"post", |
| | | url:`/api/push/save_to_gb`, |
| | | data: this.proxyParam |
| | | }).then( (res) => { |
| | | if (res.data == "success") { |
| | | that.$message({ |
| | | this.$message({ |
| | | showClose: true, |
| | | message: "保存成功", |
| | | type: "success", |
| | | }); |
| | | that.showDialog = false; |
| | | if (that.listChangeCallback != null) { |
| | | that.listChangeCallback(); |
| | | this.showDialog = false; |
| | | if (this.listChangeCallback != null) { |
| | | this.listChangeCallback(); |
| | | } |
| | | } |
| | | }).catch(function (error) { |
| | | }).catch((error)=> { |
| | | console.log(error); |
| | | }); |
| | | }); |
| | | }else { |
| | | this.$axios({ |
| | | method:"post", |
| | | url:`/api/push/add`, |
| | | data: this.proxyParam |
| | | }).then( (res) => { |
| | | if (res.data.code === 0) { |
| | | this.$message({ |
| | | showClose: true, |
| | | message: "保存成功", |
| | | type: "success", |
| | | }); |
| | | this.showDialog = false; |
| | | if (this.listChangeCallback != null) { |
| | | this.listChangeCallback(); |
| | | } |
| | | } |
| | | }).catch((error)=> { |
| | | console.log(error); |
| | | }); |
| | | } |
| | | |
| | | }, |
| | | close: function () { |
| | | console.log("关闭加入GB"); |
| | |
| | | if (this.platform.enable && this.platform.expires == "0") { |
| | | this.platform.expires = "300"; |
| | | } |
| | | }, |
| | | handleNodeClick: function (node){ |
| | | |
| | | } |
| | | }, |
| | | }; |