Compare commits

...

2 Commits

Author SHA1 Message Date
yanghongwei b250b0a297 Merge branch 'master' of http://101.43.201.20:3000/yanghongwei/lg_backend 2024-09-01 18:11:20 +08:00
yanghongwei e076521db8 gps 设备接入,socket推送前端 2024-09-01 18:11:10 +08:00
11 changed files with 326 additions and 16 deletions

View File

@ -125,6 +125,13 @@
缓存清洁数据
</summary>
</member>
<member name="M:langguanApi.Common.Redis.RedisKeylist.GetBatchid(System.String)">
<summary>
redis缓存key
</summary>
<param name="key"></param>
<returns></returns>
</member>
<member name="P:langguanApi.Common.Redis.RedisOptions.Server">
<summary>
redis 服务地址
@ -183,6 +190,44 @@
<param name="Source">需要解密的字符串</param>
<returns>解密后的字符串</returns>
</member>
<member name="T:langguanApi.Common.WebSocket.PushService">
<summary>
客户端push消息
</summary>
</member>
<member name="M:langguanApi.Common.WebSocket.PushService.SendMessageToAll(System.Object)">
<summary>
全部消息
</summary>
<param name="message"></param>
<returns></returns>
</member>
<member name="T:langguanApi.Common.WebSocket.SocketHub">
<summary>
socket
</summary>
</member>
<member name="M:langguanApi.Common.WebSocket.SocketHub.OnConnectedAsync">
<summary>
// 客户端连接事件
</summary>
<returns></returns>
</member>
<member name="M:langguanApi.Common.WebSocket.SocketHub.SendMessageToClient(System.Object)">
<summary>
// 自定义方法,用于向客户端推送消息
</summary>
<param name="message"></param>
<returns></returns>
</member>
<member name="M:langguanApi.Common.WebSocket.SocketHub.SendMessageToUser(System.String,System.Object)">
<summary>
向指定用户发送
</summary>
<param name="user"></param>
<param name="message"></param>
<returns></returns>
</member>
<member name="M:langguanApi.Controllers.AlertController.export(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
<summary>
export data 默认最近7天数据
@ -1295,6 +1340,21 @@
deviceValue
</summary>
</member>
<member name="T:langguanApi.Model.Entity.GpsHistory">
<summary>
//GPS历史信息
</summary>
</member>
<member name="P:langguanApi.Model.Entity.GpsHistory.BatchId">
<summary>
批次ID
</summary>
</member>
<member name="T:langguanApi.Model.Entity.GpsHistoryDTO">
<summary>
GPSDTO
</summary>
</member>
<member name="T:langguanApi.Model.Entity.Ledger">
<summary>
台账
@ -2963,6 +3023,31 @@
</summary>
<returns></returns>
</member>
<member name="M:langguanApi.Service.GpsHistoryService.AddGpsHistory(langguanApi.Model.Entity.GpsHistoryDTO)">
<summary>
新加gps历史记录
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="F:langguanApi.Service.GpsService.result">
<summary>
缓冲器
</summary>
</member>
<member name="M:langguanApi.Service.GpsService.Start">
<summary>
启动GPS服务
</summary>
<returns></returns>
</member>
<member name="M:langguanApi.Service.GpsService.Send(System.String)">
<summary>
发送GPS数据
</summary>
<param name="message"></param>
<returns></returns>
</member>
<member name="M:langguanApi.Service.Hj212Service.GetIndexData(System.Int32)">
<summary>
首页数据

View File

@ -23,5 +23,14 @@
/// 缓存清洁数据
/// </summary>
public static string CleanData = "cleandata";
/// <summary>
/// redis缓存key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static string GetBatchid(string key)
{
return $"batchtid_{key}";
}
}
}

View File

