LASAPlatform/OpenAuth.WebApi/Model/mqtt/ThingRequestHandler.cs

225 lines
9.5 KiB
C#
Raw Permalink Normal View History

2025-06-17 13:53:54 +08:00
using Infrastructure.CloudSdk.mqttmessagecenter;
using OpenAuth.App.ServiceApp;
2025-06-18 15:44:13 +08:00
using OpenAuth.Repository.Domain;
2025-06-17 13:53:54 +08:00
using System.Text.Json;
using System.Text.Json.Nodes;
namespace OpenAuth.WebApi.Model.mqtt
{
public class ThingRequestHandler : IMqttMessageHandler
{
private readonly ILogger<ThingRequestHandler> _logger;
private readonly MqttClientManager _mqttClientManager;
AirportMaintenanceApp _app;
2025-06-18 15:44:13 +08:00
ManageApp _manageApp;
2025-07-03 16:43:21 +08:00
private readonly MqttMessageCenter _mqttCenter;
2025-06-17 13:53:54 +08:00
2025-07-03 16:43:21 +08:00
public ThingRequestHandler(ILogger<ThingRequestHandler> logger, MqttClientManager mqttClientManager, AirportMaintenanceApp app, ManageApp manageApp, MqttMessageCenter mqttCenter)
2025-06-17 13:53:54 +08:00
{
_logger = logger;
_mqttClientManager = mqttClientManager;
_app = app;
2025-06-18 15:44:13 +08:00
_manageApp = manageApp;
2025-07-03 16:43:21 +08:00
_mqttCenter = mqttCenter;
2025-06-17 13:53:54 +08:00
}
public bool CanHandle(string topic)
{
2025-06-18 15:44:36 +08:00
return topic.Contains("/requests");
2025-06-17 13:53:54 +08:00
}
string bid, tid, previousgateway;
2025-06-18 15:44:13 +08:00
long timestamp;
2025-06-17 13:53:54 +08:00
public async Task HandleAsync(string topic, string payload)
{
_logger.LogError($"[Request] Topic={topic}, Payload={payload}");
2025-10-09 10:35:27 +08:00
Console.WriteLine($"接收数据:{payload}");
2025-07-03 16:43:21 +08:00
if (payload.Contains("config"))
2025-06-17 13:53:54 +08:00
{
var root = JsonNode.Parse(payload)?.AsObject();
if (root == null)
{
return;
}
string gateway = root["gateway"]?.ToString() ?? "";
if (previousgateway == gateway)
{
return;
}
bid = root["bid"]?.ToString() ?? "";
tid = root["tid"]?.ToString() ?? "";
2025-06-18 15:44:13 +08:00
timestamp = long.Parse(root["timestamp"]?.ToString() ?? "0");
2025-06-17 13:53:54 +08:00
var requestData = new
{
bid = bid,
method = "config",
tid = tid,
2025-06-18 15:44:13 +08:00
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
2025-06-17 13:53:54 +08:00
gateway = gateway,
data = new
{
app_id = "164821",
app_key = "a5f80db847b285fd5fe51db7aa9f606",
app_license = "QXJX7VKLC03wYHujKbchjqIBiSgpjv46hLGY4B9Ez46RllbKZN9H+rVawveJWbbX/l4r6zPM5aZ/EzmCESUg046rSRziVhDOJ0tPw1cWqKAq6TuqaLK5bH88UFyB3ahv66YF3D/NmAgOfj5VRtT55cc67u/OIsF54lxhs/raAv0=",
ntp_server_host = "ntp.aliyun.com",
//ntp_server_host = "175.27.168.120",
//ntp_server_port = 6012
}
};
string payloadreq = JsonSerializer.Serialize(requestData);
2025-06-18 15:44:36 +08:00
await _mqttClientManager.PublishAsync($"thing/product/{gateway}/requests_reply", payloadreq);
2025-06-18 15:44:13 +08:00
await _app.UpdateGateway(gateway, tid);
2025-06-17 13:53:54 +08:00
}
if (payload.Contains("airport_bind_status"))
{
2025-06-23 15:13:54 +08:00
//解析返回的设备sn
2025-06-18 15:44:13 +08:00
var root = JsonNode.Parse(payload)?.AsObject();
if (root == null)
{
return;
}
// 从 data.devices 中提取 sn 列表
var snList = root?["data"]?["devices"]?.AsArray()
.Select(d => d?["sn"]?.ToString())
.Where(sn => !string.IsNullOrEmpty(sn))
.ToList();
// 生成 bind_status 对象列表
var bindStatusList = snList?.Select(sn => new
{
2025-07-08 11:08:29 +08:00
device_callsign = "sdhc",
2026-02-10 14:47:57 +08:00
is_device_bind_organization = true,
2025-06-23 17:19:25 +08:00
organization_id = "371300",
2025-07-08 11:08:29 +08:00
organization_name = "sdhc",
2025-06-18 15:44:13 +08:00
sn = sn
}).ToArray();
// 构造最终请求对象
2025-06-17 13:53:54 +08:00
var requestData = new
{
bid = Guid.NewGuid().ToString(),
data = new
{
output = new
{
2025-06-18 15:44:13 +08:00
bind_status = bindStatusList
2025-06-17 13:53:54 +08:00
},
result = 0
},
tid = Guid.NewGuid().ToString(),
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
method = "airport_bind_status"
};
string payloadreq = JsonSerializer.Serialize(requestData);
string getway = topic.Split('/')[2];
2025-06-18 15:44:36 +08:00
await _mqttClientManager.PublishAsync($"thing/product/{getway}/requests_reply", payloadreq);
2025-06-17 13:53:54 +08:00
}
2025-06-18 15:44:13 +08:00
if (payload.Contains("airport_organization_get"))//
{
var root = JsonNode.Parse(payload)?.AsObject();
2025-06-17 13:53:54 +08:00
var requestData = new
{
bid = Guid.NewGuid().ToString(),
data = new
{
output = new
{
2025-07-08 11:08:29 +08:00
organization_name = "sdhc"
2025-06-17 13:53:54 +08:00
},
result = 0
},
tid = Guid.NewGuid().ToString(),
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
method = "airport_organization_get"
};
string payloadreq = JsonSerializer.Serialize(requestData);
string getway = topic.Split('/')[2];
2025-06-18 15:44:36 +08:00
await _mqttClientManager.PublishAsync($"thing/product/{getway}/requests_reply", payloadreq);
2025-06-17 13:53:54 +08:00
}
if (payload.Contains("airport_organization_bind"))
{
2025-07-04 10:19:40 +08:00
string getway = topic.Split('/')[2];
2025-06-18 15:44:13 +08:00
// 解析 JSON
var root = JsonNode.Parse(payload)?.AsObject();
// 获取 bind_devices 数组
var bindDevices = root?["data"]?["bind_devices"]?.AsArray();
string dronesn = "", uavsn = "";
LasaDronePort lasaDronePort = new LasaDronePort();
LasaUav lasaUav = new LasaUav();
if (bindDevices != null)
{
foreach (var device in bindDevices)
{
var obj = device?.AsObject();
2025-10-09 10:35:27 +08:00
var modelKey = obj["device_model_key"]?.ToString()?.Trim();
var parts = modelKey.Split('-', StringSplitOptions.RemoveEmptyEntries);
string typeId = "Unknown";
if (parts.Length >= 3 && parts[0] == "3")
{
typeId = $"Dock {parts[1]}";
}
2025-10-11 16:59:04 +08:00
if (parts[0] == "3")
2025-06-18 15:44:13 +08:00
{
lasaDronePort.Id = Guid.NewGuid().ToString();
lasaDronePort.OrgId = obj["organization_id"]?.ToString();
lasaDronePort.CreateTime = DateTime.Now;
lasaDronePort.IsDelete = false;
2025-10-09 10:35:27 +08:00
lasaDronePort.TypeId = typeId;
2025-06-18 15:44:13 +08:00
lasaDronePort.Sn = obj["sn"].ToString();
lasaDronePort.BindStatus = 1;
2025-07-04 14:01:09 +08:00
lasaDronePort.Name = obj["device_callsign"]?.ToString();
2025-06-18 15:44:13 +08:00
dronesn = obj["sn"].ToString();
2025-07-04 10:19:40 +08:00
lasaDronePort.GateWay = getway;
2025-06-18 15:44:13 +08:00
}
else
{
lasaUav.Id = Guid.NewGuid().ToString();
lasaUav.IsDelete = false;
2025-11-26 10:23:18 +08:00
lasaUav.TypeId = obj["device_model_key"].ToString();
//lasaUav.TypeId = "M4TD";
2025-07-15 11:03:30 +08:00
lasaUav.CreateTime = DateTime.Now;
2025-06-18 15:44:13 +08:00
lasaUav.Sn = obj["sn"].ToString();
lasaUav.PId = lasaDronePort.Id;
2025-07-04 14:01:09 +08:00
lasaUav.Name = obj["device_callsign"]?.ToString();
2025-06-18 15:44:13 +08:00
uavsn = obj["sn"].ToString();
}
}
}
_manageApp.AddDronePort(lasaDronePort);
_manageApp.AddLasaUav(lasaUav);
2025-06-17 13:53:54 +08:00
var requestData = new
{
bid = Guid.NewGuid().ToString(),
data = new
{
output = new
{
err_infos = new[]
{
new
{
2025-06-24 17:10:12 +08:00
err_code = 0,
2025-06-18 15:44:13 +08:00
sn = dronesn
2025-06-17 13:53:54 +08:00
},
new
{
2025-06-24 17:10:12 +08:00
err_code = 0,
2025-06-18 15:44:13 +08:00
sn = uavsn
2025-06-17 13:53:54 +08:00
}
}
},
result = 0
},
tid = Guid.NewGuid().ToString(),
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
method = "airport_organization_bind"
};
string payloadreq = JsonSerializer.Serialize(requestData);
2025-06-18 15:44:36 +08:00
await _mqttClientManager.PublishAsync($"thing/product/{getway}/requests_reply", payloadreq);
2025-06-17 13:53:54 +08:00
}
}
}
}