package com.genersoft.iot.vmp.vmanager.server; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.VManageBootstrap; import com.genersoft.iot.vmp.common.VersionPo; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.VersionInfo; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.utils.SpringBeanFactory; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import gov.nist.javax.sip.SipStackImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.sip.ListeningPoint; import javax.sip.ObjectInUseException; import javax.sip.SipProvider; import java.util.Iterator; import java.util.List; import java.util.Set; @SuppressWarnings("rawtypes") @Api(tags = "服务控制") @CrossOrigin @RestController @RequestMapping("/api/server") public class ServerController { @Autowired private ConfigurableApplicationContext context; @Autowired private IMediaServerService mediaServerService; @Autowired private VersionInfo versionInfo; @Autowired private SipConfig sipConfig; @Autowired private UserSetting userSetting; @Autowired private DynamicTask dynamicTask; @Value("${server.port}") private int serverPort; @ApiOperation("流媒体服务列表") @GetMapping(value = "/media_server/list") @ResponseBody public WVPResult> getMediaServerList(boolean detail){ WVPResult> result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); result.setData(mediaServerService.getAll()); return result; } @ApiOperation("在线流媒体服务列表") @GetMapping(value = "/media_server/online/list") @ResponseBody public WVPResult> getOnlineMediaServerList(){ WVPResult> result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); result.setData(mediaServerService.getAllOnline()); return result; } @ApiOperation("获取流媒体服务") @GetMapping(value = "/media_server/one/{id}") @ResponseBody public WVPResult getMediaServer(@PathVariable String id){ WVPResult result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); result.setData(mediaServerService.getOne(id)); return result; } @ApiOperation("测试流媒体服务") @ApiImplicitParams({ @ApiImplicitParam(name="ip", value = "流媒体服务IP", dataTypeClass = String.class), @ApiImplicitParam(name="port", value = "流媒体服务HTT端口", dataTypeClass = Integer.class), @ApiImplicitParam(name="secret", value = "流媒体服务secret", dataTypeClass = String.class), }) @GetMapping(value = "/media_server/check") @ResponseBody public WVPResult checkMediaServer(@RequestParam String ip, @RequestParam int port, @RequestParam String secret){ return mediaServerService.checkMediaServer(ip, port, secret); } @ApiOperation("测试流媒体录像管理服务") @ApiImplicitParams({ @ApiImplicitParam(name="ip", value = "流媒体服务IP", dataTypeClass = String.class), @ApiImplicitParam(name="port", value = "流媒体服务HTT端口", dataTypeClass = Integer.class), @ApiImplicitParam(name="secret", value = "流媒体服务secret", dataTypeClass = String.class), }) @GetMapping(value = "/media_server/record/check") @ResponseBody public WVPResult checkMediaRecordServer(@RequestParam String ip, @RequestParam int port){ boolean checkResult = mediaServerService.checkMediaRecordServer(ip, port); WVPResult result = new WVPResult<>(); if (checkResult) { result.setCode(0); result.setMsg("success"); }else { result.setCode(-1); result.setMsg("连接失败"); } return result; } @ApiOperation("保存流媒体服务") @ApiImplicitParams({ @ApiImplicitParam(name="mediaServerItem", value = "流媒体信息", dataTypeClass = MediaServerItem.class) }) @PostMapping(value = "/media_server/save") @ResponseBody public WVPResult saveMediaServer(@RequestBody MediaServerItem mediaServerItem){ MediaServerItem mediaServerItemInDatabase = mediaServerService.getOne(mediaServerItem.getId()); if (mediaServerItemInDatabase != null) { if (StringUtils.isEmpty(mediaServerItemInDatabase.getSendRtpPortRange()) && StringUtils.isEmpty(mediaServerItem.getSendRtpPortRange())){ mediaServerItem.setSendRtpPortRange("30000,30500"); } mediaServerService.update(mediaServerItem); }else { if (StringUtils.isEmpty(mediaServerItem.getSendRtpPortRange())){ mediaServerItem.setSendRtpPortRange("30000,30500"); } return mediaServerService.add(mediaServerItem); } WVPResult result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); return result; } @ApiOperation("移除流媒体服务") @ApiImplicitParams({ @ApiImplicitParam(name="id", value = "流媒体ID", dataTypeClass = String.class) }) @DeleteMapping(value = "/media_server/delete") @ResponseBody public WVPResult deleteMediaServer(@RequestParam String id){ if (mediaServerService.getOne(id) != null) { mediaServerService.delete(id); mediaServerService.deleteDb(id); }else { WVPResult result = new WVPResult<>(); result.setCode(-1); result.setMsg("未找到此节点"); return result; } WVPResult result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); return result; } @ApiOperation("重启服务") @GetMapping(value = "/restart") @ResponseBody public Object restart(){ Thread restartThread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider"); SipStackImpl stack = (SipStackImpl)up.getSipStack(); stack.stop(); Iterator listener = stack.getListeningPoints(); while (listener.hasNext()) { stack.deleteListeningPoint((ListeningPoint) listener.next()); } Iterator providers = stack.getSipProviders(); while (providers.hasNext()) { stack.deleteSipProvider((SipProvider) providers.next()); } VManageBootstrap.restart(); } catch (InterruptedException ignored) { } catch (ObjectInUseException e) { e.printStackTrace(); } } }); restartThread.setDaemon(false); restartThread.start(); return "success"; } @ApiOperation("版本信息") @GetMapping(value = "/version") @ResponseBody public WVPResult getVersion(){ WVPResult result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); result.setData(versionInfo.getVersion()); return result; } @ApiOperation("配置信息") @GetMapping(value = "/config") @ApiImplicitParams({ @ApiImplicitParam(name="type", value = "配置类型(sip, base)", dataTypeClass = String.class), }) @ResponseBody public WVPResult getVersion(String type){ WVPResult result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); JSONObject jsonObject = new JSONObject(); jsonObject.put("server.port", serverPort); if (StringUtils.isEmpty(type)) { jsonObject.put("sip", JSON.toJSON(sipConfig)); jsonObject.put("base", JSON.toJSON(userSetting)); }else { switch (type){ case "sip": jsonObject.put("sip", sipConfig); break; case "base": jsonObject.put("base", userSetting); break; default: break; } } result.setData(jsonObject); return result; } // @ApiOperation("当前进行中的动态任务") // @GetMapping(value = "/dynamicTask") // @ResponseBody // public WVPResult getDynamicTask(){ // WVPResult result = new WVPResult<>(); // result.setCode(0); // result.setMsg("success"); // // JSONObject jsonObject = new JSONObject(); // // Set allKeys = dynamicTask.getAllKeys(); // jsonObject.put("server.port", serverPort); // if (StringUtils.isEmpty(type)) { // jsonObject.put("sip", JSON.toJSON(sipConfig)); // jsonObject.put("base", JSON.toJSON(userSetting)); // }else { // switch (type){ // case "sip": // jsonObject.put("sip", sipConfig); // break; // case "base": // jsonObject.put("base", userSetting); // break; // default: // break; // } // } // result.setData(jsonObject); // return result; // } }