@ -0,0 +1,31 @@
using langguanApi.Extensions.AutoDI;
using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
namespace langguanApi.Common.WebSocket
{
/// <summary>
/// 客户端push消息
/// </summary>
[ServiceInjection(InjectionType.Singleton)]
public class PushService
{
private readonly IHubContext<SocketHub> _hubContext;
/// <summary>
/// 全部消息
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public async Task SendMessageToAll(object message)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
Console.WriteLine($"gps:{JsonConvert.SerializeObject(message, settings)}");
var data = JsonConvert.SerializeObject(message, settings);
await _hubContext.Clients.All.SendAsync("ReceiveMessage", data);
}
}
}

View File

@ -0,0 +1,53 @@
using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using langguanApi.Extensions.AutoDI;
namespace langguanApi.Common.WebSocket
{
/// <summary>
/// socket
/// </summary>
[ServiceInjection(InjectionType.Singleton)]
public class SocketHub : Hub
{
/// <summary>
/// // 客户端连接事件
/// </summary>
/// <returns></returns>
public override async Task OnConnectedAsync()
{
var msg = JsonConvert.SerializeObject(new { msgType = "info", data = "hello" });
// 发送消息给连接的客户端
await Clients.Caller.SendAsync("ReceiveMessage", msg);
await base.OnConnectedAsync();
}
/// <summary>
/// // 自定义方法,用于向客户端推送消息
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public async Task SendMessageToClient(object message)
{
// 发送消息给所有客户端
var connId = this.Context.ConnectionId;
var msg = JsonConvert.SerializeObject(message);
await this.Clients.All.SendAsync("ReceiveMessage", msg);
}
/// <summary>
/// 向指定用户发送
/// </summary>
/// <param name="user"></param>
/// <param name="message"></param>
/// <returns></returns>
public async Task SendMessageToUser(string user, object message)
{
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var msg = JsonConvert.SerializeObject(message, settings);
await Clients.All.SendAsync("ReceiveMessage", user, msg);
}
}
}

View File

@ -12,12 +12,12 @@ namespace langguanApi.Extensions
{
// services.AddSingleton<MQTTService>();
services.AddTransient<HJ212SocketServer>();
services.AddSingleton<Gps808SocketServer>(); // 808协议
services.AddSingleton<GpsService>(); // gps协议
services.AddTransient<PingService>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
_ = serviceProvider.GetService<HJ212SocketServer>().Start();
_ = serviceProvider.GetService<Gps808SocketServer>().Start();
_ = serviceProvider.GetService<GpsService>().Start();
serviceProvider.GetService<PingService>().CreatTask();
}
}

View File

@ -0,0 +1,25 @@
namespace langguanApi.Model.Entity
{
/// <summary>
/// //GPS历史信息
/// </summary>
public class GpsHistory : BaseModel
{
public string DeviceId { get; set; }
public string Lat { get; set; }
public string Lon { get; set; }
/// <summary>
/// 批次ID
/// </summary>
public long BatchId { get; set; }
}
/// <summary>
/// GPSDTO
/// </summary>
public class GpsHistoryDTO
{
public string DeviceId { get; set; }
public string Lat { get; set; }
public string Lon { get; set; }
}
}

View File

@ -93,17 +93,17 @@ app.UseCors("CorsPolicy");
app.MapControllers();
app.Run();
if (!await GetNowTimeAsync())
{
Console.WriteLine("当前时间不在可运行时间范围内,请联系供应商。");
Environment.Exit(0);
}
/// <summary>
/// 获取当前时间是否在可运行时间范围内
app.Run();
//获取当前时间是否在可运行时间范围内
static async Task<bool> GetNowTimeAsync()
{
try
@ -111,14 +111,11 @@ static async Task<bool> GetNowTimeAsync()
DateTime startTime = DateTime.Parse("2024-09-01");
//从公网上获取当前时间
var url = "http://www.worldtimeapi.org/api/ip";
var request = WebRequest.Create(url);
var response = await request.GetResponseAsync();
var stream = response.GetResponseStream();
var reader = new StreamReader(stream);
var content = reader.ReadToEnd();
var time = JObject.Parse(content)["datetime"].ToString();
var myClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
var response = await myClient.GetStringAsync(url);
var time = JObject.Parse(response)["datetime"].ToString();
var now = DateTime.Parse(time);
Console.WriteLine($"当前时间:{now},过期时间:{startTime.AddDays(365)},距离过期时间还有:{(startTime.AddDays(30) - now).Days} 天");
Console.WriteLine($"当前时间:{now},过期时间:{startTime.AddDays(365)},距离过期时间还有:{(startTime.AddDays(365) - now).Days} 天");
return startTime.AddDays(365) > now ? true : false;
}
catch

