1. 修改无人机状态查询方法

2. 完成无人机状态上报
main
陈伟 4 days ago
parent 47bcba4b57
commit 97656a3a05

@ -654,27 +654,9 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task<ResData> GetDroneStatus(string deviceid)
public async Task<dynamic> GetDroneStatus(string deviceid)
{
/*string data = @"
{
""code"": 200,
""data"": {
""mode_code"": 0,
""longitude"": 122.45,
""latitude"": 30.45,
""height"": 80,
""elevation"": 50,
""gimbal_pitch"": -45,
""gimbal_yaw"": 23,
""battery_capacity_percent"": 35,
""gps_state"": 2
},
""message"": """",
""traceid"": ""xxx""
}
";*/
dynamic data = new ExpandoObject();
dynamic result = new ExpandoObject();
var dock = await Repository
.ChangeRepository<SugarRepositiry<LasaDronePort>>()
.AsQueryable()
@ -682,14 +664,15 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
.Where((a, b) => b.Sn == deviceid).FirstAsync();
if (dock == null) // 无人机不在线
{
data.code = 200;
result.code = 200;
dynamic inData = new ExpandoObject();
result.data = inData;
inData.mode_code = 1; // 不在线
data.message = "获取无人机状态成功";
result.message = "获取无人机状态成功";
}
else
{
data.code = 200;
result.code = 200;
var dockOsdTopic = $"thing/product/{dock.Sn}/osd";
var now = DateTime.Now;
var time = now.AddSeconds(-5);
@ -754,14 +737,14 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
< 10 => 2, // 高精度
_ => 3 // rtk定位
};
data.data = inData;
data.message = "获取无人机状态成功!";
data.traceid = Guid.NewGuid().ToString();
result.data = inData;
result.message = "获取无人机状态成功!";
result.traceid = Guid.NewGuid().ToString();
}
else
{
data.code = 502;
data.message = "获取无人机状态失败";
result.code = 502;
result.message = "获取无人机状态失败";
}
}
else
@ -786,39 +769,15 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
< 10 => 2,
_ => 3
};
data.data = inData;
data.traceid = Guid.NewGuid().ToString();
data.code = 200;
data.message = "获取无人机状态成功";
result.data = inData;
result.traceid = Guid.NewGuid().ToString();
result.code = 200;
result.message = "获取无人机状态成功";
}
}
}
} // 设备在线
var response = new ResData();
if (data.code == 200)
{
string xLcSecret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
var encryptedResData = _helper.Encrypt(bytes);
response.Result = encryptedResData;
response.Message = "获取无人机状态成功!";
response.Code = 200;
response.Secret = xLcSecret;
return response;
}
else
{
string xLcSecret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
response.Result = encryptedResData;
response.Message = "获取无人机状态失败!";
response.Code = 500;
response.Secret = xLcSecret;
return response;
}
return result;
}
/// <summary>
@ -863,14 +822,75 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
.AsQueryable()
.Where(it => it.IsDelete == false)
.ToListAsync();
var dataList = new List<dynamic>();
foreach (var item in droneList)
{
var status = await GetDroneStatus(item.Id);
var originalData = await GetDroneStatus(item.Sn);
var inData = originalData.data;
// 转换状态值 mode_code -> onlinestate
// 0:在线1:不在线2:任务执行中 -> 设备在线状态00:不在线10:在线20任务执行中
// 增加设备id deviceid
inData.deviceid = item.Sn;
inData.onlinestate = inData.mode_code switch
{
0 => "10",
1 => "00",
2 => "20",
_ => "00"
};
dataList.Add(inData);
}
using var client = new HttpClient();
try
{
// 无人机状态上报接口
var url = configuration.GetSection("DroneDocking:Url").Value +
"/droneAirport/reportDroneStatus";
var xLcSecret = _helper.getxseret();
var centerCode = "UAV32_LJY2FPMYDE6UDES3P3ZD7V3IKQ";
var xToken = _helper.GetToken(centerCode);
// 序列化为 JSON 字符串
string json = JsonSerializer.Serialize(dataList);
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(json);
var encryptedData = _helper.Encrypt(bytes);
// 创建请求体
var httpContent = new StringContent(encryptedData, Encoding.UTF8, "application/json");
// 添加请求头
client.DefaultRequestHeaders.Add("x-lc-secret", xLcSecret);
client.DefaultRequestHeaders.Add("x-lc-token", xToken);
//发送请求
HttpResponseMessage response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
// 获取响应头中的 x_cl_screte 参数
var resxClScrete = GetHeaderValue(response, "x-lc-secret");
// 读取响应内容并反序列化
var responseBody = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ReciveData<string>>(responseBody);
//解密数据
byte[] resbytesx = Convert.FromBase64String(resxClScrete);
byte[] resdatabytes = Convert.FromBase64String(result?.data);
string data = _helper.Decrypt(resbytesx, resdatabytes);
// 结果
}
catch (HttpRequestException e)
{
return new Response<bool>()
{
Result = false,
Message = e.Message
};
}
// todo 获取无人机状态列表
// todo
return null;
return new Response<bool>()
{
Result = true,
};
}

