Pu Zhibing
1 天以前 cad8d3cdcb6253ef719bb9c85391df7d90d5ac59
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.ruoyi.dataInterchange.controller;
 
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.dataInterchange.api.vo.UPRealvideoMsgStartupAckVo;
import com.ruoyi.dataInterchange.dao.UPRealvideoMsgEndAckDao;
import com.ruoyi.dataInterchange.dao.UPRealvideoMsgStartupAckDao;
import com.ruoyi.dataInterchange.model.UPRealvideoMsgEndAck;
import com.ruoyi.dataInterchange.model.UPRealvideoMsgStartupAck;
import com.ruoyi.dataInterchange.server.DOWNRealvideoMsgEndService;
import com.ruoyi.dataInterchange.server.DOWNRealvideoMsgStartupService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
 
/**
 * 实时音视频控制器
 *
 * @author zhibing.pu
 * @Date 2025/3/21 11:11
 */
@RestController
@RequestMapping("/realVideoMsg")
public class RealVideoMsgController {
    
    @Resource
    private DOWNRealvideoMsgStartupService downRealvideoMsgStartupService;
    
    @Resource
    private UPRealvideoMsgStartupAckDao upRealvideoMsgStartupAckDao;
    
    @Resource
    private DOWNRealvideoMsgEndService downRealvideoMsgEndService;
    
    @Resource
    private UPRealvideoMsgEndAckDao upRealvideoMsgEndAckDao;
    
    
    /**
     * 发起实时音视频请求
     *
     * @param vehicleNo 车牌号
     * @return
     */
    @PostMapping("/startupRealVideo")
    public R<UPRealvideoMsgStartupAckVo> startupRealVideo(@RequestParam("inferiorPlatformId") Integer inferiorPlatformId, @RequestParam("vehicleNo") String vehicleNo) {
        R<String> realVideo = downRealvideoMsgStartupService.startupRealVideo(inferiorPlatformId, vehicleNo);
        if (realVideo.getCode() != 200) {
            return R.fail(realVideo.getMsg());
        }
        //发送成功,定时任务获取响应结果
        int num = 0;
        long now = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8));
        while (true) {
            UPRealvideoMsgStartupAck realvideoMsgStartupAck = upRealvideoMsgStartupAckDao.findByInferiorPlatformIdAndVehicleNoAndCreateTimeAfter(inferiorPlatformId, vehicleNo, now);
            if (null == realvideoMsgStartupAck) {
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                num++;
                continue;
            }
            if (null != realvideoMsgStartupAck) {
                int result = realvideoMsgStartupAck.getResult();
                switch (result){
                    case 0:
                        UPRealvideoMsgStartupAckVo vo = new UPRealvideoMsgStartupAckVo();
                        BeanUtils.copyProperties(realvideoMsgStartupAck, vo);
                        String encode = null;
                        try {
                            encode = URLEncoder.encode(vehicleNo, "UTF-8");
                        } catch (UnsupportedEncodingException e) {
                            throw new RuntimeException(e);
                        }
                        vo.setUrl("http://" + vo.getServerIP() + ":" + vo.getServerPort() + "/" + encode + "." + vo.getVehicleColor() + ".1.0." + realVideo.getData());
                        return R.ok(vo);
                    case 1:
                        return R.fail("发起实时音视频失败,可能是车辆离线导致");
                    case 2:
                        return R.fail("不支持实时音视频");
                    case 3:
                        return R.fail("实时音视频会话结束");
                    case 4:
                        return R.fail("实时音视频口令错误");
                    case 5:
                        return R.fail("实时音视频不满足跨域条件");
                    default:
                        return R.fail("发起实时音视频失败,可能是车辆离线导致");
                }
            }
            if (num >= 30) {
                return R.fail("发起实时音视频失败,可能是车辆离线导致");
            }
        }
    }
    
    
    /**
     * 主动请求停止实时音视频
     *
     * @param vehicleNo 车牌号
     * @return
     */
    @PostMapping("/stopRealVideo")
    public R<?> stopRealVideo(@RequestParam("inferiorPlatformId") Integer inferiorPlatformId, @RequestParam("vehicleNo") String vehicleNo) {
        R r = downRealvideoMsgEndService.stopRealVideo(inferiorPlatformId, vehicleNo);
        if (r.getCode() != 200) {
            return r;
        }
        //发送成功,定时任务获取响应结果
        int num = 0;
        Long now = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8));
        while (true) {
            UPRealvideoMsgEndAck upRealvideoMsgEndAck = upRealvideoMsgEndAckDao.findByInferiorPlatformIdAndVehicleNoAndCreateTimeAfter(inferiorPlatformId, vehicleNo, now);
            if (null == upRealvideoMsgEndAck) {
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                num++;
                continue;
            }
            if (null != upRealvideoMsgEndAck) {
                return R.ok(upRealvideoMsgEndAck.getResult());
            }
            if (num >= 30) {
                return R.fail("远程响应失败");
            }
        }
    }
}