using DocumentFormat.OpenXml.EMMA; using DocumentFormat.OpenXml.Math; using DocumentFormat.OpenXml.Spreadsheet; using Infrastructure; using Infrastructure.Cache; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using MQTTnet; using OpenAuth.App.ServiceApp; using OpenAuth.App.ServiceApp.Response; using OpenAuth.Repository.Domain; using StackExchange.Redis; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace OpenAuth.WebApi.Controllers.ServiceControllers { /// /// 机场运维 /// [Route("api/[controller]/[action]")] [ApiController] public class AirportMaintenanceController : ControllerBase { private readonly AirportMaintenanceApp _app; private readonly MqttClientManager _mqttClientManager; private readonly MqttMessageCenter _mqttCenter; private readonly RedisCacheContext _cache; public AirportMaintenanceController(AirportMaintenanceApp app, MqttClientManager mqttClientManager, MqttMessageCenter mqttCenter, RedisCacheContext cache) { _app = app; _mqttClientManager = mqttClientManager; _mqttCenter = mqttCenter; _cache = cache; } /// /// 机场注册 注册码生成 /// /// [HttpPost] [Obsolete] public async Task> GetDeviceBindingCode() { var result = new Response(); try { result = await _app.GetDeviceBindingCode(); //发送MQTT消息 if (result.Code == 200 && result.Result != null) { var topicRequest = $"thing/product/{result.Result.DeviceBindingCode}/requests"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "airport_organization_bind", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { bind_devices = new[] { new { device_binding_code = result.Result.DeviceBindingCode, organization_id = result.Result.OrgId } } } }; string payload = JsonSerializer.Serialize(requestData); await _mqttClientManager.PublishAsync(topicRequest, payload); //在这个地方在接收一下? } } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } /// /// 机场注册 注册码生成 /// /// [HttpPost] public async Task> GetGateway() { var result = new Response(); try { result = await _app.GetGateway(); //自动更新主题 string sn = result.Result.GatewaySn; var topics = new List(); topics.AddRange(new[] { $"thing/product/{sn}/osd", $"thing/product/{sn}/events", $"thing/product/{sn}/requests", $"thing/product/{sn}/services" }); await _mqttCenter.SubscribeAsync(topics.ToArray()); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } #region 固件版本管理 /// /// 添加固件版本 /// /// /// [HttpPost] [AllowAnonymous] public async Task> AddFirmware(LasaFirmware info) { var result = new Response(); try { result = await _app.AddFirmware(info); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } /// /// 修改无人机或机场版本 /// /// /// [HttpPost] [AllowAnonymous] public async Task> UpdateFirmware(string id, string version, int type) { var result = new Response(); try { result = await _app.UpdateFirmware(id, version, type); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } /// /// 上传固件文件 /// /// /// [HttpPost("upload")] [AllowAnonymous] public async Task UploadFirmwareFile(IFormFile xmlFile) { if (xmlFile == null || xmlFile.Length == 0) return BadRequest("文件为空"); var path = await _app.UploadFile(xmlFile); return Ok(new { message = "上传成功", path }); } #endregion /// /// 切换相机 /// /// [HttpPost] public async Task> ExchangeCamera(Zhibo zhiboReq) { Response response = new Response(); try { var videoids = zhiboReq.videoId.Split("/"); var topicRequest = $"thing/product/" + videoids[0] + "/services"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "live_camera_change", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { camera_position = zhiboReq.position, video_id = zhiboReq.videoId } }; string payload = JsonSerializer.Serialize(requestData); await _mqttClientManager.PublishAsync(topicRequest, payload); var topicRequest1 = $"thing/product/" + videoids[0] + "/services_reply"; await _mqttClientManager.SubscribeAsync(topicRequest1, async (args) => { var payload = args.ApplicationMessage.Payload; var message = Encoding.UTF8.GetString(payload); Console.WriteLine($"收到主题 [{args.ApplicationMessage.Topic}] 的消息: {message}"); await Task.CompletedTask; }); response.Result = 0; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } return response; ; } /// /// 设置直播镜头 /// /// [HttpPost] public async Task> SetCamera(Zhibo zhiboReq) { Response response = new Response(); try { var videoids = zhiboReq.videoId.Split("/"); var topicRequest = $"thing/product/" + videoids[0] + "/services"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "live_lens_change", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { video_type = zhiboReq.cameraType, video_id = zhiboReq.videoId } }; string payload = JsonSerializer.Serialize(requestData); await _mqttClientManager.PublishAsync(topicRequest, payload); var topicRequest1 = $"thing/product/" + videoids[0] + "/services_reply"; await _mqttClientManager.SubscribeAsync(topicRequest1, async (args) => { var payload = args.ApplicationMessage.Payload; var message = Encoding.UTF8.GetString(payload); Console.WriteLine($"收到主题 [{args.ApplicationMessage.Topic}] 的消息: {message}"); await Task.CompletedTask; }); response.Result = 0; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } return response; } /// /// 设置直播清晰度 /// /// [HttpPost] public async Task> SetCameraVideo(Zhibo zhiboReq) { Response response = new Response(); try { var videoids = zhiboReq.videoId.Split("/"); var topicRequest = $"thing/product/" + videoids[0] + "/services"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "live_set_quality", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { video_quality = zhiboReq.videoQuality, video_id = zhiboReq.videoId } }; string payload = JsonSerializer.Serialize(requestData); await _mqttClientManager.PublishAsync(topicRequest, payload); var topicRequest1 = $"thing/product/" + videoids[0] + "/services_reply"; await _mqttClientManager.SubscribeAsync(topicRequest1, async (args) => { var payload = args.ApplicationMessage.Payload; var message = Encoding.UTF8.GetString(payload); Console.WriteLine($"收到主题 [{args.ApplicationMessage.Topic}] 的消息: {message}"); await Task.CompletedTask; }); response.Result = 0; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } return response; } /// /// 停止直播 /// /// [HttpPost] public async Task> EndLive(Zhibo zhiboReq) { Response response = new Response(); try { var videoids = zhiboReq.videoId.Split("/"); var topicRequest = $"thing/product/" + videoids[0] + "/services"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "live_stop_push", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { video_id = zhiboReq.videoId } }; string payload = JsonSerializer.Serialize(requestData); await _mqttClientManager.PublishAsync(topicRequest, payload); var topicRequest1 = $"thing/product/" + videoids[0] + "/services_reply"; await _mqttClientManager.SubscribeAsync(topicRequest1, async (args) => { var payload = args.ApplicationMessage.Payload; var message = Encoding.UTF8.GetString(payload); Console.WriteLine($"收到主题 [{args.ApplicationMessage.Topic}] 的消息: {message}"); await Task.CompletedTask; }); response.Result = 0; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } return response; } /// /// 关联minio /// /// [HttpPost] public async Task> RefMinio(Zhibo zhiboReq) { Response response = new Response(); try { var videoids = zhiboReq.videoId.Split("/"); var topicRequest = $"thing/product/" + videoids[0] + "/requests_reply"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "storage_config_get", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { output = new { bucket = "test", credentials = new { access_key_id = "minioadmin", access_key_secret = "minioadmin", expire = 3600, security_token = "security_token" }, endpoint = "175.27.168.120:6013", object_key_prefix = "", provider = "ali", region = "hz" }, result = 0 } }; response.Result = 0; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } return response; } /// /// 开始直播 /// /// [HttpPost] public async Task> StartLive(Zhibo zhiboReq) { Response response = new Response(); try { var videoids = zhiboReq.videoId.Split("/"); var topicRequest = $"thing/product/" + videoids[0] + "/services"; var requestData = new { bid = Guid.NewGuid().ToString(), method = "live_start_push", tid = Guid.NewGuid().ToString(), timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), data = new { url_type = zhiboReq.urlType, url = zhiboReq.url, video_quality = zhiboReq.videoQuality, video_id = zhiboReq.videoId } }; string payload = JsonSerializer.Serialize(requestData); await _mqttClientManager.PublishAsync(topicRequest, payload); var topicRequest1 = $"thing/product/" + videoids[0] + "/services_reply"; await _mqttClientManager.SubscribeAsync(topicRequest1, async (args) => { var payload1 = args.ApplicationMessage.Payload; var message = Encoding.UTF8.GetString(payload1); Console.WriteLine($"收到主题 [{args.ApplicationMessage.Topic}] 的消息: {message}"); await Task.CompletedTask; }); response.Result = 0; } catch (Exception ex) { response.Code = 500; response.Message = ex.Message; } return response; } #region redis 多用户控制 /// /// 添加修改mqtt客户端信息 /// /// /// [HttpPost] public async Task> AddOrUpdateRedisUser(MqttClientResp info) { var result = new Response(); try { var clientKey = $"client:{info.UserId}"; string lockSetKey = "locked_users"; // 查询所有锁定用户 var existingLocked = await _cache.SetMembersAsync(lockSetKey); // 如果有锁定用户,并且锁定的用户不是当前用户,则拒绝 if (existingLocked.Length > 0 && info.IsLock == true) { bool isCurrentUserLocked = existingLocked.Any(u => u == info.UserId); if (!isCurrentUserLocked) { result.Code = 400; result.Message = "已有其他用户处于锁定状态,不能添加新的锁定用户。"; result.Result = false; return result; } } // 存客户端信息 _cache.HashSetAsync(clientKey, new HashEntry[] { new("ClientId", info.ClientId), new("UserId", info.UserId), new("UserName", info.UserName), new("ConnectTime", info.ConnectTime.ToString("O")), new("IsLock", info.IsLock ? "true" : "false") }); if (info.IsLock) { await _cache.SetAddAsync(lockSetKey, info.UserId); } else { await _cache.SetRemoveAsync(lockSetKey, info.UserId); } result.Result = true; } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } /// /// 获取当前用户mqtt客户端信息 /// /// /// [HttpGet] public async Task> GetRedisUser(string id) { var result = new Response(); try { result.Result = ParseClient(await _cache.HashGetAllAsync($"client:{id}")); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } private MqttClientResp ParseClient(HashEntry[] entries) { if (entries == null || entries.Length == 0) return null; var dict = entries.ToDictionary(e => e.Name.ToString(), e => e.Value.ToString()); return new MqttClientResp { ClientId = dict["ClientId"], UserId = dict["UserId"], UserName = dict["UserName"], ConnectTime = DateTime.Parse(dict["ConnectTime"]), IsLock = bool.Parse(dict["IsLock"]) }; } /// /// 获取所有锁定的用户客户端信息 /// /// [HttpGet] public async Task> GetLockedClients() { var userIds = await _cache.SetMembersAsync("locked_users"); var result = new List(); foreach (var userId in userIds) { var entries = await _cache.HashGetAllAsync($"client:{userId}"); if (entries.Length > 0) result.Add(ParseClient(entries)); } return result; } #endregion #region 获取告警信息 /// /// 获取告警信息 /// /// 告警等级,0-全部,1-注意,2-告警 /// 设备,0-全部,1-设备管理,2-媒体管理,3-HMS告警 /// /// /// /// /// [HttpGet] public async Task>>> GetManageDeviceHmsList(int level, int model, DateTime startTime, DateTime endTime, int page, int limit, string message) { var result = new Response>>(); try { result = await _app.GetManageDeviceHmsList(level, model, startTime, endTime, page, limit, message); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } #endregion #region 日志信息 /// /// 根据设备sn读取实时数据 /// /// 设备sn /// /// /// /// /// [HttpGet] public async Task>>> GetLogList(string sn, DateTime startTime, DateTime endTime, int page, int limit) { var result = new Response>>(); try { result = await _app.GetLogList(sn, startTime, endTime, page, limit); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } #endregion [HttpGet] [AllowAnonymous] public async Task>>> GetMediaFile(string device,string picname, DateTime startTime, DateTime endTime, int page, int limit,int level,string parentKey) { var result = new Response>>(); try { result = await _app.GetMediaFile(device, picname,startTime, endTime, page, limit, level,parentKey); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } [HttpGet] [AllowAnonymous] public async Task> UpdatePicStatus(string id, int showOnMap,int display) { var result = new Response(); try { result = await _app.UpdatePicStatus(id, showOnMap, display); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } [HttpGet] [AllowAnonymous] public async Task> deletepic(string ids) { var result = new Response(); try { result = await _app.deletepic(ids); } catch (Exception ex) { result.Code = 500; result.Message = ex.Message; } return result; } } }