main
洁 任 2 months ago
commit bcb13fd7f5

@ -1,6 +1,7 @@
using System.Dynamic;
using System.Text;
using Infrastructure.Cache;
using Infrastructure.CloudSdk.minio;
using Infrastructure.CloudSdk.wayline;
using MQTTnet;
using MQTTnet.Client;
@ -19,15 +20,17 @@ public class ConfigSubscribe : IJob
private readonly ISqlSugarClient _sqlSugarClient;
private readonly RedisCacheContext _redisCacheContext;
private readonly ManageApp _manageApp;
private readonly MinioService _minioService;
private object _locker = new();
public ConfigSubscribe(MqttClientManager mqttClientManager, ISqlSugarClient sqlSugarClient,
ICacheContext redisCacheContext, ManageApp manageApp)
ICacheContext redisCacheContext, ManageApp manageApp, MinioService minioService)
{
_mqttClientManager = mqttClientManager;
_sqlSugarClient = sqlSugarClient;
_redisCacheContext = redisCacheContext as RedisCacheContext;
_manageApp = manageApp;
_minioService = minioService;
}
private async Task Subscribe()
@ -104,27 +107,29 @@ public class ConfigSubscribe : IJob
// "need_reply":0,"tid":"50e8102c-da72-42b1-a899-a82a519456d9",
// "timestamp":1750575776430,
// "gateway":"8UUXN5400A079H"}
//todo 配置中读取minio配置
// 配置中读取minio配置
var storageConfigRequest = new TopicServicesRequest<object>()
{
method = "storage_config_get",
tid = result.tid,
bid = result.bid,
timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(),
data = new
{
result = 0,
output = new
{
bucket = "test",
endpoint = "http://175.27.168.120:6013",
bucket = _minioService._bucketName,
// todo 这里待确定
endpoint = $"http://{_minioService.endPoint}",
object_key_prefix = Guid.NewGuid().ToString(), // todo 是否设计任务id
provider = "minio",
region = "linyi",
credentials = new
{
access_key_id = "minioadmin",
access_key_secret = "minioadmin",
access_key_id = _minioService.AccessKey,
access_key_secret = _minioService.SecretKey,
expire = 7200,
security_token = ""
}
@ -199,16 +204,18 @@ public class ConfigSubscribe : IJob
case "file_upload_callback":
// 文件上传
int flightType = int.Parse(data.flight_task.flight_type);
if (flightType == 1)
if (flightType == 1) // 不处理一键起飞媒体信息
{
break;
}
string flightId = data.file.ext.flight_id;
string taskId = _manageApp.GetTaskAssignByFlightId(flightId).TaskId;
var fileUpload = new LasaMediaFile()
{
Id = Guid.NewGuid().ToString(),
FlightId = flightId,
FlightId = flightId, // 计划id
TaskId = taskId, // 任务id
DroneModelKey = data.file.ext.drone_model_key,
IsOriginal = data.file.ext.is_original,
MediaIndex = data.file.ext.media_index,
@ -226,15 +233,14 @@ public class ConfigSubscribe : IJob
await _sqlSugarClient.Insertable(fileUpload).ExecuteCommandAsync();
var expectFileCount = data.flight_task.expected_file_count;
var uploadedFileCount = data.flight_task.uploaded_file_count;
string taskId = _manageApp.GetTaskAssignByFlightId(data.flight_task.id).TaskId;
var taskRecord = new LasaTask()
{
Id = taskId,
ExpectedFileCount = expectFileCount,
UploadedFileCount = uploadedFileCount
ExpectedFileCount = expectFileCount, // 期望文件数量
UploadedFileCount = uploadedFileCount // 已上传文件数量
};
await _sqlSugarClient.Updateable(taskRecord)
.Where(t => t.FlightId == fileUpload.FlightId)
.IgnoreNullColumns().ExecuteCommandAsync();
break;
case "release_terminal_control_area":
@ -281,7 +287,7 @@ public class ConfigSubscribe : IJob
{
if (!method.Equals("hms"))
{
Console.WriteLine($"未处理事件events{message}");
//Console.WriteLine($"未处理事件events{message}");
}
break;

@ -180,6 +180,23 @@ namespace OpenAuth.App.ServiceApp
}
}
}
public async Task<List<string>> GetUavSn()
{
using (var db = UnitWork.CreateContext())
{
var uavinfo = await db.LasaUav.AsQueryable().Where(r => r.IsDelete == false).Select(r => r.Sn).ToListAsync();
var dockinfo = await db.LasaDronePort.AsQueryable().Where(r => r.IsDelete == false).Select(r => r.Sn).ToListAsync();
if (dockinfo != null)
{
return dockinfo.Union(uavinfo).ToList();
}
else
{
return new List<string>();
}
}
}
#region 固件版本管理
public async Task<Response<bool>> AddFirmware(LasaFirmware info)
@ -279,6 +296,32 @@ namespace OpenAuth.App.ServiceApp
return false;
}
}
/// <summary>
/// 获取日志
/// </summary>
/// <param name="sn"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<LasaLog>>>> GetLogList(string sn, DateTime startTime, DateTime endTime, int page, int limit)
{
RefAsync<int> totalCount = 0;
using (var db = UnitWork.CreateContext())
{
var topic = $"thing/product/{sn}/osd";
var list = await db.LasaLog.AsQueryable()
.Where(x => x.CreateTime >= startTime && x.CreateTime <= endTime)
.Where(x => x.Topic == topic)
.OrderBy(x => x.CreateTime, OrderByType.Asc)
.ToPageListAsync(page, limit, totalCount);
return new Response<PageInfo<List<LasaLog>>>
{
Result = new PageInfo<List<LasaLog>> { Items = list, Total = totalCount }
};
}
}
#endregion
}
}

