| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- package cn.com.goldenwater.dcproj.service.impl;
- import cn.com.goldenwater.dcproj.dto.AgoraTokenDto;
- import cn.com.goldenwater.dcproj.model.AgoraToken;
- import cn.com.goldenwater.dcproj.model.BisInspAllRlationPers;
- import cn.com.goldenwater.dcproj.service.AgoraTokenService;
- import cn.com.goldenwater.dcproj.service.BisInspAllRlationPersService;
- import cn.com.goldenwater.dcproj.utils.RedisOperator;
- import io.agora.media.RtcTokenBuilder;
- import io.agora.rtm.RtmTokenBuilder;
- import org.apache.commons.lang3.StringUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.BeanUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import static cn.com.goldenwater.dcproj.util.CheckUtil.check;
- import static cn.com.goldenwater.dcproj.util.CheckUtil.notNull;
- /**
- * @author HAIHUA2
- */
- @Service
- public class AgoraTokenServiceImpl implements AgoraTokenService {
- private Logger logger = LoggerFactory.getLogger(getClass());
- @Autowired
- private BisInspAllRlationPersService bisInspAllRlationPersService;
- @Autowired
- private RedisOperator redisOperator;
- private static final String AGORA_TOKEN = "AgoraToken";
- private static final String AGORA_USER_TOKEN = "AgoraUserToken";
- private static final String AGORA_UID = "AgoraUid";
- private static final int EXPIRATION_TIME_IN_SECONDS = 86400000;
- private static final String APP_ID = "6f592a3023ef4960a2d5342a6fc456e7";
- private static final String APP_CERTIFICATE = "da61dedde61941af8ae051a03865443c";
- @Override
- public AgoraTokenDto createToken(AgoraToken agoraToken) throws Exception {
- check(StringUtils.isNotBlank(agoraToken.getPersId()), "persId.no");
- check(StringUtils.isNotBlank(agoraToken.getChannelName()), "channelName.no");
- // 查询用户
- BisInspAllRlationPers currentUser = bisInspAllRlationPersService.get(agoraToken.getPersId());
- notNull(currentUser, "用户ID错误!");
- String agoraTokenUid = AGORA_UID + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName();
- String agoraTokenRedisKey = AGORA_TOKEN + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName();
- String agoraUserTokenRedisKey = AGORA_USER_TOKEN + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName();
- Integer agoraTokenUidStr = redisOperator.get(agoraTokenUid) == null ? null : Integer.parseInt(redisOperator.get(agoraTokenUid));
- String agoraTokenStr = redisOperator.get(agoraTokenRedisKey);
- String agoraUserTokenStr = redisOperator.get(agoraUserTokenRedisKey);
- if (StringUtils.isBlank(agoraTokenStr)) {
- if (null == agoraTokenUidStr) {
- agoraTokenUidStr = getUid();
- }
- agoraToken.setAgoraUid(agoraTokenUidStr);
- agoraTokenStr = createChannelToken(agoraToken);
- agoraUserTokenStr = createUserToken(String.valueOf(agoraTokenUidStr));
- logger.info("AgoraToken create:" + agoraTokenStr);
- redisOperator.set(agoraTokenUid, String.valueOf(agoraTokenUidStr), 86400);
- redisOperator.set(agoraTokenRedisKey, agoraTokenStr, 86400);
- redisOperator.set(agoraUserTokenRedisKey, agoraUserTokenStr, 86400);
- }
- AgoraTokenDto agoraTokenDto = new AgoraTokenDto();
- BeanUtils.copyProperties(currentUser, agoraTokenDto);
- agoraTokenDto.setPersId(agoraToken.getPersId());
- agoraTokenDto.setAgoraUid(agoraTokenUidStr);
- agoraTokenDto.setAgoraToken(agoraTokenStr);
- agoraTokenDto.setAgoraUserToken(agoraUserTokenStr);
- return agoraTokenDto;
- }
- /**
- * @param uid
- * @return
- * @throws Exception
- */
- private String createUserToken(String uid) throws Exception {
- RtmTokenBuilder token = new RtmTokenBuilder();
- return token.buildToken(APP_ID, APP_CERTIFICATE, uid, RtmTokenBuilder.Role.Rtm_User, 0);
- }
- /**
- * @param agoraToken
- * @return
- */
- private String createChannelToken(AgoraToken agoraToken) {
- RtcTokenBuilder.Role role;
- if (StringUtils.isBlank(agoraToken.getRtcRole()) || "1".equals(agoraToken.getRtcRole())) {
- role = RtcTokenBuilder.Role.Role_Publisher;
- } else {
- role = RtcTokenBuilder.Role.Role_Subscriber;
- }
- RtcTokenBuilder token = new RtcTokenBuilder();
- // 使用当前时间加上一个可用时间来保证它的唯一获取时间
- int timestamp = (int) (System.currentTimeMillis() / 1000 + EXPIRATION_TIME_IN_SECONDS);
- return token.buildTokenWithUid(APP_ID, APP_CERTIFICATE,
- agoraToken.getChannelName(),
- agoraToken.getAgoraUid(), role, timestamp);
- }
- private Integer getUid() {
- Integer uid = redisOperator.get(AGORA_UID) == null ? null : Integer.parseInt(redisOperator.get(AGORA_UID));
- if (uid == null) {
- uid = 10000;
- redisOperator.set(AGORA_UID, String.valueOf(uid), 864000);
- } else {
- ++uid;
- redisOperator.set(AGORA_UID, String.valueOf(uid));
- }
- return uid;
- }
- }
|