|
|
|
@ -2,6 +2,7 @@ package org.yzh.web.service; |
|
|
|
|
|
|
|
|
|
|
|
import io.github.yezhihao.netmc.session.Session; |
|
|
|
import io.github.yezhihao.netmc.session.Session; |
|
|
|
import io.github.yezhihao.netmc.session.SessionManager; |
|
|
|
import io.github.yezhihao.netmc.session.SessionManager; |
|
|
|
|
|
|
|
import io.netty.util.internal.StringUtil; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
@ -27,6 +28,11 @@ public class SendCommandService { |
|
|
|
@Autowired |
|
|
|
@Autowired |
|
|
|
private SessionManager sessionManager; |
|
|
|
private SessionManager sessionManager; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 向设备发送推流命令的线程 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private Thread sendCommandToDeviceThread; |
|
|
|
|
|
|
|
|
|
|
|
public void sendToDevice(String clientId) { |
|
|
|
public void sendToDevice(String clientId) { |
|
|
|
if (!"40155591817".equals(clientId) |
|
|
|
if (!"40155591817".equals(clientId) |
|
|
|
&& !"12345678901".equals(clientId) |
|
|
|
&& !"12345678901".equals(clientId) |
|
|
|
@ -56,37 +62,65 @@ public class SendCommandService { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 自动发送推流命令 |
|
|
|
* 重启自动发送推流命令 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
public void restartSendToDevice() { |
|
|
|
|
|
|
|
if (sendCommandToDeviceThread != null && sendCommandToDeviceThread.isAlive()) { |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 sendToDevice : 停止原线程, 重新开启线程 "); |
|
|
|
|
|
|
|
sendCommandToDeviceThread.interrupt(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sendToDevice(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 管理当前所有在线设备, 自动发送推流命令, 直到成功一个或全部失败, 通知慢直播平台当前推流车辆及推流状态 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public void sendToDevice() { |
|
|
|
public void sendToDevice() { |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 sendToDevice : 开始执行 "); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sendCommandToDeviceThread != null && sendCommandToDeviceThread.isAlive()) { |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 sendToDevice : 已有线程执行推流, 直接返回 "); |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
noticeCarStatus(null, BusinessConstant.DEFAULT_CHANNEL_NO, BusinessConstant.LIVE_STATUS_WAITING); |
|
|
|
noticeCarStatus(null, BusinessConstant.DEFAULT_CHANNEL_NO, BusinessConstant.LIVE_STATUS_WAITING); |
|
|
|
|
|
|
|
|
|
|
|
Thread thread = new Thread(new Runnable() { |
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 sendToDevice : 启动线程, 开始执行发送推流命令 "); |
|
|
|
|
|
|
|
sendCommandToDeviceThread = new Thread(new Runnable() { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
public void run() { |
|
|
|
for (Session session : sessionManager.all()) { |
|
|
|
for (Session session : sessionManager.all()) { |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 sendToDevice : 调用推流方法开始 "); |
|
|
|
boolean result = sendCommand(session.getClientId(), BusinessConstant.DEFAULT_CHANNEL_NO); |
|
|
|
boolean result = sendCommand(session.getClientId(), BusinessConstant.DEFAULT_CHANNEL_NO); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 只要有一个设备发送推流命令成功, 直接返回, 不继续向其他设备发送推流命令
|
|
|
|
if (result == true) { |
|
|
|
if (result == true) { |
|
|
|
break; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 所有在线设备发送命令失败后, 通知慢直播平台当前推流的状态
|
|
|
|
noticeCarStatus(null, BusinessConstant.DEFAULT_CHANNEL_NO, BusinessConstant.LIVE_STATUS_OFFLINE); |
|
|
|
noticeCarStatus(null, BusinessConstant.DEFAULT_CHANNEL_NO, BusinessConstant.LIVE_STATUS_OFFLINE); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
thread.start(); |
|
|
|
sendCommandToDeviceThread.start(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 指定车载机和通道发送推流命令, 若不传channelNo, 默认为9 |
|
|
|
* 指定车载机和通道发送推流命令, 若不传channelNo, 默认为9, 通知慢直播平台当前推流车辆及推流状态 |
|
|
|
* |
|
|
|
* |
|
|
|
* @param clientId |
|
|
|
* @param clientId |
|
|
|
* @param channelNo |
|
|
|
* @param channelNo |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public boolean sendToDevice(String clientId, Integer channelNo) { |
|
|
|
public boolean sendToDevice(String clientId, Integer channelNo) { |
|
|
|
noticeCarStatus(clientId, channelNo, BusinessConstant.LIVE_STATUS_WAITING); |
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 sendToDevice {} - {} : 开始执行 ", clientId, channelNo); |
|
|
|
|
|
|
|
channelNo = channelNo == null ? BusinessConstant.DEFAULT_CHANNEL_NO : channelNo; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (StringUtil.isNullOrEmpty(clientId)) { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 判断该设备是否为在线设备
|
|
|
|
// 判断该设备是否为在线设备
|
|
|
|
Session session = sessionManager.get(clientId); |
|
|
|
Session session = sessionManager.get(clientId); |
|
|
|
@ -95,6 +129,7 @@ public class SendCommandService { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
noticeCarStatus(clientId, channelNo, BusinessConstant.LIVE_STATUS_WAITING); |
|
|
|
if (!sendCommand(clientId, channelNo)) { |
|
|
|
if (!sendCommand(clientId, channelNo)) { |
|
|
|
// 若推流命令发送失败, 设备设置为离线
|
|
|
|
// 若推流命令发送失败, 设备设置为离线
|
|
|
|
noticeCarStatus(null, channelNo, BusinessConstant.LIVE_STATUS_OFFLINE); |
|
|
|
noticeCarStatus(null, channelNo, BusinessConstant.LIVE_STATUS_OFFLINE); |
|
|
|
@ -115,33 +150,40 @@ public class SendCommandService { |
|
|
|
request.setStreamType(0); |
|
|
|
request.setStreamType(0); |
|
|
|
request.setTcpPort(4001); |
|
|
|
request.setTcpPort(4001); |
|
|
|
request.setUdpPort(0); |
|
|
|
request.setUdpPort(0); |
|
|
|
log.info("*** 发送实时音视频传输请求 start. request params : " + request.toString()); |
|
|
|
|
|
|
|
Mono<APIResult<T0001>> resultMono = messageManager.requestR(request, T0001.class); |
|
|
|
Mono<APIResult<T0001>> resultMono = messageManager.requestR(request, T0001.class); |
|
|
|
APIResult<T0001> resultObj = resultMono.block(); |
|
|
|
APIResult<T0001> resultObj = resultMono.block(); |
|
|
|
log.info("*** 发送实时音视频传输请求 result : " + resultObj.toString()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
boolean sendResult = resultObj.isSuccess(); |
|
|
|
boolean sendResult = resultObj.isSuccess(); |
|
|
|
// 若命令发送失败, 返回false
|
|
|
|
// 若命令发送失败, 返回false
|
|
|
|
if (!sendResult) { |
|
|
|
if (!sendResult) { |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 发送命令失败 "); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// step2: 由于延迟原因, 等待1s后调用jtt1078上传到缓存的推流车辆, 确认设备是否已推流
|
|
|
|
// step2: 由于延迟原因, 等待1s后调用jtt1078上传到缓存的推流车辆, 确认设备是否已推流
|
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 获取1078推流设备, 1s延迟开始 "); |
|
|
|
Thread.sleep(1000); |
|
|
|
Thread.sleep(1000); |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 获取1078推流设备, 1s延迟结束 "); |
|
|
|
|
|
|
|
|
|
|
|
// step3: 调用3次, 失败后等待1s, 继续调用3次. 若仍然失败, 视为命令发送失败, 返回false
|
|
|
|
// step3: 调用3次, 失败后等待1s, 继续调用3次. 若仍然失败, 视为命令发送失败, 返回false
|
|
|
|
int times = 0; |
|
|
|
int times = 0; |
|
|
|
while (times < 3) { |
|
|
|
while (times < 3) { |
|
|
|
// 调用jtt1078流媒体接口
|
|
|
|
// 调用jtt1078流媒体接口
|
|
|
|
String clientId1078 = BusinessCacheUtil.get1078PushDevice(); |
|
|
|
String clientId1078 = BusinessCacheUtil.get1078PushDevice(); |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 1078推流设备 = {} ", clientId1078); |
|
|
|
|
|
|
|
|
|
|
|
// 判断返回的推流设备是否为发送命令的设备, 如果是, 返回true, 否则继续下次循环
|
|
|
|
// 判断返回的推流设备是否为发送命令的设备, 如果是, 返回true, 否则继续下次循环
|
|
|
|
if (clientId.equals(clientId1078)) { |
|
|
|
if (clientId.equals(clientId1078)) { |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 推流设备 = 发送命令的设备, 返回推流成功"); |
|
|
|
noticeCarStatus(clientId, channelNo, BusinessConstant.LIVE_STATUS_ONLINE); |
|
|
|
noticeCarStatus(clientId, channelNo, BusinessConstant.LIVE_STATUS_ONLINE); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 重试1s延迟开始 "); |
|
|
|
Thread.sleep(1000); |
|
|
|
Thread.sleep(1000); |
|
|
|
|
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 自定义推流方法 : 重试1s延迟结束 "); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
times++; |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (InterruptedException e) { |
|
|
|
} catch (InterruptedException e) { |
|
|
|
e.printStackTrace(); |
|
|
|
e.printStackTrace(); |
|
|
|
@ -150,6 +192,14 @@ public class SendCommandService { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 1. 更新当前推流车辆, 推流通道, 推流状态缓存 |
|
|
|
|
|
|
|
* 2. 调用慢直播接口更新推流车辆, 推流状态 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param clientId |
|
|
|
|
|
|
|
* @param channelNo |
|
|
|
|
|
|
|
* @param status |
|
|
|
|
|
|
|
*/ |
|
|
|
public void noticeCarStatus(String clientId, Integer channelNo, String status) { |
|
|
|
public void noticeCarStatus(String clientId, Integer channelNo, String status) { |
|
|
|
channelNo = channelNo == null ? BusinessConstant.DEFAULT_CHANNEL_NO : channelNo; |
|
|
|
channelNo = channelNo == null ? BusinessConstant.DEFAULT_CHANNEL_NO : channelNo; |
|
|
|
|
|
|
|
|
|
|
|
@ -163,7 +213,7 @@ public class SendCommandService { |
|
|
|
Map<String, String> params = new HashMap<>(); |
|
|
|
Map<String, String> params = new HashMap<>(); |
|
|
|
params.put("clientId", clientId); |
|
|
|
params.put("clientId", clientId); |
|
|
|
params.put("carStat", status); |
|
|
|
params.put("carStat", status); |
|
|
|
log.info(">>> notice to poc-live. url = " + url + " | params = " + params.toString()); |
|
|
|
log.info(BusinessConstant.LOGGER_PREFIX + " : 调用慢直播服务接口 : 当前推流设备 = {} - {} - {}", clientId, channelNo, status); |
|
|
|
HttpClientUtils.doGet(url, params); |
|
|
|
HttpClientUtils.doGet(url, params); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|