无人机任务更新、任务取消

main
洁 任 2 months ago
parent bcb13fd7f5
commit ce45c75b01

@ -35,7 +35,7 @@ namespace Infrastructure.Helpers
}
//十六进制字符串 → 字节数组 publickey
byte[] publickeybyte = HexToBytes(publicKey);
byte[] publickeybyte = HexToBytes(publickey);
var encryptdatasm2 = SM2CryptoHelper.Encrypt(publickeybyte, sm4Key);
return Convert.ToBase64String(encryptdatasm2);
}
@ -122,7 +122,7 @@ namespace Infrastructure.Helpers
byte[] signbyte=Convert.FromBase64String(signData);
byte[] needSignDataByte = Encoding.UTF8.GetBytes(needSignData);
// 4. SM2验签 publickey
byte[] publickeybyte = HexToBytes(publicKey);
byte[] publickeybyte = HexToBytes(publickey);
try
{
return SM2CryptoHelper.Verify(publickeybyte, needSignDataByte, signbyte);

@ -15,11 +15,11 @@ using DocumentFormat.OpenXml.Office.CustomUI;
namespace OpenAuth.App.ServiceApp.DroneDocking
{
public class DroneDockApp : SqlSugarBaseApp<LasaDronePort, SugarDbContext>
public class DroneDockApp : SqlSugarBaseApp<DroneDocktask, SugarDbContext>
{
private EncryptionHelper _helper;
private IConfiguration configuration;
public DroneDockApp(EncryptionHelper helper, IConfiguration configuration, ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<LasaDronePort> repository, IAuth auth) : base(unitWork, repository, auth)
public DroneDockApp(EncryptionHelper helper, IConfiguration configuration, ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<DroneDocktask> repository, IAuth auth) : base(unitWork, repository, auth)
{
_helper = helper;
this.configuration = configuration;
@ -228,7 +228,7 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<Response<string>> Test(AirPortTaskReq req)
public async Task<Response<string>> Test(AirPortUpdateTaskReq req)
{
Response<string> Response = new Response<string>();
@ -239,10 +239,10 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
{
try
{
string url = "http://localhost:10042/zhcfzx/droneAirport/AddTask";
string url = "http://localhost:10042/zhcfzx/droneAirport/updateTask";
string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = _helper.GetToken(centercode);
string x_token = "API32_HENJOZMPBYKEXNVLFMY3Y5W5SQ.1751622229582.fmCjIucQYyq4YZe4CnSStN/rHcwjZTxUsDuXeXJfrYn0bwoaV1/IW8mcFwtLw8JHjowvMJrmPyy/QZAhssxQCQ==";
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(req);
@ -289,6 +289,56 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
return Response;
}
public async Task<Response<string>> Test1(string taskid)
{
Response<string> Response = new Response<string>();
var handler = new HttpClientHandler();
// 如果需要忽略服务器证书错误(仅测试环境)
handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
try
{
string url = $"http://localhost:10042/zhcfzx/droneAirport/cancelTask?taskid={taskid}";
//string x_lc_secret = _helper.getxseret();
string centercode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
string x_token = "API32_HENJOZMPBYKEXNVLFMY3Y5W5SQ.1751622229582.fmCjIucQYyq4YZe4CnSStN/rHcwjZTxUsDuXeXJfrYn0bwoaV1/IW8mcFwtLw8JHjowvMJrmPyy/QZAhssxQCQ==";
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-token", x_token);
//发送请求
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
string resx_cl_screte = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
string responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resx_cl_screte);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
Response.Result = data;
Response.Message = result.message;
Response.Code = result.code;
}
catch (HttpRequestException e)
{
Console.WriteLine("\nException Caught!");
Console.WriteLine("Message :{0} ", e.Message);
Response.Result = "连接错误";
}
}
return Response;
}
/// <summary>
/// 无人机任务添加
/// </summary>
@ -314,6 +364,8 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
dt.taskid = task.taskid;
dt.taskname = task.taskname;
dt.datacode= task.datacode;
dt.state = 0;
dt.createtime = DateTime.Now;
//taskdetail数据生成
List<DroneDocktaskdetail> dalist= new List<DroneDocktaskdetail>();
@ -339,23 +391,149 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
using (var uow = base.UnitWork.CreateContext())
{
//本地数据库数据添加
await uow.DroneDocktask.InsertAsync(dt);
await uow.DroneDocktaskdetail.InsertRangeAsync(dalist);
var flag = uow.Commit();
//返回数据
if (flag)
//查询数据 检查是否有重复数据
var info = uow.DroneDocktask.AsQueryable().Where(r => r.taskid == task.taskid).First();
if (info != null)
{
//本地数据库数据添加
await uow.DroneDocktask.InsertAsync(dt);
await uow.DroneDocktaskdetail.InsertRangeAsync(dalist);
var flag = uow.Commit();
//返回数据
if (flag)
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(dt.taskid);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务添加成功";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务添加失败";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(dt.taskid);
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务添加成功";
Response.Code = 200;
Response.Message = "已存在相同taskid任务";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
}
/// <summary>
/// 无人机任务更新
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> UpdateTask(string req, string secret)
{
ResData Response = new ResData();
//解密数据
byte[] secretbyte = Convert.FromBase64String(secret); //x-lc-secret
byte[] reqbyte = Convert.FromBase64String(req); //返回数据
string data = _helper.Decrypt(secretbyte, reqbyte);
//序列化返回数据并处理
var task = JsonSerializer.Deserialize<AirPortUpdateTaskReq>(data);
using (var uow = base.UnitWork.CreateContext())
{
//查询数据
var info=uow.DroneDocktask.AsQueryable().Where(r=>r.taskid==task.taskid).First();
if (info != null)
{
if (info.state == 0)
{
//taskdetail数据生成
List<DroneDocktaskdetail> dalist = new List<DroneDocktaskdetail>();
if (task.tasklist.Count > 0)
{
foreach (var item in task.tasklist)
{
DroneDocktaskdetail da = new DroneDocktaskdetail();
da.id = Guid.NewGuid().ToString();
da.taskid = info.id;
da.bz = item.bz;
da.dkbh = item.dkbh;
da.dkfw = item.dkfw;
da.dkmj = item.dkmj;
da.dkmc = item.dkmc;
da.xzqdm = item.xzqdm;
da.zdkbh = item.zdkbh;
da.bsm = item.bsm;
da.dklx = item.dklx;
dalist.Add(da);
}
}
await uow.DroneDocktaskdetail.DeleteAsync(r => r.taskid == info.taskid);
await uow.DroneDocktaskdetail.InsertRangeAsync(dalist);
var flag = uow.Commit();
//返回数据
if (flag)
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(info.taskid);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务更新成功";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务更新失败";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "任务已开始执行,无法更新,请重新添加任务";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
@ -365,15 +543,76 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务添加失败";
Response.Message = "未找到任务数据";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
}
}
}
/// <summary>
/// 取消任务
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> CancelTask(string taskid)
{
ResData Response = new ResData();
using (var uow = base.UnitWork.CreateContext())
{
//查询数据
var info = uow.DroneDocktask.AsQueryable().Where(r => r.taskid == taskid).First();
if (info != null)
{
var flag = await uow.DroneDocktask.UpdateAsync(it => new DroneDocktask()
{
state=3
}, it => it.id == info.id);
//返回数据
if (uow.Commit())
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(info.taskid);
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务取消成功";
Response.Code = 200;
Response.Secret = x_lc_secret;
return Response;
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "无人机机场任务取消失败";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
else
{
string x_lc_secret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
Response.Result = encryptedResData;
Response.Message = "未找到任务数据";
Response.Code = 500;
Response.Secret = x_lc_secret;
return Response;
}
}
}
// 安全获取响应头值的方法
private static string GetHeaderValue(HttpResponseMessage response, string headerName)

@ -170,4 +170,20 @@ namespace OpenAuth.App.ServiceApp.DroneDocking.Request
public string Result { get; set; }
public string Secret {get;set;}
}
public class AirPortUpdateTaskReq
{
//无人机机场设备唯一id
public List<string> deviceid { get; set; }
/// <summary>
/// Desc:下发任务id
/// Default:
/// Nullable:True
/// </summary>
public string taskid { get; set; }
public List<TaskDetail> tasklist { get; set; }
}
}

@ -57,6 +57,12 @@ namespace OpenAuth.Repository.Domain
/// Nullable:False
/// </summary>
public string datacode {get;set;}
/// <summary>
/// 任务是否开始执行0未开始1已开始2已完成3已取消
/// </summary>
public int state { get; set;}
public DateTime? createtime { get; set; }
}
}

@ -90,14 +90,14 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
}
[HttpPost]
[HttpGet]
[AllowAnonymous]
public async Task<Response<string>> Test([FromBody] AirPortTaskReq req)
public async Task<Response<string>> Test(string taskid)
{
var result = new Response<string>();
try
{
result = await _app.Test(req);
result = await _app.Test1(taskid);
}
catch (Exception ex)
{
@ -169,5 +169,115 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
}
}
/// <summary>
/// 无人机任务更新
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[Route("/zhcfzx/droneAirport/updateTask")]
[HttpPost]
[AllowAnonymous]
public async Task<ReciveData<string>> updateTask(string recivedata)
{
var result = new ReciveData<string>();
if (Request.Headers.TryGetValue("x-lc-token", out var tokenValue))
{
var tokenflag = _helper.Verify(tokenValue);
if (tokenflag)
{
// 获取请求头中的x-lc-secret
if (Request.Headers.TryGetValue("x-lc-secret", out var secretValue))
{
string secret = secretValue.ToString();
try
{
// 1. 从请求体中直接读取原始字符串(即 encryptedData
string req;
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
req = await reader.ReadToEndAsync();
}
var data = await _app.UpdateTask(req, secret);
result.data = data.Result;
result.code = data.Code;
result.message = data.Message;
Request.Headers.TryGetValue("traceid", out var traceid);
result.traceid = traceid;
Response.Headers.Add("x-lc-secret", data.Secret);
}
catch (Exception ex)
{
result.code = 200;
result.message = "error";
Request.Headers.TryGetValue("traceid", out var traceid);
result.traceid = traceid;
}
return result;
}
else
{
throw new Exception("Missing required header: x-lc-secret");
}
}
else
{
throw new Exception("unauthorized");
}
}
else
{
throw new Exception("Missing required header: x-lc-token");
}
}
/// <summary>
/// 取消无人机任务
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[Route("/zhcfzx/droneAirport/cancelTask")]
[HttpGet]
[AllowAnonymous]
public async Task<ReciveData<string>> cancelTask(string taskid)
{
var result = new ReciveData<string>();
if (Request.Headers.TryGetValue("x-lc-token", out var tokenValue))
{
var tokenflag = _helper.Verify(tokenValue);
if (tokenflag)
{
try
{
var data = await _app.CancelTask(taskid);
result.data = data.Result;
result.code = data.Code;
result.message = data.Message;
Request.Headers.TryGetValue("traceid", out var traceid);
result.traceid = traceid;
Response.Headers.Add("x-lc-secret", data.Secret);
}
catch (Exception ex)
{
result.code = 200;
result.message = "error";
Request.Headers.TryGetValue("traceid", out var traceid);
result.traceid = traceid;
}
return result;
}
else
{
throw new Exception("unauthorized");
}
}
else
{
throw new Exception("Missing required header: x-lc-token");
}
}
}
}

Loading…
Cancel
Save