Commit 95d4132a by Future

对接多人音视频

parent 673029d4
package com.wecloud.im.controller;
import com.wecloud.im.param.InviteToMultiMeetParam;
import com.wecloud.im.param.RejectToMultiMeetParam;
import com.wecloud.im.param.rtc.RejectRtcChannelParam;
import com.wecloud.multimeet.service.MultiMeetService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author wenzhida
* @Date 2022/3/7 18:08
* @Description 多人音视频通话控制器
*/
@Slf4j
@RestController
@RequestMapping("/multiMeet")
@Api(value = "多人音视频通话", tags = {"多人音视频通话"})
public class ImMultiMeetController extends BaseController {
@Autowired
private MultiMeetService multiMeetService;
/**
* 创建频道,并邀请客户端加入
*/
@PostMapping("/invite")
@ApiOperation(value = "邀请加入", notes = "邀请加入")
public ApiResult<Boolean> invite(@RequestBody InviteToMultiMeetParam param) {
if (CollectionUtils.isEmpty(param.getToClients())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
multiMeetService.invite(param);
return ApiResult.ok();
}
@PostMapping("/reject")
@ApiOperation(value = "拒接进入频道", notes = "")
public ApiResult<Boolean> reject(@RequestBody RejectToMultiMeetParam param) {
multiMeetService.reject(param);
return ApiResult.ok();
}
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Author wenzhida
* @Date 2022/3/7 19:09
* @Description 邀请加入多人会议室
*/
@Data
@ApiModel(value = "邀请加入多人会议室")
public class InviteToMultiMeetParam implements Serializable {
private static final long serialVersionUID = 6815250319056125934L;
@ApiModelProperty(value = "绑定的会话id,可选", required = false)
private Long conversationId;
@ApiModelProperty(value = "被邀请的客户端ID列表", required = true)
private List<String> toClients;
@ApiModelProperty(value = "接收方展示的系统推送内容", required = false)
private String push;
@ApiModelProperty(value = "是否需要给对方发系统通知", required = true)
private Boolean pushCall;
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/7 22:18
* @Description 拒接加入会议
*/
@Data
@ApiModel(value = "RejectRtcChannelParam")
public class RejectToMultiMeetParam implements Serializable {
private static final long serialVersionUID = -249558750895602938L;
}
package com.wecloud.im.ws.enums;
/**
* @Author wenzhida
* @Date 2022/3/7 22:13
* @Description 多人音视频响应类型
*/
public enum WsMultiMeetResponseSubCmdEnum {
/**
* 邀请
*/
INVITE(1),
/**
* 拒接邀请
*/
REJECT(2);
private final int cmdCode;
WsMultiMeetResponseSubCmdEnum(int cmdCode) {
this.cmdCode = cmdCode;
}
public int getCmdCode() {
return cmdCode;
}
}
...@@ -8,6 +8,11 @@ package com.wecloud.im.ws.enums; ...@@ -8,6 +8,11 @@ package com.wecloud.im.ws.enums;
public enum WsResponseCmdEnum { public enum WsResponseCmdEnum {
/** /**
* 下发在线多人音视频事件
*/
MULTI_MEET_MSG(8),
/**
* 服务端下发通知型消息,例如:好友申请,好友认证结果. * 服务端下发通知型消息,例如:好友申请,好友认证结果.
* 参数值参考{@link com.wecloud.im.enums.EventResponseSubCmdEnum EventResponseSubCmdEnum} * 参数值参考{@link com.wecloud.im.enums.EventResponseSubCmdEnum EventResponseSubCmdEnum}
*/ */
......
package com.wecloud.multimeet.entity.response;
import lombok.Data;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/7 22:01
* @Description 多人音视频会议长连接响应基类
*/
@Data
public class MultiMeetDataBase implements Serializable {
private static final long serialVersionUID = -4151469100462562164L;
/**
* 子指令
*/
private Integer subCmd;
private String clientId;
private Long timestamp;
}
package com.wecloud.multimeet.entity.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/7 22:02
* @Description 邀请加入多人音视频会议
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class MultiMeetInviteResponse extends MultiMeetDataBase implements Serializable {
/**
* 会话id
*/
private Long conversationId;
}
package com.wecloud.multimeet.entity.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/7 22:21
* @Description 拒绝进入多人音视频
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class MultiMeetRejectResponse extends MultiMeetDataBase implements Serializable {
}
package com.wecloud.multimeet.service;
import com.wecloud.im.param.InviteToMultiMeetParam;
import com.wecloud.im.param.RejectToMultiMeetParam;
import com.wecloud.im.param.rtc.CreateRtcChannelResult;
import com.wecloud.im.param.rtc.RejectRtcChannelParam;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
/**
* @Author wenzhida
* @Date 2022/3/7 18:26
* @Description 多人音视频服务接口
*/
public interface MultiMeetService {
/**
* 发起多人音视频邀请
* @param param
* @return
*/
void invite(InviteToMultiMeetParam param);
/**
* 拒接加入会议
* @param param
*/
void reject(RejectToMultiMeetParam param);
}
package com.wecloud.multimeet.service;
import com.wecloud.multimeet.entity.response.MultiMeetInviteResponse;
import com.wecloud.multimeet.entity.response.MultiMeetRejectResponse;
/**
* @Author wenzhida
* @Date 2022/3/7 21:47
* @Description 多人音视频 webSocket下发指令数据
*/
public interface WsMultiMeetWrite {
/**
* 发送邀请
* @param multiMeetInviteResponse
* @param toClientId
*/
void invite(MultiMeetInviteResponse multiMeetInviteResponse, Long toClientId);
/**
* 拒接邀请
* @param multiMeetRejectResponse
* @param toClientId
*/
void reject(MultiMeetRejectResponse multiMeetRejectResponse, Long toClientId);
}
package com.wecloud.multimeet.service.impl;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.param.InviteToMultiMeetParam;
import com.wecloud.im.param.RejectToMultiMeetParam;
import com.wecloud.im.param.rtc.CreateRtcChannelResult;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.ws.cache.UserStateCacheManager;
import com.wecloud.multimeet.entity.response.MultiMeetInviteResponse;
import com.wecloud.multimeet.entity.response.MultiMeetRejectResponse;
import com.wecloud.multimeet.service.MultiMeetService;
import com.wecloud.multimeet.service.WsMultiMeetWrite;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author wenzhida
* @Date 2022/3/7 18:43
* @Description 多人音视频接口实现
*/
@Slf4j
@Service
public class MultiMeetServiceImpl implements MultiMeetService {
@Autowired
private WsMultiMeetWrite wsMultiMeetWrite;
@Autowired
private ImClientService imClientService;
@Autowired
private UserStateCacheManager userStateCacheManager;
@Override
public void invite(InviteToMultiMeetParam param) {
ImClient currentClient = imClientService.getCurrentClient();
// 判断发起方必须在线
boolean onlineStatus = userStateCacheManager.isOnline(currentClient.getId());
if (!onlineStatus) {
log.info("发起方必须在线" + currentClient.getFkAppid() + currentClient.getClientId());
throw new BusinessException("发起方必须在线");
}
for (String toClient : param.getToClients()) {
ImClient receiver = imClientService.getCacheImClient(currentClient.getFkAppid(), toClient);
if (receiver == null) {
log.info("查无接收人信息 {}", toClient);
continue;
}
// ws向接收方发送通知
MultiMeetInviteResponse multiMeetInviteResponse = new MultiMeetInviteResponse();
multiMeetInviteResponse.setConversationId(param.getConversationId());
multiMeetInviteResponse.setClientId(currentClient.getClientId());
multiMeetInviteResponse.setTimestamp(System.currentTimeMillis());
wsMultiMeetWrite.invite(multiMeetInviteResponse, receiver.getId());
// TODO 待开发 下发安卓和ios系统推送
}
}
@Override
public void reject(RejectToMultiMeetParam param) {
ImClient currentClient = imClientService.getCurrentClient();
// ws向接收方发送通知
MultiMeetRejectResponse multiMeetRejectResponse = new MultiMeetRejectResponse();
multiMeetRejectResponse.setClientId(currentClient.getClientId());
multiMeetRejectResponse.setTimestamp(System.currentTimeMillis());
wsMultiMeetWrite.reject(multiMeetRejectResponse, currentClient.getId());
}
}
package com.wecloud.multimeet.service.impl;
import com.wecloud.im.ws.enums.WsMultiMeetResponseSubCmdEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.multimeet.entity.response.MultiMeetInviteResponse;
import com.wecloud.multimeet.entity.response.MultiMeetRejectResponse;
import com.wecloud.multimeet.service.WsMultiMeetWrite;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author wenzhida
* @Date 2022/3/7 22:26
* @Description 多人音视频长连接下发
*/
@Service
public class WsMultiMeetWriteImpl implements WsMultiMeetWrite {
@Autowired
private ChannelSender channelSender;
@Override
public void invite(MultiMeetInviteResponse multiMeetInviteResponse, Long toClientId) {
multiMeetInviteResponse.setSubCmd(WsMultiMeetResponseSubCmdEnum.INVITE.getCmdCode());
// 向接收方推送
WsResponse<MultiMeetInviteResponse> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.MULTI_MEET_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(multiMeetInviteResponse);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, toClientId);
}
@Override
public void reject(MultiMeetRejectResponse multiMeetRejectResponse, Long toClientId) {
multiMeetRejectResponse.setSubCmd(WsMultiMeetResponseSubCmdEnum.REJECT.getCmdCode());
// 向接收方推送
WsResponse<MultiMeetRejectResponse> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.MULTI_MEET_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(multiMeetRejectResponse);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, toClientId);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment