Przeglądaj źródła

1、设备推流开始、结束任务reply消息处理
2、增加任务状态变更接口
3、截图、推流V2版本

lihao16 5 miesięcy temu
rodzic
commit
403518b541

+ 1 - 1
smsb-admin/src/main/resources/application-dev.yml

@@ -55,7 +55,7 @@ spring:
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
           # url: jdbc:mysql://localhost:3306/smsb-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
-          url: jdbc:mysql://117.73.3.135:3306/smsb-plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://117.73.3.135:3306/smsb-plus-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
           # password: password
           password: Hycpb@123

+ 3 - 0
smsb-admin/src/main/resources/application.yml

@@ -42,6 +42,9 @@ server:
       worker: 256
   # 文件临时目录
   tempDir: /home/inspur/temp
+  # zlm4j 服务IP
+  zlm4j:
+    ip: 192.168.32.104
 
 # 日志配置
 logging:

+ 14 - 2
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/constants/DeviceTaskConstants.java

@@ -26,8 +26,8 @@ public class DeviceTaskConstants {
     /** 截屏 */
     public static final Integer DEVICE_TASK_SCREENSHOT = 1006;
 
-    /** 推流 */
-    public static final Integer DEVICE_TASK_STREAM = 1007;
+    /** 开始推流 */
+    public static final Integer DEVICE_TASK_STREAM_START = 1007;
 
     /** APP重启 */
     public static final Integer DEVICE_TASK_RESTART_APP = 1008;
@@ -35,10 +35,22 @@ public class DeviceTaskConstants {
     /** 亮度调节 */
     public static final Integer DEVICE_TASK_BRIGHTNESS = 1009;
 
+    /** 结束推流 */
+    public static final Integer DEVICE_TASK_STREAM_STOP = 1010;
+
     /** 设备任务类型 end */
 
     /** 设备任务状态 begin */
+    /** 任务获取 */
     public static final Integer DEVICE_TASK_STATUS_INIT = 2001;
+    /** 任务执行 */
+    public static final Integer DEVICE_TASK_STATUS_EXECUTE = 2002;
+
+
+    /** 节目更新 */
+    // 2001任务获取 获取时间线 获取节目单 验证素材 开始下载 下载完成 开始播放 2999任务完成
 
+    /** 任务完成 */
+    public static final Integer DEVICE_TASK_STATUS_END = 2999;
     /** 设备任务状态 end */
 }

+ 8 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/ISmsbDeviceTaskService.java

@@ -91,4 +91,12 @@ public interface ISmsbDeviceTaskService {
      * @return
      */
     List<SmsbDeviceTaskDetailVo> getDetailList(Long id);
+
+    /**
+     * 上传任务状态
+     * @param taskId
+     * @param taskStatus
+     * @return
+     */
+    R<Void> uploadTaskStatus(Long taskId, Integer taskStatus);
 }

+ 12 - 1
smsb-modules/smsb-device/src/main/java/com/inspur/device/service/impl/SmsbDeviceTaskServiceImpl.java

@@ -87,7 +87,18 @@ public class SmsbDeviceTaskServiceImpl implements ISmsbDeviceTaskService {
 
     @Override
     public List<SmsbDeviceTaskDetailVo> getDetailList(Long id) {
-        return smsbDeviceTaskDetailMapper.selectVoList(new LambdaQueryWrapper<SmsbDeviceTaskDetail>().eq(SmsbDeviceTaskDetail::getTaskId,id));
+        return smsbDeviceTaskDetailMapper.selectVoList(new LambdaQueryWrapper<SmsbDeviceTaskDetail>().eq(SmsbDeviceTaskDetail::getTaskId, id));
+    }
+
+    @Override
+    public R<Void> uploadTaskStatus(Long taskId, Integer taskStatus) {
+        SmsbDeviceTask smsbDeviceTask = baseMapper.selectById(taskId);
+        SmsbDeviceTaskDetail deviceTaskDetail = new SmsbDeviceTaskDetail();
+        deviceTaskDetail.setTaskId(taskId);
+        deviceTaskDetail.setTaskStatus(taskStatus);
+        deviceTaskDetail.setTenantId(smsbDeviceTask.getTenantId());
+        smsbDeviceTaskDetailMapper.insert(deviceTaskDetail);
+        return R.ok();
     }
 
     /**

+ 69 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/TaskScreenshotHandler.java

@@ -0,0 +1,69 @@
+package com.inspur.netty.handler;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.inspur.device.domain.SmsbDeviceTask;
+import com.inspur.device.domain.SmsbDeviceTaskDetail;
+import com.inspur.device.domain.constants.DeviceTaskConstants;
+import com.inspur.device.domain.vo.SmsbDeviceTaskVo;
+import com.inspur.device.domain.vo.SmsbDeviceVo;
+import com.inspur.device.mapper.SmsbDeviceTaskDetailMapper;
+import com.inspur.device.mapper.SmsbDeviceTaskMapper;
+import com.inspur.device.service.ISmsbDeviceService;
+import com.inspur.device.service.impl.SmsbDeviceServiceImpl;
+import com.inspur.netty.message.receive.ReceiveMessageType;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.SpringUtils;
+
+/**
+ * 截屏回复
+ *
+ * @author lihao16
+ */
+@Slf4j
+public class TaskScreenshotHandler extends ChannelInboundHandlerAdapter {
+
+    private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(SmsbDeviceServiceImpl.class);
+
+    private static final SmsbDeviceTaskMapper smsbDeviceTaskMapper = SpringUtils.getBean(SmsbDeviceTaskMapper.class);
+
+    private static final SmsbDeviceTaskDetailMapper smsbDeviceTaskDetailMapper = SpringUtils.getBean(SmsbDeviceTaskDetailMapper.class);
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) {
+        String message = (String) msg;
+        // 处理截屏回复reply消息
+        if (message.contains(ReceiveMessageType.CONTROL_SCREENSHOT_REPLAY.getValue())) {
+            log.info("收到设备截屏回复消息:{}", message);
+            String identifier = message.split("/")[0];
+            // 1、 查询当前设备最近一条重启设备任务
+            SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
+            if (null == smsbDeviceVo) {
+                log.error("未查询到设备信息:{}", identifier);
+                return;
+            }
+            LambdaQueryWrapper<SmsbDeviceTask> lqw = Wrappers.lambdaQuery();
+            lqw.eq(SmsbDeviceTask::getIdentifier, identifier);
+            lqw.eq(SmsbDeviceTask::getTaskType, DeviceTaskConstants.DEVICE_TASK_SCREENSHOT);
+            lqw.orderByDesc(SmsbDeviceTask::getCreateTime);
+            lqw.last("limit 1");
+            SmsbDeviceTaskVo smsbDeviceTask = smsbDeviceTaskMapper.selectVoOne(lqw);
+            if (null == smsbDeviceTask) {
+                log.error("未查询到设备截屏任务:{}", identifier);
+                return;
+            }
+            // 2、收到回复 认定接收任务
+            SmsbDeviceTaskDetail taskDetail = new SmsbDeviceTaskDetail();
+            taskDetail.setTaskId(smsbDeviceTask.getId());
+            taskDetail.setTaskStatus(DeviceTaskConstants.DEVICE_TASK_STATUS_INIT);
+            taskDetail.setTenantId(smsbDeviceVo.getTenantId());
+            smsbDeviceTaskDetailMapper.insert(taskDetail);
+
+        } else {
+            ctx.fireChannelRead(message);
+        }
+    }
+
+}

+ 69 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/TaskStreamStartHandler.java

@@ -0,0 +1,69 @@
+package com.inspur.netty.handler;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.inspur.device.domain.SmsbDeviceTask;
+import com.inspur.device.domain.SmsbDeviceTaskDetail;
+import com.inspur.device.domain.constants.DeviceTaskConstants;
+import com.inspur.device.domain.vo.SmsbDeviceTaskVo;
+import com.inspur.device.domain.vo.SmsbDeviceVo;
+import com.inspur.device.mapper.SmsbDeviceTaskDetailMapper;
+import com.inspur.device.mapper.SmsbDeviceTaskMapper;
+import com.inspur.device.service.ISmsbDeviceService;
+import com.inspur.device.service.impl.SmsbDeviceServiceImpl;
+import com.inspur.netty.message.receive.ReceiveMessageType;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.SpringUtils;
+
+/**
+ * 开始推流回复
+ *
+ * @author lihao16
+ */
+@Slf4j
+public class TaskStreamStartHandler extends ChannelInboundHandlerAdapter {
+
+    private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(SmsbDeviceServiceImpl.class);
+
+    private static final SmsbDeviceTaskMapper smsbDeviceTaskMapper = SpringUtils.getBean(SmsbDeviceTaskMapper.class);
+
+    private static final SmsbDeviceTaskDetailMapper smsbDeviceTaskDetailMapper = SpringUtils.getBean(SmsbDeviceTaskDetailMapper.class);
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) {
+        String message = (String) msg;
+        // 处理开始推流回复reply消息
+        if (message.contains(ReceiveMessageType.CONTROL_START_STREAM_REPLAY.getValue())) {
+            log.info("收到设备开始推流回复消息:{}", message);
+            String identifier = message.split("/")[0];
+            // 1、 查询当前设备最近一条重启设备任务
+            SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
+            if (null == smsbDeviceVo) {
+                log.error("未查询到设备信息:{}", identifier);
+                return;
+            }
+            LambdaQueryWrapper<SmsbDeviceTask> lqw = Wrappers.lambdaQuery();
+            lqw.eq(SmsbDeviceTask::getIdentifier, identifier);
+            lqw.eq(SmsbDeviceTask::getTaskType, DeviceTaskConstants.DEVICE_TASK_STREAM_START);
+            lqw.orderByDesc(SmsbDeviceTask::getCreateTime);
+            lqw.last("limit 1");
+            SmsbDeviceTaskVo smsbDeviceTask = smsbDeviceTaskMapper.selectVoOne(lqw);
+            if (null == smsbDeviceTask) {
+                log.error("未查询到设备开始推流任务:{}", identifier);
+                return;
+            }
+            // 2、收到回复 认定接收任务
+            SmsbDeviceTaskDetail taskDetail = new SmsbDeviceTaskDetail();
+            taskDetail.setTaskId(smsbDeviceTask.getId());
+            taskDetail.setTaskStatus(DeviceTaskConstants.DEVICE_TASK_STATUS_INIT);
+            taskDetail.setTenantId(smsbDeviceVo.getTenantId());
+            smsbDeviceTaskDetailMapper.insert(taskDetail);
+
+        } else {
+            ctx.fireChannelRead(message);
+        }
+    }
+
+}

