天气阻飞修改

main
陈伟 4 weeks ago
parent 69688a9c94
commit 82e228c7cf

@ -874,6 +874,8 @@ namespace OpenAuth.App.ServiceApp
throw new Exception("指定机场不存在"); throw new Exception("指定机场不存在");
} }
// 取值 Dock 3
var dockTypeId = dronePort.TypeId;
var serialNo = dronePort.Sn; var serialNo = dronePort.Sn;
if (!string.IsNullOrEmpty(task.WorkspaceId)) if (!string.IsNullOrEmpty(task.WorkspaceId))
{ {
@ -881,96 +883,108 @@ namespace OpenAuth.App.ServiceApp
.GetByIdAsync(task.WorkspaceId); .GetByIdAsync(task.WorkspaceId);
if (workspace != null) if (workspace != null)
{ {
if (workspace.IsCloudBlockFlight || workspace.IsWeatherBlockFlight) // 机场天气信息 阀值(自定义和) 雨量阀值 风速阀值
// 赋值默认阀值
var rainThreshold = 3; // 大雨
var windSpeedThreshold = 12;
double weatherWindSpeed = 0; // 天气预报风速
double weatherWindSpeedThreshold = 0;
switch (dockTypeId)
{ {
// todo 关于存在多条阻飞阀值的问题 这里有可能是多个值 case "Dock":
// todo 这里是不同机场不同值 rainThreshold = 3; // 大雨
windSpeedThreshold = 12;
break;
case "Dock 2":
rainThreshold = 3; // 大雨
windSpeedThreshold = 8;
break;
case "Dock 3":
rainThreshold = 3; // 大雨
windSpeedThreshold = 8;
break;
}
// 1. 云端阻飞开启天气阻飞未开启 2. 云端阻飞未开启 3. 云端阻飞开启,天气阻飞开启
if (workspace.IsCloudBlockFlight)
{
var type = dockTypeId switch
{
"Dock" => "大疆机场",
"Dock 2" => "大疆机场2",
"Dock 3" => "大疆机场3",
_ => "大疆机场"
};
var spaceLockFly = await Repository var spaceLockFly = await Repository
.ChangeRepository<SugarRepositiry<LasaSpaceLockFly>>() .ChangeRepository<SugarRepositiry<LasaSpaceLockFly>>()
.GetSingleAsync(r => r.WorkSpaceId == task.WorkspaceId); .GetSingleAsync(r => r.WorkSpaceId == task.WorkspaceId && r.Name == type);
if (spaceLockFly != null) if (spaceLockFly != null)
{ {
var rainFallThreshold = int.Parse(spaceLockFly.RainFall); rainThreshold = Convert.ToInt32(spaceLockFly.RainFall);
var windSpeedThreshold = spaceLockFly.WindSpeed; windSpeedThreshold = spaceLockFly.WindSpeed;
var weatherWindSpeedThreshold = spaceLockFly.WeatherWindSpeed; weatherWindSpeedThreshold = spaceLockFly.WeatherWindSpeed;
// 云端阻飞 }
if (workspace.IsCloudBlockFlight) }
if (workspace.IsWeatherBlockFlight)
{
using (var httpClient = new HttpClient())
{
// todo 目前地理位置是写死的兰山
var response = await httpClient.GetAsync(
"http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=84261622&appsecret=k0WPY4Cx&city=兰山");
if (response.IsSuccessStatusCode)
{ {
// 当前时间减5秒然后取最新一条数据 var content = await response.Content.ReadAsStringAsync();
// 取得机场序列号 var weather = JsonConvert.DeserializeObject<JObject>(content);
var log = await Repository var winMeterStr =
.ChangeRepository<SugarRepositiry<LasaLog>>() weather.GetValue("win_meter")?.Value<string>(); //风速
.AsQueryable() if (!string.IsNullOrEmpty(winMeterStr))
.OrderByDescending(r => r.CreateTime)
.Where(r => r.Data.Contains("wind_speed"))
.Where(r => r.Topic == $"thing/product/{serialNo}/osd" &&
r.CreateTime > DateTime.Now.AddSeconds(-5))
.SingleAsync();
//不太可能为空
if (log != null)
{ {
var dataObject = JsonConvert.DeserializeObject<JObject>(log.Data); weatherWindSpeed = int.Parse(winMeterStr.Replace("km/h", "")) / 3.6;
var windSpeed = dataObject.GetValue("wind_speed")?.Value<float>(); // m/s
var rainfall =
dataObject.GetValue("rainfall")
?.Value<int>(); // {"0":"无雨","1":"小雨","2":"中雨","3":"大雨"}
if (windSpeedThreshold <= windSpeed || rainFallThreshold <= rainfall)
{
// 不让起飞
// 更新失败原因
var failTask = new LasaTask()
{
Id = taskId,
Status = 2,
Reason = "当前天气条件不允许起飞"
};
await Repository
.ChangeRepository<SugarRepositiry<LasaTask>>()
.AsUpdateable(failTask)
.IgnoreNullColumns()
.ExecuteCommandAsync();
throw new Exception("当前天气条件不允许起飞");
}
} }
// 查询所需天气数据
} }
}
}
//天气预报阻飞 // 取得当前风速及天气
if (workspace.IsWeatherBlockFlight) // 当前时间减5秒然后取最新一条数据
// 取得机场序列号
var log = await Repository
.ChangeRepository<SugarRepositiry<LasaLog>>()
.AsQueryable()
.OrderByDescending(r => r.CreateTime)
.Where(r => r.Data.Contains("wind_speed"))
.Where(r => r.Topic == $"thing/product/{serialNo}/osd" &&
r.CreateTime > DateTime.Now.AddSeconds(-5))
.FirstAsync();
//不太可能为空
if (log != null)
{
var dataObject = JsonConvert.DeserializeObject<JObject>(log.Data);
var windSpeed = dataObject.GetValue("wind_speed")?.Value<float>(); // m/s
var rainfall =
dataObject.GetValue("rainfall")
?.Value<int>(); // {"0":"无雨","1":"小雨","2":"中雨","3":"大雨"}
// 如果没有天气阻飞?
if (windSpeedThreshold <= windSpeed || rainThreshold <= rainfall || weatherWindSpeedThreshold <= weatherWindSpeed)
{
// 不让起飞
// 更新失败原因
var failTask = new LasaTask()
{ {
using (var httpClient = new HttpClient()) Id = taskId,
{ Status = 2,
// todo 目前地理位置是写死的兰山 Reason = "当前天气条件不允许起飞"
var response = await httpClient.GetAsync( };
"http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=84261622&appsecret=k0WPY4Cx&city=兰山"); await Repository
if (response.IsSuccessStatusCode) .ChangeRepository<SugarRepositiry<LasaTask>>()
{ .AsUpdateable(failTask)
var content = await response.Content.ReadAsStringAsync(); .IgnoreNullColumns()
var weather = JsonConvert.DeserializeObject<JObject>(content); .ExecuteCommandAsync();
var winMeterStr = throw new Exception("当前天气条件不允许起飞");
weather.GetValue("win_meter")?.Value<string>(); //风速
if (!string.IsNullOrEmpty(winMeterStr))
{
var winMeter = int.Parse(winMeterStr.Replace("km/h", "")) / 3.6;
if (weatherWindSpeedThreshold <= winMeter)
{
var failTask = new LasaTask()
{
Id = taskId,
Status = 2,
Reason = "当前天气条件不允许起飞"
};
await Repository
.ChangeRepository<SugarRepositiry<LasaTask>>()
.AsUpdateable(failTask)
.IgnoreNullColumns()
.ExecuteCommandAsync();
throw new Exception("当前天气条件不允许起飞");
}
}
}
}
}
} }
} }
} }

@ -275,118 +275,126 @@ public class ConfigSubscribe : IJob
string model = ""; string model = "";
if (objectKey.ToLower().EndsWith("jpeg")) if (objectKey.ToLower().EndsWith("jpeg"))
{ {
var fileUrl ="http://" + _minioService.endPoint + "/" + _minioService._bucketName + "/" + objectKey; var fileUrl = "http://" + _minioService.endPoint + "/" + _minioService._bucketName +
using (var httpClient = new HttpClient()) "/" + objectKey;
{ using (var httpClient = new HttpClient())
suoluokey = "minipic/" + data.file.name.ToString();
// 目前读取64KB
// 添加Range请求头
httpClient.DefaultRequestHeaders.Range =
new RangeHeaderValue(0, 65535);
try
{ {
var response = httpClient suoluokey = "minipic/" + data.file.name.ToString();
.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead).Result; // 目前读取64KB
if (response.StatusCode == HttpStatusCode.PartialContent) // 添加Range请求头
httpClient.DefaultRequestHeaders.Range =
new RangeHeaderValue(0, 65535);
try
{ {
//Focal Length 35: 24 mm var response = httpClient
//Exif Image Width: 4032 pixels : Exif SubIFD .GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead).Result;
//Exif Image Height: 3024 pixels : Exif SubIFD if (response.StatusCode == HttpStatusCode.PartialContent)
// 3.1 解析Content-Range头格式bytes start-end/total
var contentRange = response.Content.Headers.ContentRange;
if (contentRange != null)
{ {
picSize = contentRange.Length.Value; //Focal Length 35: 24 mm
Console.WriteLine( //Exif Image Width: 4032 pixels : Exif SubIFD
$"获取范围:{contentRange.From}-{contentRange.To}/{contentRange.Length}"); //Exif Image Height: 3024 pixels : Exif SubIFD
} // 3.1 解析Content-Range头格式bytes start-end/total
var contentRange = response.Content.Headers.ContentRange;
if (contentRange != null)
{
picSize = contentRange.Length.Value;
Console.WriteLine(
$"获取范围:{contentRange.From}-{contentRange.To}/{contentRange.Length}");
}
// 成功获取部分内容 // 成功获取部分内容
var y = response.Content.ReadAsByteArrayAsync().Result; var y = response.Content.ReadAsByteArrayAsync().Result;
MemoryStream ms = new MemoryStream(y); MemoryStream ms = new MemoryStream(y);
var directories = ImageMetadataReader.ReadMetadata(ms); var directories = ImageMetadataReader.ReadMetadata(ms);
foreach (var directory in directories) foreach (var directory in directories)
{
if (directory is ExifDirectoryBase)
{ {
if (directory.Name.Equals("Exif IFD0")) if (directory is ExifDirectoryBase)
{ {
foreach (var tag in directory.Tags) if (directory.Name.Equals("Exif IFD0"))
{ {
if (tag.Name.Equals("Model")) foreach (var tag in directory.Tags)
{ {
model = tag.Description; if (tag.Name.Equals("Model"))
{
model = tag.Description;
}
} }
} }
}
if (directory.Name.Equals("Exif SubIFD")) if (directory.Name.Equals("Exif SubIFD"))
{
foreach (var tag in directory.Tags)
{ {
if (tag.Name.Equals("Exif Image Width")) foreach (var tag in directory.Tags)
{ {
width = int.Parse(tag.Description.Replace("pixels", "") if (tag.Name.Equals("Exif Image Width"))
.Trim()); {
} width = int.Parse(tag.Description.Replace("pixels", "")
.Trim());
}
if (tag.Name.Equals("Exif Image Height")) if (tag.Name.Equals("Exif Image Height"))
{ {
height = int.Parse(tag.Description.Replace("pixels", "") height = int.Parse(tag.Description.Replace("pixels", "")
.Trim()); .Trim());
} }
if (tag.Name.Equals("Focal Length 35")) if (tag.Name.Equals("Focal Length 35"))
{ {
focalLength = int.Parse(tag.Description.Replace("mm", "") focalLength = int.Parse(tag.Description
.Trim()); .Replace("mm", "")
.Trim());
}
} }
} }
}
//Console.WriteLine(directory.Name); //Console.WriteLine(directory.Name);
if (directory.Name.Equals("Exif Thumbnail")) if (directory.Name.Equals("Exif Thumbnail"))
{
foreach (var tag in directory.Tags)
{ {
if (tag.Name.Equals("Thumbnail Offset")) foreach (var tag in directory.Tags)
{ {
offset = int.Parse(tag.Description.Replace("bytes", "") if (tag.Name.Equals("Thumbnail Offset"))
.Trim()); {
} offset = int.Parse(tag.Description.Replace("bytes", "")
.Trim());
}
if (tag.Name.Equals("Thumbnail Length")) if (tag.Name.Equals("Thumbnail Length"))
{ {
length = int.Parse(tag.Description.Replace("bytes", "") length = int.Parse(tag.Description.Replace("bytes", "")
.Trim()); .Trim());
}
} }
} }
} }
} }
}
ms.Seek(offset + 6, SeekOrigin.Begin); ms.Seek(offset + 6, SeekOrigin.Begin);
byte[] buffer = new byte[length]; byte[] buffer = new byte[length];
int bytesRead = ms.Read(buffer, 0, length); int bytesRead = ms.Read(buffer, 0, length);
// 上传缩略图到MinIO // 上传缩略图到MinIO
await _minioService.PutObjectAsync("", data.file.name.ToString(), suoluokey, await _minioService.PutObjectAsync("", data.file.name.ToString(), suoluokey,
new MemoryStream(buffer)); new MemoryStream(buffer));
} }
else if (response.StatusCode == HttpStatusCode.OK) else if (response.StatusCode == HttpStatusCode.OK)
{ {
// 服务器不支持Range请求返回完整内容 // 服务器不支持Range请求返回完整内容
throw new InvalidOperationException("服务器不支持Range请求"); throw new InvalidOperationException("服务器不支持Range请求");
}
else
{
throw new HttpRequestException($"请求失败: {response.StatusCode}");
}
} }
else catch (Exception ex)
{ {
throw new HttpRequestException($"请求失败: {response.StatusCode}"); throw new Exception($"下载Range数据失败: {ex.Message}", ex);
} }
} }
catch (Exception ex)
{
throw new Exception($"下载Range数据失败: {ex.Message}", ex);
}
}
} }
var createdTimeStr = (string)data.file.metadata.created_time;
var createTime = string.IsNullOrEmpty(createdTimeStr)
? DateTime.Now
: createdTimeStr.ToDateTime();
var fileUpload = new LasaMediaFile() var fileUpload = new LasaMediaFile()
{ {
Id = Guid.NewGuid().ToString(), Id = Guid.NewGuid().ToString(),
@ -404,7 +412,7 @@ public class ConfigSubscribe : IJob
Name = data.file.name, Name = data.file.name,
ObjectKey = data.file.object_key, ObjectKey = data.file.object_key,
Path = data.file.path, // 目前这个好像没有值 Path = data.file.path, // 目前这个好像没有值
CreateTime = ((string)data.file.metadata.created_time).ToDateTime(), CreateTime = createTime,
WorkspaceId = executeTask.WorkspaceId, WorkspaceId = executeTask.WorkspaceId,
ParentKey = folderKey[2], ParentKey = folderKey[2],
Tid = result.tid, Tid = result.tid,

Loading…
Cancel
Save