lg_backend/langguanApi/Controllers/HomeController.cs

171 lines
5.8 KiB
C#

using JT808.Protocol.MessageBody;
using JT808.Protocol;
using langguanApi.Model;
using langguanApi.Service;
using langguanApi.Service.HJ212;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Utilities;
using System.Text;
using JT808.Protocol.Extensions;
using static langguanApi.Service.WeatherService;
using langguanApi.Common.Gps;
using NPOI.SS.Formula.Functions;
using static langguanApi.Common.Gps.ProtocolParser;
namespace langguanApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
private readonly HomeService _homeService;
public HomeController(HomeService homeService)
{
_homeService = homeService;
}
/// <summary>
/// 首页view
/// </summary>
/// <returns></returns>
[HttpGet("view")]
public async Task<IActionResult> View()
{
return Ok(await _homeService.View());
}
[HttpGet("test")]
/// <summary>
/// test
/// </summary>
/// <param name="num">数字</param>
/// <param name="key">字符串</param>
/// <returns></returns>
public async Task<IActionResult> test(int num = 1, string key = "")
{
// 示例数据(需替换为实际接收到的协议数据)
string hexData = "787811010868120321167279808D3202001AB12F0D0A";
byte[] protocolData = HexStringToByteArray(hexData);
// 进行转义还原
byte[] restoredData = RestoreEscape(protocolData);
// 验证校验码
if (!VerifyChecksum(restoredData))
{
Console.WriteLine("Checksum verification failed.");
}
Position? position = ParsePosition(restoredData);
if (position.HasValue)
{
Console.WriteLine($"Latitude: {position.Value.Latitude}");
Console.WriteLine($"Longitude: {position.Value.Longitude}");
Console.WriteLine($"Altitude: {position.Value.Altitude}");
}
else
{
Console.WriteLine("Failed to parse position.");
}
// Console.WriteLine("经度:" + lon + " 纬度:" + lat);
// string rawText = "数据报:##0250QN=20240424224800000;ST=22;CN=2011;PW=123456;MN=LGYC022024690001;Flag=5;CP=&&DataTime=20240424224800;a34001-Rtd=356.2";
//NetPackage netPackage = NetPackage.Parse(rawText, null);
//((NetServer)Server).RaiseReceivedData(this, netPackage, rawText);
return Ok();
}
public static Position? ParsePosition(byte[] data)
{
// 根据协议中的位置信息的偏移量和长度进行解析
int positionOffset = 21; // 位置信息在数据中的偏移量
int latitudeOffset = positionOffset + 0;
int longitudeOffset = positionOffset + 4;
int altitudeOffset = positionOffset + 8;
// 检查数组长度是否足够长
if (data.Length < altitudeOffset + 2)
{
Console.WriteLine("Data array is not long enough to contain position information.");
return null;
}
// 解析纬度(单位:百万分之一度)
int rawLatitude = BitConverter.ToInt32(data, latitudeOffset);
double latitude = rawLatitude / 1000000.0;
// 解析经度(单位:百万分之一度)
int rawLongitude = BitConverter.ToInt32(data, longitudeOffset);
double longitude = rawLongitude / 1000000.0;
// 解析高度(单位:米)
int rawAltitude = BitConverter.ToInt16(data, altitudeOffset);
double altitude = rawAltitude;
return new Position
{
Latitude = latitude,
Longitude = longitude,
Altitude = altitude
};
}
private static bool VerifyChecksum(byte[] data)
{
// 校验码在数据包的倒数第二个字节
byte receivedChecksum = data[data.Length - 2];
byte calculatedChecksum = 0;
// 校验范围是从第一个字节到倒数第三个字节
for (int i = 0; i < data.Length - 2; i++)
{
calculatedChecksum ^= data[i];
}
return receivedChecksum == calculatedChecksum;
}
private static byte[] RestoreEscape(byte[] data)
{
List<byte> result = new List<byte>();
for (int i = 0; i < data.Length; i++)
{
if (data[i] == 0x7D)
{
if (i + 1 < data.Length)
{
if (data[i + 1] == 0x02)
{
result.Add(0x7E);
i++;
}
else if (data[i + 1] == 0x01)
{
result.Add(0x7D);
i++;
}
}
}
else
{
result.Add(data[i]);
}
}
return result.ToArray();
}
private static byte[] HexStringToByteArray(string hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
{
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
}
return bytes;
}
public struct Position
{
public double Latitude;
public double Longitude;
public double Altitude;
}
}
}