using HiTeachCE.Dtos;
using HiTeachCE.Helpers;
using HiTeachCE.Models;
using HiTeachCE.Services;
using IdentityModel;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using TEAMModelOS;
using TEAMModelOS.SDK.Context.Configuration;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
using TEAMModelOS.SDK.Helper.Common.CollectionHelper;
namespace HiTeachCE.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MqttController:BaseController
{
public static int smsTTL = 4 * 60;
public static int ticketTTL = 1 * 24 * 60 * 60;
//public static int freeTTL = 7 * 24 * 60 * 60;
public static int deviceTTL = 1 * 24 * 60 * 60;
public static string freeOrg = "7f847a9f05224184a5d01ee69a6b00d6";
public static string model_teach = "teach";
public static string model_prepare = "prepare";
private readonly OrganizationService organizationService;
private readonly MemberService memberService;
private readonly ActivationCodeService activationCodeService;
public MqttController( OrganizationService organization, MemberService member, ActivationCodeService activationCode)
{
organizationService = organization;
memberService = member;
activationCodeService = activationCode;
}
///
/// 注册装置
///
///
///
[HttpPost("regist")]
[Authorize(Policy = Constant.Role_Lecturer)]
public BaseJosnRPCResponse Regist(JosnRPCRequest> request)
{
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
string unionid = GetLoginUser(JwtClaimTypes.Id);
/**
"params": {
"deviceId": "f67fb5dd-ee1b-d3b7-9b95-61022d7e8acd",
"clientId": "931dee8c-74be-4c9b-a602-c74583b0e985",
}
*/
if (request.@params.TryGetValue("deviceId", out string deviceId) && request.@params.TryGetValue("orgCode", out string orgCode) && !string.IsNullOrEmpty(unionid))
{
Dictionary dict = ActivationValid(orgCode, unionid);
if (dict != null && dict.TryGetValue("flag", out object flag) && bool.Parse(flag.ToString()))
{
if (RedisHelper.HExists("device:" + deviceId, deviceId))
{
}
else
{
RedisHelper.HSet("device-oud:" + deviceId, deviceId, new OrgUserDevice {orgCode=orgCode,deviceId=deviceId,unionid=unionid });
RedisHelper.HSet("device:" + deviceId, deviceId, null);
RedisHelper.Expire("device-oud:" + deviceId, deviceTTL);
RedisHelper.Expire("device:" + deviceId, deviceTTL);
}
return builder.Data(new Dictionary { { "deviceId", deviceId } }).build();
}
else
{
throw new BizException("授权失败!", 2);
}
}
else
{
throw new BizException("参数错误!", 2);
}
}
///
/// 创建教室
///
///
///
[HttpPost("createGroup")]
[Authorize(Policy = Constant.Role_Lecturer)]
public BaseJosnRPCResponse CreateGroup(JosnRPCRequest> request)
{
/**
"params": {
"deviceId": "f67fb5dd-ee1b-d3b7-9b95-61022d7e8acd",
"doBoundGroupNum": false,
"extraInfo": {}
}
*/
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
//string ClientId =// new List() { "fb564dde14df423cafac2085936e3b96" };
// GetLoginUser(JwtClaimTypes.ClientId);
string groupNum;
if (request.@params.TryGetValue("deviceId", out string deviceId) )
{
if (RedisHelper.HExists("device:" + deviceId, deviceId))
{
groupNum = RedisHelper.HGet("device:" + deviceId, deviceId);
if (string.IsNullOrEmpty(groupNum))
{
do
{
groupNum = RandGroupNum();
} while (RedisHelper.Exists("group:" + groupNum));
RedisHelper.HSet("group:" + groupNum, deviceId, null);
RedisHelper.Expire("group:" + groupNum, deviceTTL);
RedisHelper.HSet("device:" + deviceId, deviceId, groupNum);
}
}
else { throw new BizException("装置未注册", 2); }
}
else
{
throw new BizException("参数错误", 2);
}
return builder.Data(groupNum).build();
}
public string RandGroupNum()
{
Random random = new Random();
String result = "";
for (int i = 0; i < 6; i++)
{
result += random.Next(0, 10);
}
return result;
}
///
/// 加入教室
///
///
///
[HttpPost("joinGroup")]
[Authorize(Policy = Constant.Role_LecturerLearner)]
public BaseJosnRPCResponse JoinGroup(JosnRPCRequest> request)
{
// string ClientId = GetLoginUser(JwtClaimTypes.ClientId);
string Unionid = GetLoginUser(JwtClaimTypes.Id);
string Role = GetLoginUser(JwtClaimTypes.Role);
JsonRPCResponseBuilder builder = JsonRPCResponseBuilder.custom();
Dictionary dict;
/**
"params": {
"deviceId": "f67fb5dd-ee1b-d3b7-9b95-61022d7e8acd",
"groupNum": "818288"
}
*/
if (request.@params.TryGetValue("deviceId", out string deviceId) &&
request.@params.TryGetValue("groupNum", out string groupNum) &&
!string.IsNullOrEmpty(deviceId) && !string.IsNullOrEmpty(groupNum)
)
{
if (RedisHelper.Exists("group:" + groupNum))
{
Dictionary member = RedisHelper.HGetAll("group:" + groupNum);
if (member != null) {
foreach (string key in member.Keys)
{
if (member[key] != null && member[key].role .Contains("lecturer") && Role.Contains("lecturer") && Unionid != member[key].unionid)
{
throw new BizException("教室只能有一个创建者加入", ResponseCode.DATA_EXIST);
}
}
}
dict = MqttInfo(deviceId, deviceId, groupNum, Unionid, Role);
Dictionary members = RedisHelper.HGetAll("group:" + groupNum);
List learners = new List();
MQTTMember lecturer = null;
foreach (string key in members.Keys) {
if (members[key].role.Contains("lecturer"))
{
lecturer= members[key];
}
else {
learners.Add(members[key]);
}
}
dict.Add("lecturer", lecturer);
dict.Add("learners", learners);
}
else
{
throw new BizException("教室不存在", 2);
}
}
else
{
throw new BizException("参数错误", 2);
}
return builder.Data(dict).build();
}
private static Dictionary MqttInfo(string ClientId, string deviceId, string groupNum, string Unionid, string Role)
{
string brokerHostName = BaseConfigModel.Configuration["brokerHostName"];
Dictionary dict = new Dictionary();
string password = brokerHostName + "/" + groupNum + "/" + deviceId + "/" + ClientId;
//发给前端使用的
string h1 = BCrypt.Net.BCrypt.HashPassword(password);
//后端存储使用的
string h2 = BCrypt.Net.BCrypt.HashPassword(h1, BCrypt.Net.SaltRevision.Revision2);
bool validPassword = BCrypt.Net.BCrypt.Verify(h1, h2);
string uname = password;
Dictionary connectInfo = new Dictionary
{
{ "brokerHostName", brokerHostName },
{ "brokerHostNameWSS", "wss://" +brokerHostName+"/mqtt/"} ,
{ "clientID", deviceId },
//使用BCrypt加密
{ "password",h1} ,
{ "username",uname}
};
Dictionary subscribeTopic = BaseConfigModel.Configuration.GetSection("SubscribeTopic").Get>();
subscribeTopic["receiveMsg"] = subscribeTopic["receiveMsg"].Replace("{deviceId}", deviceId);
Dictionary publishTopic = BaseConfigModel.Configuration.GetSection("PublishTopic").Get>();
publishTopic["sendMsg"] = publishTopic["sendMsg"].Replace("{deviceId}", deviceId).Replace("{groupNum}", groupNum);
dict.Add("mqtt", new Dictionary() { { "connectInfo", connectInfo }, { "publishTopic", publishTopic }, { "subscribeTopic", subscribeTopic } });
List topic = new List();
topic.AddRange(publishTopic.Values.ToList());
topic.AddRange(subscribeTopic.Values.ToList());
MQTTInfo mqtt = new MQTTInfo
{
brokerHostName = brokerHostName,
brokerHostNameWSS = "wss://" + brokerHostName + "/mqtt/",
clientID = deviceId,
//使用BCrypt加密
password = h2,
username = uname,
topic = topic
};
var groupMember = new MQTTMember
{
clientId = ClientId,
deviceId = deviceId,
unionid = Unionid,
role = Role,
groupNum = groupNum
};
RedisHelper.HSet("group:" + groupNum, deviceId, groupMember);
RedisHelper.HSet("mqtt:" + deviceId, deviceId, mqtt);
RedisHelper.Expire("mqtt:" + deviceId, deviceTTL);
return dict;
}
///
/// 教学认证
///
///
///
[HttpPost("auth")]
[Authorize(Policy = Constant.Role_Lecturer)]
public BaseJosnRPCResponse Auth(JosnRPCRequest