+ 69 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/TaskStreamStopHandler.java

@@ -0,0 +1,69 @@
+package com.inspur.netty.handler;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.inspur.device.domain.SmsbDeviceTask;
+import com.inspur.device.domain.SmsbDeviceTaskDetail;
+import com.inspur.device.domain.constants.DeviceTaskConstants;
+import com.inspur.device.domain.vo.SmsbDeviceTaskVo;
+import com.inspur.device.domain.vo.SmsbDeviceVo;
+import com.inspur.device.mapper.SmsbDeviceTaskDetailMapper;
+import com.inspur.device.mapper.SmsbDeviceTaskMapper;
+import com.inspur.device.service.ISmsbDeviceService;
+import com.inspur.device.service.impl.SmsbDeviceServiceImpl;
+import com.inspur.netty.message.receive.ReceiveMessageType;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.SpringUtils;
+
+/**
+ * 开始推流回复
+ *
+ * @author lihao16
+ */
+@Slf4j
+public class TaskStreamStopHandler extends ChannelInboundHandlerAdapter {
+
+    private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(SmsbDeviceServiceImpl.class);
+
+    private static final SmsbDeviceTaskMapper smsbDeviceTaskMapper = SpringUtils.getBean(SmsbDeviceTaskMapper.class);
+
+    private static final SmsbDeviceTaskDetailMapper smsbDeviceTaskDetailMapper = SpringUtils.getBean(SmsbDeviceTaskDetailMapper.class);
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) {
+        String message = (String) msg;
+        // 处理结束推流回复reply消息
+        if (message.contains(ReceiveMessageType.CONTROL_STOP_STREAM_REPLAY.getValue())) {
+            log.info("收到设备结束推流回复消息:{}", message);
+            String identifier = message.split("/")[0];
+            // 1、 查询当前设备最近一条重启设备任务
+            SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceByIdentifier(identifier);
+            if (null == smsbDeviceVo) {
+                log.error("未查询到设备信息:{}", identifier);
+                return;
+            }
+            LambdaQueryWrapper<SmsbDeviceTask> lqw = Wrappers.lambdaQuery();
+            lqw.eq(SmsbDeviceTask::getIdentifier, identifier);
+            lqw.eq(SmsbDeviceTask::getTaskType, DeviceTaskConstants.DEVICE_TASK_STREAM_STOP);
+            lqw.orderByDesc(SmsbDeviceTask::getCreateTime);
+            lqw.last("limit 1");
+            SmsbDeviceTaskVo smsbDeviceTask = smsbDeviceTaskMapper.selectVoOne(lqw);
+            if (null == smsbDeviceTask) {
+                log.error("未查询到设备结束推流任务:{}", identifier);
+                return;
+            }
+            // 2、收到回复 认定接收任务
+            SmsbDeviceTaskDetail taskDetail = new SmsbDeviceTaskDetail();
+            taskDetail.setTaskId(smsbDeviceTask.getId());
+            taskDetail.setTaskStatus(DeviceTaskConstants.DEVICE_TASK_STATUS_INIT);
+            taskDetail.setTenantId(smsbDeviceVo.getTenantId());
+            smsbDeviceTaskDetailMapper.insert(taskDetail);
+
+        } else {
+            ctx.fireChannelRead(message);
+        }
+    }
+
+}