@ -122,6 +122,8 @@ namespace OpenAuth.App.ServiceApp
{
using (var db = UnitWork.CreateContext())
{
if (db.LasaDronePort.GetFirst(r => r.Sn == info.Sn) != null)
return false;
var flag = db.LasaDronePort.Insert(info);
if (db.Commit())
return true;
@ -169,6 +171,45 @@ namespace OpenAuth.App.ServiceApp
};
}
}
/// <summary>
/// 获取机场sn获取无人机列表
/// </summary>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <param name="key"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<dynamic>>>> GetUavPageByDocksn(int page, int limit, string sn)
{
RefAsync<int> totalCount = 0;
using (var db = UnitWork.CreateContext())
{
var dockinfo = await db.LasaDronePort.GetFirstAsync(r => r.Sn == sn);
var list = await db.LasaUav.AsQueryable()
.LeftJoin<LasaDronePort>((a, b) => a.PId == b.Id)
.Where((a, b) => a.IsDelete == false)
.WhereIF(dockinfo != null, (a, b) => a.PId == dockinfo.Id)
.Select<dynamic>((a, b) => new
{
id = a.Id,
name = a.Name,
pId = a.PId,
typeId = a.TypeId,
sn = a.Sn,
psn = b.Sn,
updateTime = a.UpdateTime,
isDelete = a.IsDelete,
pName = b.Name, // 机场名称
workSpaceId = a.WorkSpaceId,
firmwareVersion = a.FirmwareVersion,
})
.ToPageListAsync(page, limit, totalCount);
return new Response<PageInfo<List<dynamic>>>
{
Result = new PageInfo<List<dynamic>> { Items = list, Total = totalCount }
};
}
}
/// <summary>
/// 编辑无人机
@ -232,6 +273,8 @@ namespace OpenAuth.App.ServiceApp
{
using (var db = UnitWork.CreateContext())
{
if (db.LasaUav.GetFirst(r => r.Sn == info.Sn) != null)
return false;
var flag = db.LasaUav.Insert(info);
if (db.Commit())
return true;

@ -0,0 +1,24 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.Repository.Domain
{
/// <summary>
/// 设备类型字典
/// </summary>
[SugarTable("lasa_devicedictionary")]
public class LasaDeviceDictionary
{
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
public int Domain { get; set; }
public int DeviceType { get; set; }
public int SubType { get; set; }
public string DeviceName { get; set; }
public string DeviceDesc { get; set; }
}
}

@ -26,6 +26,7 @@ namespace OpenAuth.Repository.Domain
[SugarColumn(DefaultValue = "false")]
public bool IsDelete { get; set; }
public string WorkSpaceId { get; set; }
public string GateWay { get; set; }
[Navigate(NavigateType.OneToMany, nameof(LasaUav.PId))]
public List<LasaUav> UavList { get; set; }
}

@ -45,6 +45,6 @@ namespace OpenAuth.Repository.Domain
/// Nullable:True
/// </summary>
[SugarColumn(IsJson = true)]
public JsonObject Data { get; set; }
public string Data { get; set; }
}
}

@ -85,4 +85,6 @@ public class LasaMediaFile
/// 文件创建时间
/// </summary>
public DateTime? CreateTime { get; set; }
public string TaskId { get; set; }
}

@ -75,6 +75,7 @@ namespace OpenAuth.Repository
public SugarRepositiry<LasaManageDeviceHms> LasaManageDeviceHms { get; set; }
public SugarRepositiry<LasaLog> LasaLog { get; set; }
public SugarRepositiry<LasaFirmware> LasaFirmware { get; set; }
public SugarRepositiry<LasaDeviceDictionary> LasaDeviceDictionary { get; set; }
public SugarRepositiry<DroneDocktaskdetail> DroneDocktaskdetail { get; set; }
public SugarRepositiry<DroneDocktask> DroneDocktask { get; set; }
#endregion

