大华算法模块

main
zhangbin 2 weeks ago
parent c40d88f85d
commit 938073bc84

@ -226,7 +226,7 @@ public class MqttClientManager
var result = await _outBoundClient.PublishAsync(mqttMsg, CancellationToken.None);
if (result.IsSuccess)
{
Console.WriteLine($"{topic} {message}发布成功");
//Console.WriteLine($"{topic} {message}发布成功");
}
else
{

@ -0,0 +1,261 @@
using Infrastructure;
using Newtonsoft.Json;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.Interface;
using OpenAuth.App.ServiceApp.Algo.Request;
using OpenAuth.App.ServiceApp.Algo.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.Algo
{
public class DaHuaAiApp : SqlSugarBaseApp<LasaAlgorithmsRepository, SugarDbContext>
{
public DaHuaAiApp(ISugarUnitOfWork<SugarDbContext> unitWork,
ISimpleClient<LasaAlgorithmsRepository> repository, IAuth auth) : base(unitWork, repository, auth)
{
}
#region 大华算法
//分析两次航线图片
public async Task<Response<List<dynamic>>> BehaviorAlarm(string firstId, string secondId)
{
using (var db = UnitWork.CreateContext())
{
var imageList1 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == firstId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync();
var imageList2 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == secondId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync();
//var imageList1 = await db.LasaMediaFile.AsQueryable().Where(r => r.Id == firstId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync();
//var imageList2 = await db.LasaMediaFile.AsQueryable().Where(r => r.Id == secondId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync();
List<dynamic> dataList = new List<dynamic>();
for (int i = 0; i < imageList1.Count; i++)
{
dataList.Add(new
{
@event = "event.capturePic",
uid = "1",
channelCode = "sdhc04",
recordId = "kQUXlb1Y8oDgCpZSo7l2yG175617335006157587",
sourceId = "kQUXlb1Y8oDgCpZSo7l2yG175617335006157587",
taskSource = 1,
taskId = "8ab0e1e213234a848e20d0d335559786",
capTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
taskTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
imageInfo = new
{
imgSize = 1667235,
imgWidth = 4032,
imgHeight = 3024
},
imageInfoList = new[]
{
new {
imgUrl = "http://175.27.168.120:6013/test/"+imageList1[i].ObjectKey,
imgSize = imageList1[i].Size,
imgWidth = imageList1[i].Width,
imgHeight = imageList1[i].Height,
imgType = 0,
longitude = imageList1[i].Lng,
absAltitude = imageList1[i].AbsoluteAltitude,
latitude = imageList1[i].Lat,
zoom = imageList1[i].DigitalZoomRatio,
yaw = imageList1[i].GimbalYawDegree,
pitch = imageList1[i].GimbalPitchDegree,
roll = imageList1[i].GimbalRollDegree,
focalLength = imageList1[i].FocalLength
},
new {
imgUrl = "http://175.27.168.120:6013/test/"+imageList2[i].ObjectKey,
imgSize = imageList2[i].Size,
imgWidth = imageList2[i].Width,
imgHeight = imageList2[i].Height,
imgType = 1,
longitude =imageList2[i].Lng,
absAltitude = imageList2[i].AbsoluteAltitude,//拍摄绝对高度
latitude = imageList2[i].Lat,
zoom = imageList2[i].DigitalZoomRatio,//放大倍率
yaw =imageList2[i].GimbalYawDegree,//偏航角?
pitch = imageList2[i].GimbalPitchDegree,//滚角?
roll = imageList2[i].GimbalRollDegree,
focalLength = imageList2[i].FocalLength//焦距
}
}
});
}
return new Response<List<dynamic>>
{
Result = dataList,
Message = "获取数据成功"
};
}
}
public async Task<Response<bool>> AddDaHuaImg(string info)
{
using (var db = UnitWork.CreateContext())
{
var data = JsonConvert.DeserializeObject<dynamic>(info);
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement();
lasaAiAchievement.Id = Guid.NewGuid().ToString();
lasaAiAchievement.Title = "疑似耕地破坏";
lasaAiAchievement.CreateTime = DateTime.Now;
lasaAiAchievement.AiModel = "DaHuaAi";
var imageList = data.imageInfoList;
foreach (var item in imageList)
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = item.imgUrl,
AiAchievementId = lasaAiAchievement.Id
};
lasaAiAchievement.Lat = item.latitude;
lasaAiAchievement.Lng = item.longitude;
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
#endregion
#region 本地模型
public async Task<Response<bool>> AddImgOld(string taskid, string path, string tag)
{
using (var db = UnitWork.CreateContext())
{
var info = await db.LasaAiAchievement.GetFirstAsync(r => r.TaskId == taskid);
if (info == null)
{
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement();
lasaAiAchievement.Id = Guid.NewGuid().ToString();
var tags = JsonConvert.DeserializeObject<List<TagItem>>(tag);
foreach (var item in tags)
{
if (item.class_id == 1 || item.class_id == 2 || item.class_id == 3 || item.class_id == 5 || item.class_id == 6 || item.class_id == 6)
{
lasaAiAchievement.Title = "疑似车辆入侵";
}
}
lasaAiAchievement.CreateTime = DateTime.Now;
lasaAiAchievement.TaskId = taskid;
lasaAiAchievement.AiModel = "yolov8x";
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = "http://175.27.168.120:6013/test/" + path,
AiAchievementId = lasaAiAchievement.Id
};
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
else
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = path,
AiAchievementId = info.Id
};
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
public async Task<Response<bool>> AddImg(string taskid, string path, List<TagItem> tag)
{
using (var db = UnitWork.CreateContext())
{
foreach (var item in tag)
{
var info = await db.LasaAiAchievement.GetFirstAsync(r => r.TaskId == taskid && r.Tag == item.class_id.ToString());
if (info == null)
{
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement();
lasaAiAchievement.Id = Guid.NewGuid().ToString();
lasaAiAchievement.CreateTime = DateTime.Now;
lasaAiAchievement.TaskId = taskid;
lasaAiAchievement.AiModel = "yolov8x";
lasaAiAchievement.Tag = item.class_id.ToString();
if (item.class_id == 1 || item.class_id == 2 || item.class_id == 3 || item.class_id == 5 || item.class_id == 6 || item.class_id == 7)
{
lasaAiAchievement.Title = "疑似车辆入侵";
}
else if (item.class_id == 0)
{
lasaAiAchievement.Title = "疑似火情报警(测试,切勿当真)";
}
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = path,
AiAchievementId = lasaAiAchievement.Id
};
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
else
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = path,
AiAchievementId = info.Id
};
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
}
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
#endregion
}
}

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.Algo.Request
{
public class AiImgReq
{
public string taskid;
public string path;
public List<TagItem> tag;
}
public class TagItem
{
public int class_id { get; set; }
public string class_name { get; set; }
public double confidence { get; set; }
public List<double> box { get; set; }
}
}

@ -0,0 +1,103 @@
using DocumentFormat.OpenXml.EMMA;
using SixLabors.ImageSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.Algo.Response
{
public class DaHuaAiResp
{
public string alarmAction { get; set; }
public string alarmName { get; set; }
public double alarmTime { get; set; }
public string alarmType { get; set; }
public string algoPkgId { get; set; }
public int algorithmType { get; set; }
public long capTime { get; set; }
public string channelCode { get; set; }
public string channelId { get; set; }
public string classType { get; set; }
public int dataSource { get; set; }
public string deviceCode { get; set; }
public string deviceId { get; set; }
public string @event { get; set; }
public string eventId { get; set; }
public string extRecordId { get; set; }
public ImageInfo imageInfo { get; set; }
public List<ImageInfoList> imageInfoList { get; set; }
public List<ImgList> imgList { get; set; }
public Info info { get; set; }
public string paasId { get; set; }
public string recordId { get; set; }
public int ruleId { get; set; }
public string saasExtParam { get; set; }
public string saasTaskId { get; set; }
public string sourceId { get; set; }
public int taskId { get; set; }
public int taskSource { get; set; }
public long taskTime { get; set; }
public double traceServiceInputTime { get; set; }
public string uid { get; set; }
public string userChannelCode { get; set; }
public string userDeviceCode { get; set; }
}
public class ImageInfo
{
public int imgHeight { get; set; }
public int imgSize { get; set; }
public int imgWidth { get; set; }
}
public class ImageInfoList
{
public double absAltitude { get; set; }
public int focalLength { get; set; }
public int imgHeight { get; set; }
public int imgSize { get; set; }
public int imgType { get; set; }
public string imgUrl { get; set; }
public int imgWidth { get; set; }
public double latitude { get; set; }
public double longitude { get; set; }
public double pitch { get; set; }
public int roll { get; set; }
public double yaw { get; set; }
public int zoom { get; set; }
}
public class ImgList
{
public double capTime { get; set; }
public int imgHeight { get; set; }
public int imgSize { get; set; }
public int imgType { get; set; }
public string imgUrl { get; set; }
public int imgWidth { get; set; }
public List<ObjectRect> objectRect { get; set; }
}
public class ObjectRect
{
public int objBottom { get; set; }
public int objLeft { get; set; }
public int objRight { get; set; }
public int objTop { get; set; }
}
public class Info
{
public List<List<int>> detectRegion { get; set; }
public string name { get; set; }
public List<ObjectGPS> objectGPS { get; set; }
public string plateNum { get; set; }
}
public class ObjectGPS
{
public double latitude { get; set; }
public double longitude { get; set; }
}
}

@ -98,7 +98,7 @@ public class ConfigSubscribe : IJob
var result = JsonConvert.DeserializeObject<TopicServicesRequest<dynamic>>(message);
var method = result.method;
var data = result.data;
_logger.LogInformation($"主题:{topic}\n消息{message}");
//_logger.LogInformation($"主题:{topic}\n消息{message}");
long code = 0;
switch (tempStr)
{
@ -643,7 +643,7 @@ public class ConfigSubscribe : IJob
JsonConvert.SerializeObject(fileUploadCallbackEventReply));
}
Console.WriteLine($"航线进度:{message}");
//Console.WriteLine($"航线进度:{message}");
break;
}
default:

@ -31,6 +31,10 @@ public class LasaAiAchievement
[SugarColumn(ColumnName = "AiModel")]
public string AiModel { get; set; }
[SugarColumn(ColumnName = "TaskId")]
public string TaskId { get; set; }
[SugarColumn(ColumnName = "Tag")]
public string Tag { get; set; }
[SugarColumn(IsIgnore = true)] public List<LasaAiAchievementDetail> AiAchievementDetailList { get; set; }
}

@ -84,6 +84,8 @@ namespace OpenAuth.Repository
public SugarRepositiry<LasaMediaFile> LasaMediaFile { get; set; }
public SugarRepositiry<LasaAlgorithmsRepository> LasaAlgorithmsRepository { get; set; }
public SugarRepositiry<LasaModelLabel> LasaModelLabel { get; set; }
public SugarRepositiry<LasaAiAchievement> LasaAiAchievement { get; set; }
public SugarRepositiry<LasaAiAchievementDetail> LasaAiAchievementDetail { get; set; }
public SugarRepositiry<DbfineInfo> DbfineInfo { get; set; }
public SugarRepositiry<SysOpenJob> SysOpenJob { get; set; }

@ -1,11 +1,13 @@
using System.Text;
using Infrastructure;
using Infrastructure;
using Infrastructure.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using OpenAuth.App.ServiceApp.Algo;
using OpenAuth.App.ServiceApp.Algo.Request;
using OpenAuth.App.ServiceApp.Request;
using OpenAuth.WebApi.Model.RabbitMQService;
using System.Text;
namespace OpenAuth.WebApi.Controllers.ServiceControllers
{
@ -20,9 +22,11 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
private readonly string sk = "cf83a12caa155b994eb34fa9";
private readonly string baseUrl = "https://123.132.248.154:6405";
private readonly RabbitMqListenerService _listener;
public DaHuaAiController(RabbitMqListenerService listener)
private readonly DaHuaAiApp _app;
public DaHuaAiController(RabbitMqListenerService listener, DaHuaAiApp app)
{
_listener = listener;
_app = app;
}
private async Task<Response<string>> PostJsonAsync(string path, object body)
{
@ -213,5 +217,40 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
{
return PostJsonAsync($"/processing/inner/play/channel/{id}?streamType={streamType}&type={type}", new { });
}
/// <summary>
/// 大华数据分析
/// </summary>
/// <param name="firstId"></param>
/// <param name="secondId"></param>
[HttpPost]
[AllowAnonymous]
public async void BehaviorAlarm(string firstId, string secondId)
{
var mq = await RabbitMqSender.CreateAsync("123.132.248.154", 9103, "DHCloudg1", "Cloud0#4fCraQrm");
var dataList = await _app.BehaviorAlarm(firstId, secondId);
foreach (var data in dataList.Result)
{
await mq.SendAsync("event.capturePic.1.sdhc04", JsonConvert.SerializeObject(data));
}
}
/// <summary>
/// 测试插入数据
/// </summary>
/// <param name="info"></param>
[HttpPost]
[AllowAnonymous]
public async void AddBehaviorAlarm(string info)
{
await _app.AddDaHuaImg(info);
}
#region 接收本地模型数据
[HttpPost]
[AllowAnonymous]
public async Task<Response<bool>> AddImg([FromBody] AiImgReq request)
{
return await _app.AddImg(request.taskid, request.path, request.tag);
}
#endregion
}
}

@ -1,6 +1,9 @@
using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
using OpenAuth.App.ServiceApp.Algo;
using OpenAuth.WebApi.Model.mqtt;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
namespace OpenAuth.WebApi.Model.RabbitMQService
{
@ -12,8 +15,12 @@ namespace OpenAuth.WebApi.Model.RabbitMQService
private readonly Dictionary<string, string> _queueRoutingMap = new();
private readonly object _lock = new();
private readonly List<QueueBinding> _bindings = new();
public RabbitMqListenerService()
{
private readonly ILogger<RabbitMqListenerService> _logger;
private DaHuaAiApp _app;
public RabbitMqListenerService(ILogger<RabbitMqListenerService> logger, DaHuaAiApp app)
{
_logger = logger;
_app = app;
_factory = new ConnectionFactory
{
HostName = "123.132.248.154",
@ -45,22 +52,57 @@ namespace OpenAuth.WebApi.Model.RabbitMQService
_connection = await _factory.CreateConnectionAsync(stoppingToken);
_channel = await _connection.CreateChannelAsync();
//await BindQueueAsync(_channel, "processing_event", "topic", "event.trafficJunction.1.sdhc");
foreach (var binding in _bindings)
var queueOk = await _channel.QueueDeclareAsync(queue: "",
durable: false,
exclusive: true,
autoDelete: true);
//await _channel.QueueBindAsync(queueOk.QueueName, "processing_event", "event.eventNotAlarm.picture.1.#");
await _channel.QueueBindAsync(queueOk.QueueName, "processing_event", "event.behaviorAlarm.picture.1.#");
var consumer = new AsyncEventingBasicConsumer(_channel);
consumer.ReceivedAsync += async (sender, ea) =>
{
await BindQueueAsync(_channel, binding.Exchange, binding.ExchangeType, binding.RoutingKey);
}
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($"接收数据[processing_event]: {message}");
// Exchange 来做不同处理
switch (ea.Exchange)
{
case "processing_event":
await _app.AddDaHuaImg(message);
break;
case "thing_event":
Console.WriteLine($"[thing_event] {message}");
break;
default:
Console.WriteLine($"[Other:{ea.RoutingKey}] {message}");
break;
}
await Task.Yield();
};
await _channel.BasicConsumeAsync("", autoAck: true, consumer);
//foreach (var binding in _bindings)
//{
// await BindQueueAsync(_channel, binding.Exchange, binding.ExchangeType, binding.RoutingKey);
//}
}
private async Task BindQueueAsync(IChannel channel, string exchange, string exchangeType, string routingKey)
{
await channel.ExchangeDeclareAsync(exchange, exchangeType, durable: true);
await channel.QueueDeclareAsync("", durable: true, exclusive: false, autoDelete: false);
await channel.QueueBindAsync("", exchange, routingKey);
//await channel.ExchangeDeclareAsync(exchange, exchangeType, durable: true);
//await channel.QueueDeclareAsync("", durable: true, exclusive: false, autoDelete: false);
//var queueOk = await _channel.QueueDeclareAsync(queue: "",
// durable: false,
// exclusive: true,
// autoDelete: true);
//await channel.QueueBindAsync(queueOk.QueueName, exchange, routingKey);
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.ReceivedAsync += async (sender, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($"[processing_event]: {message}");
@ -82,7 +124,7 @@ namespace OpenAuth.WebApi.Model.RabbitMQService
};
await channel.BasicConsumeAsync("", autoAck: true, consumer);
}
}
//public async Task AddListenerAsync(string exchange, string exchangeType, string routingKey)
//{
// _connection = await _factory.CreateConnectionAsync();

@ -0,0 +1,75 @@
using RabbitMQ.Client;
using System.Text;
namespace OpenAuth.WebApi.Model.RabbitMQService
{
public class RabbitMqSender : IAsyncDisposable
{
private readonly IConnection _connection;
private readonly IChannel _channel;
private const string ExchangeName = "mps_event";
private const string ExchangeType = "topic";
public RabbitMqSender(IConnection connection, IChannel channel)
{
_connection = connection;
_channel = channel;
}
public static async Task<RabbitMqSender> CreateAsync(string hostName, int port, string userName, string password)
{
var factory = new ConnectionFactory()
{
HostName = hostName,
UserName = userName,
Password = password,
Port = port,
AutomaticRecoveryEnabled = true, // 自动重连
NetworkRecoveryInterval = TimeSpan.FromSeconds(5),
};
var connection = await factory.CreateConnectionAsync();
var channel = await connection.CreateChannelAsync();
await channel.ExchangeDeclareAsync(exchange: ExchangeName, type: ExchangeType, durable: true);
//await channel.QueueDeclareAsync("sdhc", durable: true, exclusive: false, autoDelete: false);
var queueOk = await channel.QueueDeclareAsync(queue: "",
durable: false,
exclusive: true,
autoDelete: true);
await channel.QueueBindAsync(queueOk.QueueName, "mps_event", "event.capturePic.1.sdhc04");
return new RabbitMqSender(connection, channel);
}
public async Task SendAsync(string routeKey, string message)
{
var body = Encoding.UTF8.GetBytes(message);
var properties = new BasicProperties()
{
Persistent = true
};
// 监听 BasicReturn 事件
_channel.BasicReturnAsync += (sender, args) =>
{
var returnedMessage = Encoding.UTF8.GetString(args.Body.ToArray());
Console.WriteLine($"[BasicReturn] Message returned: {returnedMessage}");
Console.WriteLine($"ReplyCode: {args.ReplyCode}, ReplyText: {args.ReplyText}");
Console.WriteLine($"Exchange: {args.Exchange}, RoutingKey: {args.RoutingKey}");
return Task.CompletedTask;
};
await _channel.BasicPublishAsync(exchange: "mps_event",
routingKey: routeKey,
mandatory: true,
basicProperties: properties,
body: body);
Console.WriteLine($"[RabbitMQ] 已发送到routeKey {routeKey}{message}");
}
public async ValueTask DisposeAsync()
{
if (_channel != null)
await _channel.CloseAsync();
if (_connection != null)
await _connection.CloseAsync();
}
}
}

@ -183,8 +183,8 @@ namespace OpenAuth.WebApi
#endregion
#region rabbitmq
//services.AddSingleton<RabbitMqListenerService>();
//services.AddHostedService(sp => sp.GetRequiredService<RabbitMqListenerService>());
services.AddSingleton<RabbitMqListenerService>();
services.AddHostedService(sp => sp.GetRequiredService<RabbitMqListenerService>());
#endregion
#region AppSetting

Loading…
Cancel
Save