+ 2 - 2
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/message/push/PushMessageType.java

@@ -75,12 +75,12 @@ public enum PushMessageType {
     /**
      * 开始推流
      */
-    CONTROL_START_STREAM("/stream/start"),
+    CONTROL_START_STREAM("/start/screenstream"),
 
     /**
      * 停止推流
      */
-    CONTROL_STOP_STREAM("/stream/stop"),
+    CONTROL_STOP_STREAM("/stop/screenstream"),
 
     /**
      * 检查OTA升级

+ 10 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/message/receive/ReceiveMessageType.java

@@ -43,6 +43,16 @@ public enum ReceiveMessageType {
      */
     CONTROL_SCREENSHOT_REPLAY("/start/screenshot/reply"),
 
+    /**
+     * 设备开始推流
+     */
+    CONTROL_START_STREAM_REPLAY("/start/screenstream/reply"),
+
+    /**
+     * 设备结束推流
+     */
+    CONTROL_STOP_STREAM_REPLAY("/stop/screenstream/reply"),
+
     /**
      * 检查OTA 消息回复
      * {identifier}/ota/check/replay/{OTAId}/{status}

+ 4 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/server/NettyServer.java

@@ -61,6 +61,10 @@ public class NettyServer {
                             channel.pipeline().addLast(new TaskStandbyHandler());
                             channel.pipeline().addLast(new TaskRestartDeviceHandler());
                             channel.pipeline().addLast(new TaskVolumeSetHandler());
+                            channel.pipeline().addLast(new TaskBrightSetHandler());
+                            channel.pipeline().addLast(new TaskScreenshotHandler());
+                            channel.pipeline().addLast(new TaskStreamStartHandler());
+                            channel.pipeline().addLast(new TaskStreamStopHandler());
                         }
                     });
             ChannelFuture f = b.bind(8990).sync();

+ 5 - 8
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/stream/callback/MKPublishCallBack.java

@@ -9,8 +9,6 @@ import com.inspur.device.service.ISmsbDeviceService;
 import com.sun.jna.CallbackThreadInitializer;
 import com.sun.jna.Native;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -48,25 +46,24 @@ public class MKPublishCallBack implements IMKPublishCallBack {
         //这里拿到访问路径后(例如rtmp://xxxx/xxx/xxx?token=xxxx其中?后面就是拿到的参数)的参数
         // err_msg返回 空字符串表示鉴权成功 否则鉴权失败提示
         // String Identifier = ZLM_API.mk_media_info_get_params(urlInfo);
-        String Identifier = ZLM_API.mk_media_info_get_stream(urlInfo).split("_")[0];
+        String identifier = ZLM_API.mk_media_info_get_stream(urlInfo).split("_")[0];
 
         // System.out.println("stream : " + stream);
         // String Identifier = stream.split("/")[2];
-        log.info("MKPublishCallBack : device Identifier = " + Identifier);
+        log.info("MKPublishCallBack : device Identifier = " + identifier);
         // 根据mac地址获取设备信息
-        SmsbDeviceVo smsbDevice = smsbDeviceService.getDeviceByIdentifier(Identifier);
+        SmsbDeviceVo smsbDevice = smsbDeviceService.getDeviceByIdentifier(identifier);
         if (smsbDevice == null) {
             ZLM_API.mk_publish_auth_invoker_do(invoker, "当前设备无权限接入", 0, 0);
             return;
         }
         // 鉴权成功 查看redis是否存在缓存的推流地址,如果没有禁止接入
-        String pushUrl = RedisUtils.getCacheObject(DEVICE_STREAM_PUSH_KEY + smsbDevice.getId());
+        /*String pushUrl = RedisUtils.getCacheObject(DEVICE_STREAM_PUSH_KEY + smsbDevice.getId());
         if (StringUtils.isEmpty(pushUrl)) {
             ZLM_API.mk_publish_auth_invoker_do(invoker, "当前设备接入流地址已失效", 0, 0);
             return;
-        }
+        }*/
         // 正常推流
         ZLM_API.mk_publish_auth_invoker_do(invoker,"",0,0);
-
     }
 }