@ -10,6 +10,7 @@ using OpenAuth.App.ServiceApp.Response;
using OpenAuth.Repository.Domain;
using Org.BouncyCastle.Ocsp;
using System.Text;
using Newtonsoft.Json;
namespace OpenAuth.WebApi.Controllers.ServiceControllers
{
@ -311,18 +312,41 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
{
try
{
var data = await _app.GetDroneStatus(deviceid);
result.data = data.Result;
result.code = data.Code;
result.message = data.Message;
var inResult = await _app.GetDroneStatus(deviceid);
var response = new ResData();
if (inResult.code == 200)
{
string xLcSecret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result));
var encryptedResData = _helper.Encrypt(bytes);
response.Result = encryptedResData;
response.Message = "获取无人机状态成功!";
response.Code = 200;
response.Secret = xLcSecret;
}
else
{
string xLcSecret = _helper.getxseret();
// 转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes(" ");
var encryptedResData = _helper.Encrypt(bytes);
response.Result = encryptedResData;
response.Message = "获取无人机状态失败!";
response.Code = 500;
response.Secret = xLcSecret;
}
result.data = inResult.Result;
result.code = inResult.Code;
result.message = inResult.Message;
result.traceid = Guid.NewGuid().ToString();
Response.Headers.Add("x-lc-secret", data.Secret);
Response.Headers.Add("x-lc-secret", inResult.Secret);
}
catch (Exception ex)
{
result.code = 200;
result.message = "error";
result.traceid = Guid.NewGuid().ToString();
}
return result;

@ -0,0 +1,47 @@
using OpenAuth.App.ServiceApp.DroneDocking;
namespace OpenAuth.WebApi.SystemTask;
public class DelayedExecutionService : BackgroundService
{
private readonly ILogger<DelayedExecutionService> _logger;
private readonly DroneDockApp _droneDockApp;
public DelayedExecutionService(ILogger<DelayedExecutionService> logger, DroneDockApp droneDockApp)
{
_logger = logger;
_droneDockApp = droneDockApp;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("定时任务已启动将每5秒执行一次");
while (!stoppingToken.IsCancellationRequested)
{
try
{
await PerformDelayedTask();
// 等待5秒
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
catch (OperationCanceledException)
{
_logger.LogInformation("定时任务被取消");
break;
}
catch (Exception ex)
{
_logger.LogError(ex, "定时任务执行时发生错误");
// 即使出错也继续下一次执行
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
}
}
private async Task PerformDelayedTask()
{
await _droneDockApp.ReportDroneStatus();
await Task.CompletedTask;
}
}
Loading…
Cancel
Save