using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WingInterfaceLibrary.DTO.LiveRoom;
using WingInterfaceLibrary.Enum;
using WingInterfaceLibrary.Interface;
using WingInterfaceLibrary.Internal.Request;
using WingInterfaceLibrary.Notifications;
using WingInterfaceLibrary.Notifications.Live;
using WingInterfaceLibrary.Notifications.Remote;
using WingInterfaceLibrary.Request;
using WingInterfaceLibrary.Request.Remote;
using WingServerCommon.Interfaces.Cache;
using WingServerCommon.Service;
namespace WingDeviceService.Service
{
///
/// 远程管理
///
public partial class DeviceService : JsonRpcService, IDeviceService
{
#region Remote Maintain
///
/// 申请连接/断开请求接口
///
///
///
public async Task ApplyRemoteConnectionAsync(ControlDeviceConnectRequest request)
{
var req = new TokenRequest() { Token = request.Token };
var result = await _authenticationService.GetTokenAsync(req) ?? new TokenDTO();
if (string.IsNullOrEmpty(request.DeviceCode))
{
ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
}
var notification = new ConnectStatusToDeviceNotification()//设备通知
{
ControlUserCode = result.ClientId,
ControlUserName = result.AccountName,
ControlType = request.ControlType
};
BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
notificationRequest.ClientIds = new List() { request.DeviceCode };
notificationRequest.Message = notification;
notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
notificationRequest.NotificationType = notification.NotificationType;
notificationRequest.TransactionType = TransactionTypeEnum.RemoteControl;
notificationRequest.RelevanceCode = request.DeviceCode;
notificationRequest.ReceiverType = ApplicantTypeEnum.Device;
var res = await _notificationService.BroadcastMessageAsync(notificationRequest);
return res;
}
///
/// 设备端接受连接/断开链接请求接口
///
///
///
public async Task AcceptRemoteConnnectionAsync(ControlDeviceResponseRequest request)
{
string deviceCode = await GetClientIdByTokenAsync(request.Token);
if (string.IsNullOrEmpty(request.UserCode))
{
ThrowCustomerException(CustomerRpcCode.UsercodeIsEmpty, "User code is empty");
}
var deviceInfo = CacheMaintenance.Instance.Get().Get(deviceCode);
var req = new TokenRequest() { Token = request.UserCode };
var result = await _authenticationService.GetTokenAsync(req) ?? new TokenDTO();
//接受连接,创建房间
if (request.ControlType == ControlDeviceParameterEnum.Start)
{
var deviceName = !string.IsNullOrWhiteSpace(deviceInfo.Name) ? deviceInfo.Name : deviceInfo.ShortCode;
var deviceLiveInfo = new LiveMemberDTO
{
Code = deviceCode,
Name = deviceName,
MemberType = LiveMemberEnum.Device,
HeadImageToken = deviceInfo.HeadPicUrl,
Status = LiveMemberStatus.Accepted,
};
var room = new LiveRoomDTO
{
LiveRoomCode = request.UserCode + deviceCode,
Name = result.AccountName,
RelatedCode = request.UserCode,
BusinessModule = BusinessModuleEnum.RemoteControl,
Status = LiveRoomStatus.Default,
UserInfos = new List(),
DeviceInfos = new List { deviceLiveInfo }
};
await _rtcService.AddOrUpdateLiveRoomAsync(new AddOrUpdateLiveRoomRequest
{
LiveRoom = room,
});
await _rtcService.InitiateAsync(new InitiateRequest
{
LiveRoomCode = request.UserCode + deviceCode,
InitiatorCode = request.UserCode,
});
}
else if (request.ControlType == ControlDeviceParameterEnum.End)
{
//断开连接,关闭房间
await _rtcService.CloseAsync(new CloseRequest
{
LiveRoomCode = request.UserCode + deviceCode,
UserCode = request.UserCode,
});
}
var notification = new ConnectStatusToClientNotification()//客户端通知
{
DeviceCode = result.ClientId,
DeviceName = result.AccountName,
ControlType = request.ControlType
};
BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
notificationRequest.ClientIds = new List() { request.UserCode };
notificationRequest.Message = notification;
notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
notificationRequest.NotificationType = notification.NotificationType;
notificationRequest.TransactionType = TransactionTypeEnum.RemoteControl;
notificationRequest.RelevanceCode = request.UserCode;
notificationRequest.ReceiverType = ApplicantTypeEnum.Client;
var res = await _notificationService.BroadcastMessageAsync(notificationRequest);
return res;
}
///
/// 远程控制请求接口
///
///
///
public async Task ApplyRemoteControlAsync(ControlDeviceParameterRequest request)
{
var result = false;
if (string.IsNullOrEmpty(request.DeviceCode))
{
ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
}
var userInfo = await _authenticationService.GetTokenAsync(new TokenRequest() { Token = request.Token }) ?? new TokenDTO();
string userCode = userInfo.ClientId;
//获取房间缓存
var roomId = userCode + request.DeviceCode;
if (string.IsNullOrWhiteSpace(roomId))
{
ThrowCustomerException(CustomerRpcCode.LiveCodeIsEmpty, "Live code is empty");
}
var room = await _rtcService.GetLiveRoomAsync(new GetLiveRoomRequest { LiveRoomCode = roomId });
if (room == null)
{
ThrowCustomerException(CustomerRpcCode.LiveRoomIsEmpty, "Live room is empty");
}
var existMember = room.UserInfos.FirstOrDefault(x => x.Code == userCode);
if (existMember == null)
{
ThrowCustomerException(CustomerRpcCode.LivMemberNotFound, "Live member not found");
}
var deviceMember = room.DeviceInfos.FirstOrDefault(v => v.Code == request.DeviceCode);
if (deviceMember == null)
{
ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
}
//检查是否用用户使用参数调节中
var isControllingMember = room.UserInfos.FirstOrDefault(x => x.IsControllingParameter);
if (isControllingMember != null && isControllingMember.Code != userCode)
{
ThrowCustomerException(CustomerRpcCode.ControllingParameterByOtherUser, "Controlling parameter by other");
}
var isControllingParameter = true;
if (request.ControlType == ControlDeviceParameterEnum.End)
{
isControllingParameter = false;
}
if (existMember.IsControllingParameter != isControllingParameter)
{
await _rtcService.ChangeControllingStateAsync(new ChangeControllingStateRequest
{
LiveRoomCode = room.LiveRoomCode,
UserCode = userCode,
IsControllingParameter = isControllingParameter,
});
}
var notification = new DeviceControlledParametersNotification()//设备通知
{
ControlUserCode = userCode,
ControlUserName = userInfo.AccountName,
ControlType = request.ControlType,
Parameters = request.Parameters
};
BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
notificationRequest.ClientIds = new List() { request.DeviceCode };
notificationRequest.Message = notification;
notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
notificationRequest.NotificationType = notification.NotificationType;
notificationRequest.TransactionType = TransactionTypeEnum.RemoteControl;
notificationRequest.RelevanceCode = roomId;
notificationRequest.ReceiverType = ApplicantTypeEnum.Device;
result = await _notificationService.BroadcastMessageAsync(notificationRequest);
return result;
}
///
/// 获取日志请求接口
///
///
///
public async Task GetRemoteLogAsync(GetRemoteLogRequest request)
{
string userCode = await GetClientIdByTokenAsync(request.Token);
if (string.IsNullOrEmpty(request.DeviceCode))
{
ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
}
var notification = new GetRemoteLogToDeviceNotification()//设备通知
{
ControlUserCode = userCode,
StartTime = request.StartTime,
EndTime = request.EndTime
};
BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
notificationRequest.ClientIds = new List() { request.DeviceCode };
notificationRequest.Message = notification;
notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
notificationRequest.NotificationType = notification.NotificationType;
notificationRequest.TransactionType = TransactionTypeEnum.RemoteControl;
notificationRequest.RelevanceCode = request.DeviceCode;
notificationRequest.ReceiverType = ApplicantTypeEnum.Device;
var res = await _notificationService.BroadcastMessageAsync(notificationRequest);
return res;
}
///
/// 设备端响应日志下载地址请求接口
///
///
///
public async Task ResponseRemoteLogAsync(RemoteLogResponseRequest request)
{
string deviceCode = await GetClientIdByTokenAsync(request.Token);
if (string.IsNullOrEmpty(request.UserCode))
{
ThrowCustomerException(CustomerRpcCode.NoExistDevice, "Device does not exist");
}
var notification = new GetRemoteLogToClientNotification()//设备通知
{
DeviceCode = deviceCode,
LogFileToken = request.LogFileToken
};
BroadcastNotificationRequest notificationRequest = new BroadcastNotificationRequest();
notificationRequest.ClientIds = new List() { request.UserCode };
notificationRequest.Message = notification;
notificationRequest.JsonMessage = Newtonsoft.Json.JsonConvert.SerializeObject(notification);
notificationRequest.NotificationType = notification.NotificationType;
notificationRequest.TransactionType = TransactionTypeEnum.RemoteControl;
notificationRequest.RelevanceCode = request.UserCode;
notificationRequest.ReceiverType = ApplicantTypeEnum.Client;
var res = await _notificationService.BroadcastMessageAsync(notificationRequest);
return res;
}
#endregion
}
}