+ 57 - 0
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/stream/service/impl/StreamServiceImpl.java

@@ -1,8 +1,10 @@
 package com.inspur.netty.stream.service.impl;
 
 import com.aizuda.zlm4j.structure.MK_MEDIA_SOURCE;
+import com.inspur.device.domain.constants.DeviceTaskConstants;
 import com.inspur.device.domain.vo.SmsbDeviceVo;
 import com.inspur.device.service.ISmsbDeviceService;
+import com.inspur.device.service.ISmsbDeviceTaskService;
 import com.inspur.netty.domain.MediaServerConstants;
 import com.inspur.netty.domain.vo.StartStreamResultVo;
 import com.inspur.netty.message.push.PushMessageType;
@@ -12,6 +14,7 @@ import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.time.Duration;
@@ -32,6 +35,9 @@ public class StreamServiceImpl implements IStreamService {
 
     private static final String DEVICE_STREAM_VIEW_KEY = "global:stream:device:view:";
 
+    @Value("${server.zlm4j.ip}")
+    private String zlmIp;
+
     private static final String schema = "rtmp";
 
     private static final String app = "live";
@@ -39,9 +45,32 @@ public class StreamServiceImpl implements IStreamService {
     @Autowired
     private ISmsbDeviceService smsbDeviceService;
 
+    @Autowired
+    private ISmsbDeviceTaskService smsbDeviceTaskService;
 
     @Override
     public StartStreamResultVo startStream(Long deviceId) {
+        StartStreamResultVo resultVo = new StartStreamResultVo();
+        resultVo.setPushResult(true);
+        // 1 根据设备ID查询设备信息
+        SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
+        // 2 生成推流地址
+        String streamUrl = schema + "://" + zlmIp + ":1935/" + app + "/" + smsbDeviceVo.getIdentifier();
+        // 3 前端看流地址为flv
+        String viewUrl = "http://" + zlmIp + ":7788/" + app + "/" + smsbDeviceVo.getIdentifier() + ".live.flv";
+        // 4 任务中心创建任务
+        String taskParam = PushMessageType.CONTROL_START_STREAM.getValue();
+        smsbDeviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_STREAM_START, smsbDeviceVo, taskParam);
+        // 5 发送netty消息,通知设备开始推流
+        String nettyMessage = PushMessageType.CONTROL_START_STREAM.getValue() + "|" + streamUrl;
+        // boolean pushResult = PushMsgUtil.sendV2(smsbDeviceVo.getIdentifier(), nettyMessage);
+        boolean pushResult = true;
+        resultVo.setPushResult(pushResult);
+        resultVo.setViewUrl(viewUrl);
+        return resultVo;
+    }
+
+    public StartStreamResultVo startStreamV1(Long deviceId) {
         StartStreamResultVo resultVo = new StartStreamResultVo();
         resultVo.setPushResult(true);
         // 根据设备ID查询设备信息
@@ -77,6 +106,34 @@ public class StreamServiceImpl implements IStreamService {
 
     @Override
     public void stopView(Long deviceId) {
+        // 1 根据设备ID查询设备信息
+        SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
+        String nettyMessage = PushMessageType.CONTROL_STOP_STREAM.getValue();
+        String streamUrl = schema + "://" + zlmIp + ":1935/" + app + "/" + smsbDeviceVo.getIdentifier();
+        // 2 根据当前流地址查询观看人数
+        MK_MEDIA_SOURCE mkMediaSource = ZLM_API.mk_media_source_find2(schema, MediaServerConstants.DEFAULT_VHOST, app, streamUrl, 0);
+        if (mkMediaSource == null) {
+            // 强制关闭
+            // 3 任务中心创建任务
+            String taskParam = PushMessageType.CONTROL_STOP_STREAM.getValue();
+            smsbDeviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_STREAM_STOP, smsbDeviceVo, taskParam);
+            PushMsgUtil.sendV2(smsbDeviceVo.getIdentifier(), nettyMessage);
+            return;
+        }
+        int readerCount = ZLM_API.mk_media_source_get_reader_count(mkMediaSource);
+        if (readerCount > 1) {
+            // 说明不止一个人在观看
+
+        } else {
+            // 3 任务中心创建任务
+            String taskParam = PushMessageType.CONTROL_STOP_STREAM.getValue();
+            smsbDeviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_STREAM_STOP, smsbDeviceVo, taskParam);
+            // 强制关闭
+            PushMsgUtil.sendV2(smsbDeviceVo.getIdentifier(), nettyMessage);
+        }
+    }
+
+    public void stopViewV1(Long deviceId) {
         String pushUrl = RedisUtils.getCacheObject(DEVICE_STREAM_PUSH_KEY + deviceId);
         if (StringUtils.isEmpty(pushUrl)) {
             return;

+ 12 - 0
smsb-modules/smsb-source/src/main/java/com/inspur/source/controller/SmsbFrontController.java

@@ -137,4 +137,16 @@ public class SmsbFrontController {
         return smsbDeviceTaskService.getDeviceTask(identifier,taskType);
     }
 
+    /**
+     * 前端设备上报任务状态接口
+     *
+     * @param taskId
+     * @param taskStatus
+     */
+    @SaIgnore
+    @GetMapping("/task/status")
+    public R<Void> uploadTaskStatus(@RequestParam("taskId") Long taskId,@RequestParam("taskStatus") Integer taskStatus) {
+        return smsbDeviceTaskService.uploadTaskStatus(taskId,taskStatus);
+    }
+
 }

+ 4 - 4
smsb-plus-ui/src/views/smsb/device/index.vue

@@ -242,7 +242,7 @@
           <!-- 亮度 -->
           <div class="slider-block">
             <span style="width: 50px">亮度</span>
-            <el-slider v-model="deviceRunInfo.bright" :disabled="true" :step="10" show-stops />
+            <el-slider v-model="deviceRunInfo.bright" :disabled="true" :min="0" :max="255" :step="25.5" show-stops />
           </div>
 
           <div>
@@ -340,8 +340,8 @@
       </template>
     </el-dialog>
     <!--亮度调节弹窗-->
-    <el-dialog v-model="brightDialog.visible" :title="brightDialog.title" width="600px" append-to-body>
-      <el-slider style="margin: 20px" v-model="brightnessValue" :min="0" :max="100" :step="10" show-stops />
+    <el-dialog v-model="brightDialog.visible" :title="brightDialog.title" width="700px" append-to-body>
+      <el-slider style="margin: 20px" v-model="brightnessValue" :min="0" :max="255" :step="1"  />
       <template #footer>
         <div class="dialog-footer">
           <el-button :loading="buttonLoading" type="primary" @click="brightSubmit">确 定</el-button>
@@ -561,7 +561,7 @@ const volumeCancel = () => {
   buttonLoading.value = false;
 }
 const brightCancel = () => {
-  voiceDialog.visible = false;
+  brightDialog.visible = false;
   buttonLoading.value = false;
 }
 const handleVoice = () => {