View File

@ -0,0 +1,55 @@
using langguanApi.Common.Redis;
using langguanApi.Common.WebSocket;
using langguanApi.Extensions.AutoDI;
using langguanApi.Model.Entity;
using Mapster;
using StackExchange.Redis;
namespace langguanApi.Service
{
[ServiceInjection(InjectionType.Transient)]
public class GpsHistoryService : BaseService<GpsHistory>
{
private readonly PushService _pushService;
private IDatabase _redis;
private IConfiguration _config;
public GpsHistoryService(IConfiguration config, PushService pushService,
RedisHelper redisHelper) : base(config, nameof(Model.Entity.GpsHistory))
{
_pushService = pushService;
_redis = redisHelper._database;
_config = config;
}
/// <summary>
/// 新加gps历史记录
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task AddGpsHistory(GpsHistoryDTO input)
{
var entity = input.Adapt<GpsHistory>();
var redisKey = RedisKeylist.GetBatchid(entity.DeviceId);
///如果redis中不存在该设备的批次号则生成一个批次号
if (!await _redis.KeyExistsAsync(redisKey))
{
int time = _config.GetValue<int>("BatchId");
long utc = DateTime.UtcNow.Ticks;
await _redis.StringSetAsync(redisKey, utc, TimeSpan.FromMinutes(time));
}
else
{
//如果存在了就把批次号延期30分钟
await _redis.KeyExpireAsync(redisKey, TimeSpan.FromMinutes(30));
}
entity.BatchId = (long)await _redis.StringGetAsync(redisKey);
await base.CreateAsync(entity);
await _pushService.SendMessageToAll(new
{
entity.Lat,
entity.DeviceId,
entity.Lon,
entity.BatchId
});
}
}
}

View File

@ -0,0 +1,53 @@
using langguanApi.Model.Entity;
using MongoDB.Bson.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace langguanApi.Service
{
public class GpsService
{
private GpsHistoryService _service = ServiceLocator.Instance.GetService<GpsHistoryService>();
/// <summary>
/// 缓冲器
/// </summary>
private byte[] result = new byte[1024];
private int port => 5002;
/// <summary>
/// 启动GPS服务
/// </summary>
/// <returns></returns>
public async Task Start()
{
// 创建本地IP地址和TCP端口号
var ipEndPoint = new IPEndPoint(IPAddress.Any, port);
TcpListener listener = new(ipEndPoint);
try
{
listener.Start();
Console.WriteLine($"Waiting for gps connection... port:{port}");
using TcpClient handler = await listener.AcceptTcpClientAsync();
await using NetworkStream stream = handler.GetStream();
int received = await stream.ReadAsync(result);
var message = Encoding.UTF8.GetString(result, 0, received);
Console.WriteLine($"GPS received: \"{message}\"");
}
catch (Exception ex)
{
Console.WriteLine($"GPS error:{ex.Message}");
}
}
/// <summary>
/// 发送GPS数据
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public async Task Send(string message)
{
var json = Newtonsoft.Json.JsonConvert.DeserializeObject<GpsHistoryDTO>(message);
await _service.AddGpsHistory(json);
}
}
}

View File

@ -30,5 +30,6 @@
"lat": 39.4716613,
"lon": 107.1413332
}
}
},
"BatchId": 30 //30
}

View File

@ -19,6 +19,7 @@
<PackageReference Include="JT808" Version="2.6.8" />
<PackageReference Include="Mapster" Version="7.4.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.27" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Common" Version="6.0.33" />
<PackageReference Include="MongoDB.Bson" Version="2.27.0" />
<PackageReference Include="MongoDB.Driver" Version="2.27.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />