| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package com.genersoft.iot.vmp.gb28181.task;
- import com.genersoft.iot.vmp.gb28181.bean.Device;
- import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
- import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
- import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
- import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
- import com.genersoft.iot.vmp.media.bean.MediaServer;
- import com.genersoft.iot.vmp.media.service.IMediaServerService;
- import com.genersoft.iot.vmp.gb28181.service.IDeviceService;
- import com.genersoft.iot.vmp.gb28181.service.IPlatformService;
- import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.CommandLineRunner;
- import org.springframework.core.annotation.Order;
- import org.springframework.stereotype.Component;
- import javax.sip.InvalidArgumentException;
- import javax.sip.SipException;
- import java.text.ParseException;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- /**
- * 系统启动时控制设备
- * @author lin
- */
- @Slf4j
- @Component
- @Order(value=14)
- public class SipRunner implements CommandLineRunner {
- @Autowired
- private IRedisCatchStorage redisCatchStorage;
- @Autowired
- private SSRCFactory ssrcFactory;
- @Autowired
- private IDeviceService deviceService;
- @Autowired
- private IMediaServerService mediaServerService;
- @Autowired
- private IPlatformService platformService;
- @Autowired
- private ISIPCommanderForPlatform commanderForPlatform;
- @Override
- public void run(String... args) throws Exception {
- List<Device> deviceList = deviceService.getAllOnlineDevice();
- for (Device device : deviceList) {
- if (deviceService.expire(device)){
- deviceService.offline(device.getDeviceId(), "注册已过期");
- }else {
- deviceService.online(device, null);
- }
- }
- // 重置cseq计数
- redisCatchStorage.resetAllCSEQ();
- // 清理redis
- // 清理数据库不存在但是redis中存在的数据
- List<Device> devicesInDb = deviceService.getAll();
- if (devicesInDb.size() == 0) {
- redisCatchStorage.removeAllDevice();
- }else {
- List<Device> devicesInRedis = redisCatchStorage.getAllDevices();
- if (devicesInRedis.size() > 0) {
- Map<String, Device> deviceMapInDb = new HashMap<>();
- devicesInDb.parallelStream().forEach(device -> {
- deviceMapInDb.put(device.getDeviceId(), device);
- });
- devicesInRedis.parallelStream().forEach(device -> {
- if (deviceMapInDb.get(device.getDeviceId()) == null) {
- redisCatchStorage.removeDevice(device.getDeviceId());
- }
- });
- }
- }
- // 查找国标推流
- List<SendRtpItem> sendRtpItems = redisCatchStorage.queryAllSendRTPServer();
- if (sendRtpItems.size() > 0) {
- for (SendRtpItem sendRtpItem : sendRtpItems) {
- MediaServer mediaServerItem = mediaServerService.getOne(sendRtpItem.getMediaServerId());
- redisCatchStorage.deleteSendRTPServer(sendRtpItem.getPlatformId(),sendRtpItem.getChannelId(), sendRtpItem.getCallId(),sendRtpItem.getStream());
- if (mediaServerItem != null) {
- ssrcFactory.releaseSsrc(sendRtpItem.getMediaServerId(), sendRtpItem.getSsrc());
- boolean stopResult = mediaServerService.initStopSendRtp(mediaServerItem, sendRtpItem.getApp(), sendRtpItem.getStream(), sendRtpItem.getSsrc());
- if (stopResult) {
- ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
- if (platform != null) {
- try {
- commanderForPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
- } catch (InvalidArgumentException | ParseException | SipException e) {
- log.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
- }
- }
- }
- }
- }
- }
- }
- }
|