|
|
|
@ -6,7 +6,6 @@ using OpenAuth.App.Interface;
|
|
|
|
|
using SqlSugar;
|
|
|
|
|
using Infrastructure;
|
|
|
|
|
using Infrastructure.Helpers;
|
|
|
|
|
using System.Text.Json;
|
|
|
|
|
using OpenAuth.App.ServiceApp.Response;
|
|
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
|
|
using OpenAuth.App.ServiceApp.DroneDocking.Request;
|
|
|
|
@ -20,12 +19,16 @@ using Org.BouncyCastle.Ocsp;
|
|
|
|
|
using System.Net.Http.Headers;
|
|
|
|
|
using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
|
|
|
|
|
using System.Data.SQLite;
|
|
|
|
|
using System.Dynamic;
|
|
|
|
|
using Infrastructure.CloudSdk.minio;
|
|
|
|
|
using Infrastructure.Extensions;
|
|
|
|
|
using System.Security.Cryptography;
|
|
|
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
|
|
using System.Text.Json.Nodes;
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
|
|
|
using OpenAuth.WebApi;
|
|
|
|
|
using JsonSerializer = System.Text.Json.JsonSerializer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace OpenAuth.App.ServiceApp.DroneDocking
|
|
|
|
@ -651,69 +654,169 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="req"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<ResData> getDroneStatus(string deviceid)
|
|
|
|
|
public async Task<ResData> GetDroneStatus(string deviceid)
|
|
|
|
|
{
|
|
|
|
|
// 取得无人机类型
|
|
|
|
|
// 取得机场信息
|
|
|
|
|
// 监听无人机信息
|
|
|
|
|
// mode_code 0:在线;1:不在线;2:任务执行中
|
|
|
|
|
// todo drone_in_dock 0":"舱外","1":"舱内"
|
|
|
|
|
// 舱外 任务执行中 关机是在线还是不在线?应该是不在线吧?
|
|
|
|
|
// todo 1. 先取机场信息,是否在
|
|
|
|
|
var now = DateTime.Now;
|
|
|
|
|
var time = now.AddSeconds(-5);
|
|
|
|
|
var log = await Repository
|
|
|
|
|
.ChangeRepository<SugarRepositiry<LasaLog>>()
|
|
|
|
|
.AsQueryable()
|
|
|
|
|
.Where(r => r.Topic == "")
|
|
|
|
|
.Where(r => r.CreateTime > time) // 查询5秒以内数据
|
|
|
|
|
.Where(r => SqlFunc.JsonLike(r.Data, "drone_in_dock"))
|
|
|
|
|
.OrderByDescending(r => r.CreateTime)
|
|
|
|
|
.FirstAsync();
|
|
|
|
|
// 当前时间
|
|
|
|
|
|
|
|
|
|
ResData response = new ResData();
|
|
|
|
|
string data = @"
|
|
|
|
|
/*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""
|
|
|
|
|
""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""
|
|
|
|
|
}
|
|
|
|
|
";
|
|
|
|
|
if (true)
|
|
|
|
|
";*/
|
|
|
|
|
dynamic data = new ExpandoObject();
|
|
|
|
|
var dock = await Repository
|
|
|
|
|
.ChangeRepository<SugarRepositiry<LasaDronePort>>()
|
|
|
|
|
.AsQueryable()
|
|
|
|
|
.LeftJoin<LasaUav>((a, b) => a.Id == b.PId)
|
|
|
|
|
.Where((a, b) => b.Sn == deviceid).FirstAsync();
|
|
|
|
|
if (dock == null) // 无人机不在线
|
|
|
|
|
{
|
|
|
|
|
string x_lc_secret = _helper.getxseret();
|
|
|
|
|
data.code = 200;
|
|
|
|
|
dynamic inData = new ExpandoObject();
|
|
|
|
|
inData.mode_code = 1; // 不在线
|
|
|
|
|
data.message = "获取无人机状态成功";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
data.code = 200;
|
|
|
|
|
var dockOsdTopic = $"thing/product/{dock.Sn}/osd";
|
|
|
|
|
var now = DateTime.Now;
|
|
|
|
|
var time = now.AddSeconds(-5);
|
|
|
|
|
var log = await Repository
|
|
|
|
|
.ChangeRepository<SugarRepositiry<LasaLog>>()
|
|
|
|
|
.AsQueryable()
|
|
|
|
|
.Where(r => r.Topic == dockOsdTopic)
|
|
|
|
|
.Where(r => r.CreateTime > time) // 查询5秒以内数据
|
|
|
|
|
.Where(r => SqlFunc.JsonLike(r.Data, "drone_in_dock"))
|
|
|
|
|
.OrderByDescending(r => r.CreateTime)
|
|
|
|
|
.FirstAsync();
|
|
|
|
|
if (log != null)
|
|
|
|
|
{
|
|
|
|
|
// 当前时间
|
|
|
|
|
var dockOsdData =
|
|
|
|
|
JsonConvert.DeserializeObject<JObject>(JsonConvert.DeserializeObject<string>(log.Data));
|
|
|
|
|
//drone_in_dock 0":"舱外","1":"舱内"
|
|
|
|
|
var droneInDock = dockOsdData["data"]?["drone_in_dock"]?.Value<int>();
|
|
|
|
|
if (droneInDock == 0) // 飞行任务状态
|
|
|
|
|
{
|
|
|
|
|
var droneOsdTopic = $"thing/product/{deviceid}/osd";
|
|
|
|
|
log = await Repository
|
|
|
|
|
.ChangeRepository<SugarRepositiry<LasaLog>>()
|
|
|
|
|
.AsQueryable()
|
|
|
|
|
.Where(r => r.Topic == droneOsdTopic)
|
|
|
|
|
.Where(r => r.CreateTime > time) // 查询5秒以内数据
|
|
|
|
|
.OrderByDescending(r => r.CreateTime)
|
|
|
|
|
.FirstAsync();
|
|
|
|
|
if (log != null)
|
|
|
|
|
{
|
|
|
|
|
var droneOsdData =
|
|
|
|
|
JsonConvert.DeserializeObject<JObject>(JsonConvert.DeserializeObject<string>(log.Data));
|
|
|
|
|
|
|
|
|
|
var longitude = Math.Round(droneOsdData["data"]?["longitude"]?.Value<decimal>() ?? 0m, 7);
|
|
|
|
|
var latitude = Math.Round(droneOsdData["data"]?["latitude"]?.Value<decimal>() ?? 0m, 7);
|
|
|
|
|
var height = Math.Round(droneOsdData["data"]?["height"]?.Value<decimal>() ?? 0m, 2);
|
|
|
|
|
var elevation = Math.Round(droneOsdData["data"]?["elevation"]?.Value<decimal>() ?? 0m, 2);
|
|
|
|
|
// 云台信息
|
|
|
|
|
var payload99 = droneOsdData["data"]?["99-0-0"];
|
|
|
|
|
var gimbalPitch = payload99?["gimbal_pitch"]?.Value<double>();
|
|
|
|
|
var gimbalYaw = payload99?["gimbal_yaw"]?.Value<double>();
|
|
|
|
|
//var gimbalRoll = payload99?["gimbal_roll"]?.Value<double>();
|
|
|
|
|
var batteryCapacityPercent =
|
|
|
|
|
droneOsdData["data"]?["battery"]?["capacity_percent"]?.Value<int>();
|
|
|
|
|
var quality = droneOsdData["data"]?["position_state"]?["quality"]?.Value<int>();
|
|
|
|
|
|
|
|
|
|
dynamic inData = new ExpandoObject();
|
|
|
|
|
// mode_code 0:在线;1:不在线;2:任务执行中
|
|
|
|
|
inData.mode_code = 2;
|
|
|
|
|
inData.longitude = longitude;
|
|
|
|
|
inData.latitude = latitude;
|
|
|
|
|
inData.height = height;
|
|
|
|
|
inData.elevation = elevation;
|
|
|
|
|
inData.gimbal_pitch = gimbalPitch;
|
|
|
|
|
inData.gimbal_yaw = gimbalYaw;
|
|
|
|
|
//data.gimbal_roll = gimbalRoll;
|
|
|
|
|
inData.battery_capacity_percent = batteryCapacityPercent;
|
|
|
|
|
|
|
|
|
|
inData.gps_state = quality switch
|
|
|
|
|
{
|
|
|
|
|
< 2 => 1, // 低精度
|
|
|
|
|
< 10 => 2, // 高精度
|
|
|
|
|
_ => 3 // rtk定位
|
|
|
|
|
};
|
|
|
|
|
data.data = inData;
|
|
|
|
|
data.message = "获取无人机状态成功!";
|
|
|
|
|
data.traceid = Guid.NewGuid().ToString();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
data.code = 502;
|
|
|
|
|
data.message = "获取无人机状态失败";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// 舱内 关机或者开机状态
|
|
|
|
|
// 这里取机场osd日志信息
|
|
|
|
|
dynamic inData = new ExpandoObject();
|
|
|
|
|
inData.battery_capacity_percent =
|
|
|
|
|
dockOsdData["data"]?["drone_charge_state"]?["capacity_percent"]?.Value<int>();
|
|
|
|
|
inData.elevation = 0;
|
|
|
|
|
inData.mode_code = 0;
|
|
|
|
|
var longitude = Math.Round(dockOsdData["data"]?["longitude"]?.Value<decimal>() ?? 0m, 7);
|
|
|
|
|
var latitude = Math.Round(dockOsdData["data"]?["latitude"]?.Value<decimal>() ?? 0m, 7);
|
|
|
|
|
var height = Math.Round(dockOsdData["data"]?["height"]?.Value<decimal>() ?? 0m, 2);
|
|
|
|
|
inData.longitude = longitude;
|
|
|
|
|
inData.latitude = latitude;
|
|
|
|
|
inData.height = height;
|
|
|
|
|
var quality = dockOsdData["data"]?["position_state"]?["quality"]?.Value<int>();
|
|
|
|
|
inData.gps_state = quality switch
|
|
|
|
|
{
|
|
|
|
|
< 2 => 1,
|
|
|
|
|
< 10 => 2,
|
|
|
|
|
_ => 3
|
|
|
|
|
};
|
|
|
|
|
data.data = inData;
|
|
|
|
|
data.traceid = Guid.NewGuid().ToString();
|
|
|
|
|
data.code = 200;
|
|
|
|
|
data.message = "获取无人机状态成功";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var response = new ResData();
|
|
|
|
|
if (data.code == 200)
|
|
|
|
|
{
|
|
|
|
|
string xLcSecret = _helper.getxseret();
|
|
|
|
|
// 转换为字节数组
|
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(data);
|
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));
|
|
|
|
|
var encryptedResData = _helper.Encrypt(bytes);
|
|
|
|
|
response.Result = encryptedResData;
|
|
|
|
|
response.Message = "获取无人机机场状态成功!";
|
|
|
|
|
response.Message = "获取无人机状态成功!";
|
|
|
|
|
response.Code = 200;
|
|
|
|
|
response.Secret = x_lc_secret;
|
|
|
|
|
response.Secret = xLcSecret;
|
|
|
|
|
return response;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
string x_lc_secret = _helper.getxseret();
|
|
|
|
|
string xLcSecret = _helper.getxseret();
|
|
|
|
|
// 转换为字节数组
|
|
|
|
|
byte[] bytes = Encoding.UTF8.GetBytes(" ");
|
|
|
|
|
|
|
|
|
|
var encryptedResData = _helper.Encrypt(bytes);
|
|
|
|
|
response.Result = encryptedResData;
|
|
|
|
|
response.Message = "获取无人机机场状态失败!";
|
|
|
|
|
response.Message = "获取无人机状态失败!";
|
|
|
|
|
response.Code = 500;
|
|
|
|
|
response.Secret = x_lc_secret;
|
|
|
|
|
response.Secret = xLcSecret;
|
|
|
|
|
return response;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -962,14 +1065,22 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
|
|
|
|
|
public async void InsertDb(string taskid)
|
|
|
|
|
{
|
|
|
|
|
var sqliteconnect = configuration.GetSection("DroneDocking:DbFile").Value;
|
|
|
|
|
/*// 确保数据库文件存在
|
|
|
|
|
if (!File.Exists(sqliteconnect))
|
|
|
|
|
{
|
|
|
|
|
var directory = Path.GetDirectoryName(sqliteconnect);
|
|
|
|
|
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
|
|
|
|
|
{
|
|
|
|
|
Directory.CreateDirectory(directory);
|
|
|
|
|
}
|
|
|
|
|
SQLiteConnection.CreateFile(sqliteconnect);
|
|
|
|
|
}*/
|
|
|
|
|
string _sqliteConnection = "DataSource = " + sqliteconnect + "; Version = 3; ";
|
|
|
|
|
string sql = "select * from drone_docktaskdetail where taskid='" + taskid + "'";
|
|
|
|
|
var filigtlist = _client.Ado.SqlQuery<DroneDocktaskdetail>(sql);
|
|
|
|
|
using (var sqliteConn = new SQLiteConnection(_sqliteConnection))
|
|
|
|
|
{
|
|
|
|
|
sqliteConn.Open();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string deleteDbinfo1 = "delete from JMXX";
|
|
|
|
|
using (var cmd2 = new SQLiteCommand(deleteDbinfo1, sqliteConn))
|
|
|
|
|
{
|
|
|
|
@ -1149,21 +1260,35 @@ namespace OpenAuth.App.ServiceApp.DroneDocking
|
|
|
|
|
{
|
|
|
|
|
RefAsync<int> totalCount = 0;
|
|
|
|
|
var info = await base.Repository.AsQueryable()
|
|
|
|
|
.WhereIF(!string.IsNullOrEmpty(keyWord),
|
|
|
|
|
t => t.taskname.Contains(keyWord) || t.bizidname.Contains(keyWord))
|
|
|
|
|
.Select(t => new DroneDockRes
|
|
|
|
|
.WhereIF(!string.IsNullOrEmpty(keyWord), t => t.taskname.Contains(keyWord)||t.bizidname.Contains(keyWord))
|
|
|
|
|
.Select(t=>new DroneDockRes
|
|
|
|
|
{
|
|
|
|
|
id= t.id,
|
|
|
|
|
bizidname= t.bizidname,
|
|
|
|
|
taskname= t.taskname,
|
|
|
|
|
createtime= t.createtime,
|
|
|
|
|
state= t.state,
|
|
|
|
|
datacode= t.datacode,
|
|
|
|
|
deviceid= t.deviceid,
|
|
|
|
|
taskid= t.taskid,
|
|
|
|
|
tasklist = SqlFunc.Subqueryable<DroneDocktaskdetail>().Where(r => r.taskid == t.id).LeftJoin<LasaTask>((r, s) => r.flighttaskid == s.FlightId).ToList((r,s)=> new DetailRes
|
|
|
|
|
{
|
|
|
|
|
id = t.id,
|
|
|
|
|
bizidname = t.bizidname,
|
|
|
|
|
taskname = t.taskname,
|
|
|
|
|
createtime = t.createtime,
|
|
|
|
|
state = t.state,
|
|
|
|
|
datacode = t.datacode,
|
|
|
|
|
deviceid = t.deviceid,
|
|
|
|
|
taskid = t.taskid,
|
|
|
|
|
tasklist = SqlFunc.Subqueryable<DroneDocktaskdetail>().Where(r => r.taskid == t.id).ToList()
|
|
|
|
|
id = r.id,
|
|
|
|
|
bsm=r.bsm,
|
|
|
|
|
Status=s.Status,
|
|
|
|
|
bz=r.bz,
|
|
|
|
|
dkbh=r.dkbh,
|
|
|
|
|
dkfw=r.dkfw,
|
|
|
|
|
dklx=r.dklx,
|
|
|
|
|
dkmc=r.dkmc,
|
|
|
|
|
dkmj=r.dkmj,
|
|
|
|
|
flighttaskid=r.flighttaskid,
|
|
|
|
|
taskid=r.taskid,
|
|
|
|
|
xzqdm=r.xzqdm,
|
|
|
|
|
zdkbh=r.zdkbh
|
|
|
|
|
})
|
|
|
|
|
.ToPageListAsync(page, limit, totalCount);
|
|
|
|
|
})
|
|
|
|
|
.ToPageListAsync(page, limit, totalCount);
|
|
|
|
|
return new Response<PageInfo<List<DroneDockRes>>>
|
|
|
|
|
{
|
|
|
|
|
Result = new PageInfo<List<DroneDockRes>>
|
|
|
|
|