@ -342,6 +342,63 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
}
/// <summary>
/// 关联minio
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<Response<int>> RefMinio(Zhibo zhiboReq)
{
Response<int> response = new Response<int>();
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;
}
/// <summary>
/// 开始直播
@ -537,5 +594,32 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
return result;
}
#endregion
#region 日志信息
/// <summary>
/// 根据设备sn读取实时数据
/// </summary>
/// <param name="sn">设备sn</param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <returns></returns>
[HttpGet]
public async Task<Response<PageInfo<List<LasaLog>>>> GetLogList(string sn, DateTime startTime, DateTime endTime, int page, int limit)
{
var result = new Response<PageInfo<List<LasaLog>>>();
try
{
result = await _app.GetLogList(sn, startTime, endTime, page, limit);
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.Message;
}
return result;
}
#endregion
}
}

@ -146,6 +146,29 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
{
return await _app.DeleteUav(id);
}
/// <summary>
/// 根据机场sn获取无人机列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="sn"></param>
/// <returns></returns>
[HttpGet]
public async Task<Response<PageInfo<List<dynamic>>>> GetUavPageByDocksn(int page, int limit, string sn)
{
var result = new Response<PageInfo<List<dynamic>>>();
try
{
result = await _app.GetUavPageByDocksn(page, limit, sn);
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.Message;
}
return result;
}
#endregion

@ -1,6 +1,8 @@
using Infrastructure.CloudSdk.mqttmessagecenter;
using NPOI.SS.Formula.Functions;
using NuGet.Packaging;
using OpenAuth.App.ServiceApp;
using System.Security.Cryptography;
namespace OpenAuth.WebApi.Model.mqtt
{
@ -26,7 +28,7 @@ namespace OpenAuth.WebApi.Model.mqtt
handlers,
server: "175.27.168.120",
port: 6011,
clientId: "mqtt_client_1582",
clientId: Guid.NewGuid().ToString(),
username: "sdhc",
password: ""
);
@ -44,7 +46,16 @@ namespace OpenAuth.WebApi.Model.mqtt
$"thing/product/{gateway}/services_reply",
//$"thing/product/{gateway}/drc/up",
//$"thing/product/{gateway}/drc/down",
$"thing/product/{gateway}/state"
$"sys/product/{gateway}/status"
});
}
var snList = await _app.GetUavSn();
foreach (var sn in snList)
{
topics.AddRange(new[]
{
$"thing/product/{sn}/osd"
});
}
await _mqttCenter.ConnectAndSubscribeAsync(topics.ToArray());

@ -34,7 +34,7 @@ namespace OpenAuth.WebApi.Model.mqtt
Topic = topic,
Method = root["method"]?.ToString() ?? "",
CreateTime = DateTime.Now,
Data = root
Data = payload
});
var sub_device = root["data"]?["sub_device"]?.ToString() ?? "";
if (!string.IsNullOrEmpty(sub_device))

@ -12,13 +12,15 @@ namespace OpenAuth.WebApi.Model.mqtt
private readonly MqttClientManager _mqttClientManager;
AirportMaintenanceApp _app;
ManageApp _manageApp;
private readonly MqttMessageCenter _mqttCenter;
public ThingRequestHandler(ILogger<ThingRequestHandler> logger, MqttClientManager mqttClientManager, AirportMaintenanceApp app, ManageApp manageApp)
public ThingRequestHandler(ILogger<ThingRequestHandler> logger, MqttClientManager mqttClientManager, AirportMaintenanceApp app, ManageApp manageApp, MqttMessageCenter mqttCenter)
{
_logger = logger;
_mqttClientManager = mqttClientManager;
_app = app;
_manageApp = manageApp;
_mqttCenter = mqttCenter;
}
public bool CanHandle(string topic)
@ -137,7 +139,7 @@ namespace OpenAuth.WebApi.Model.mqtt
}
if (payload.Contains("airport_organization_bind"))
{
string getway = topic.Split('/')[2];
// 解析 JSON
var root = JsonNode.Parse(payload)?.AsObject();
// 获取 bind_devices 数组
@ -159,8 +161,9 @@ namespace OpenAuth.WebApi.Model.mqtt
lasaDronePort.TypeId = "Dock 3";
lasaDronePort.Sn = obj["sn"].ToString();
lasaDronePort.BindStatus = 1;
lasaDronePort.Name = "机场";
lasaDronePort.Name = obj["device_callsign"]?.ToString();
dronesn = obj["sn"].ToString();
lasaDronePort.GateWay = getway;
}
else
{
@ -170,7 +173,7 @@ namespace OpenAuth.WebApi.Model.mqtt
lasaUav.TypeId = "M4TD";
lasaUav.Sn = obj["sn"].ToString();
lasaUav.PId = lasaDronePort.Id;
lasaUav.Name = "飞行器";
lasaUav.Name = obj["device_callsign"]?.ToString();
uavsn = obj["sn"].ToString();
}
}
@ -178,6 +181,13 @@ namespace OpenAuth.WebApi.Model.mqtt
uavsn = uavsn == "" ? "1581F8HGX254V00A0BUY" : uavsn;
_manageApp.AddDronePort(lasaDronePort);
_manageApp.AddLasaUav(lasaUav);
var topics = new List<string>();
topics.AddRange(new[]
{
$"sys/product/{dronesn}/osd",
$"sys/product/{uavsn}/osd",
});
await _mqttCenter.SubscribeAsync(topics.ToArray());
var requestData = new
{
bid = Guid.NewGuid().ToString(),
@ -206,7 +216,6 @@ namespace OpenAuth.WebApi.Model.mqtt
method = "airport_organization_bind"
};
string payloadreq = JsonSerializer.Serialize(requestData);
string getway = topic.Split('/')[2];
await _mqttClientManager.PublishAsync($"thing/product/{getway}/requests_reply", payloadreq);
}
}

@ -1,39 +0,0 @@
using Infrastructure.CloudSdk.mqttmessagecenter;
using OpenAuth.App.ServiceApp;
using OpenAuth.Repository.Domain;
using System.Text.Json.Nodes;
namespace OpenAuth.WebApi.Model.mqtt
{
public class ThingStateHandler : IMqttMessageHandler
{
private readonly ILogger<ThingStateHandler> _logger;
AirportMaintenanceApp _app;
public ThingStateHandler(ILogger<ThingStateHandler> logger, AirportMaintenanceApp app)
{
_logger = logger;
_app = app;
}
public bool CanHandle(string topic)
{
return topic.Contains("/state");
}
public Task HandleAsync(string topic, string payload)
{
_logger.LogError($"[Service] Topic={topic}, Payload={payload}");
Console.WriteLine($"[Service] Topic={topic}, Payload={payload}");
var root = JsonNode.Parse(payload)?.AsObject();
_app.AddLog(new LasaLog
{
Id = Guid.NewGuid().ToString(),
Topic = topic,
Method = root["method"]?.ToString() ?? "",
CreateTime = DateTime.Now,
Data = root
});
return Task.CompletedTask;
}
}
}

@ -0,0 +1,58 @@
using Infrastructure.CloudSdk.mqttmessagecenter;
using OpenAuth.App.ServiceApp;
using OpenAuth.Repository.Domain;
using System.Text.Json;
using System.Text.Json.Nodes;
namespace OpenAuth.WebApi.Model.mqtt
{
public class ThingStatusHandler : IMqttMessageHandler
{
private readonly ILogger<ThingStatusHandler> _logger;
AirportMaintenanceApp _app;
private readonly MqttClientManager _mqttClientManager;
public ThingStatusHandler(ILogger<ThingStatusHandler> logger, AirportMaintenanceApp app, MqttClientManager mqttClientManager)
{
_logger = logger;
_app = app;
_mqttClientManager = mqttClientManager;
}
public bool CanHandle(string topic)
{
return topic.Contains("/status");
}
public async Task HandleAsync(string topic, string payload)
{
_logger.LogError($"[Service] Topic={topic}, Payload={payload}");
Console.WriteLine($"[Service] Topic={topic}, Payload={payload}");
if (payload.Contains("update_topo"))
{
var root = JsonNode.Parse(payload)?.AsObject();
if (root == null)
{
return;
}
var bid = root["bid"]?.ToString() ?? "";
var tid = root["tid"]?.ToString() ?? "";
var timestamp = long.Parse(root["timestamp"]?.ToString() ?? "0");
var requestData = new
{
bid = bid,
method = "update_topo",
tid = tid,
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
data = new
{
result = 0,
}
};
string getway = topic.Split('/')[2];
string payloadreq = JsonSerializer.Serialize(requestData);
await _mqttClientManager.PublishAsync($"sys/product/{getway}/status_reply", payloadreq);
}
}
}
}

@ -177,6 +177,7 @@ namespace OpenAuth.WebApi
services.AddSingleton<IMqttMessageHandler, ThingOsdHandler>();
services.AddSingleton<IMqttMessageHandler, ThingEventHandler>();
//services.AddSingleton<IMqttMessageHandler, ThingDrcHandler>();
services.AddSingleton<IMqttMessageHandler, ThingStatusHandler>();
services.AddHostedService<MqttHostedService>();
#endregion
@ -341,7 +342,7 @@ namespace OpenAuth.WebApi
#endregion
}
public void ConfigureContainer(ContainerBuilder builder)

Loading…
Cancel
Save