Compare commits
No commits in common. "b250b0a2972d3d912ea56ddf8d9d06c89918973d" and "337993c24322c142b365298d2b2782c8f5d91013" have entirely different histories.
b250b0a297
...
337993c243
|
|
@ -125,13 +125,6 @@
|
||||||
缓存清洁数据
|
缓存清洁数据
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</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">
|
<member name="P:langguanApi.Common.Redis.RedisOptions.Server">
|
||||||
<summary>
|
<summary>
|
||||||
redis 服务地址
|
redis 服务地址
|
||||||
|
|
@ -190,44 +183,6 @@
|
||||||
<param name="Source">需要解密的字符串</param>
|
<param name="Source">需要解密的字符串</param>
|
||||||
<returns>解密后的字符串</returns>
|
<returns>解密后的字符串</returns>
|
||||||
</member>
|
</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})">
|
<member name="M:langguanApi.Controllers.AlertController.export(System.Nullable{System.DateTime},System.Nullable{System.DateTime})">
|
||||||
<summary>
|
<summary>
|
||||||
export data 默认最近7天数据
|
export data 默认最近7天数据
|
||||||
|
|
@ -1340,21 +1295,6 @@
|
||||||
deviceValue
|
deviceValue
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</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">
|
<member name="T:langguanApi.Model.Entity.Ledger">
|
||||||
<summary>
|
<summary>
|
||||||
台账
|
台账
|
||||||
|
|
@ -3023,31 +2963,6 @@
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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)">
|
<member name="M:langguanApi.Service.Hj212Service.GetIndexData(System.Int32)">
|
||||||
<summary>
|
<summary>
|
||||||
首页数据
|
首页数据
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,5 @@
|
||||||
/// 缓存清洁数据
|
/// 缓存清洁数据
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string CleanData = "cleandata";
|
public static string CleanData = "cleandata";
|
||||||
/// <summary>
|
|
||||||
/// redis缓存key
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static string GetBatchid(string key)
|
|
||||||
{
|
|
||||||
return $"batchtid_{key}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -12,12 +12,12 @@ namespace langguanApi.Extensions
|
||||||
{
|
{
|
||||||
// services.AddSingleton<MQTTService>();
|
// services.AddSingleton<MQTTService>();
|
||||||
services.AddTransient<HJ212SocketServer>();
|
services.AddTransient<HJ212SocketServer>();
|
||||||
services.AddSingleton<GpsService>(); // gps协议
|
services.AddSingleton<Gps808SocketServer>(); // 808协议
|
||||||
services.AddTransient<PingService>();
|
services.AddTransient<PingService>();
|
||||||
|
|
||||||
IServiceProvider serviceProvider = services.BuildServiceProvider();
|
IServiceProvider serviceProvider = services.BuildServiceProvider();
|
||||||
_ = serviceProvider.GetService<HJ212SocketServer>().Start();
|
_ = serviceProvider.GetService<HJ212SocketServer>().Start();
|
||||||
_ = serviceProvider.GetService<GpsService>().Start();
|
_ = serviceProvider.GetService<Gps808SocketServer>().Start();
|
||||||
serviceProvider.GetService<PingService>().CreatTask();
|
serviceProvider.GetService<PingService>().CreatTask();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
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; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -93,17 +93,17 @@ app.UseCors("CorsPolicy");
|
||||||
|
|
||||||
|
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
|
app.Run();
|
||||||
|
|
||||||
|
|
||||||
if (!await GetNowTimeAsync())
|
if (!await GetNowTimeAsync())
|
||||||
{
|
{
|
||||||
Console.WriteLine("当前时间不在可运行时间范围内,请联系供应商。");
|
Console.WriteLine("当前时间不在可运行时间范围内,请联系供应商。");
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
app.Run();
|
/// <summary>
|
||||||
|
/// 获取当前时间是否在可运行时间范围内
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//获取当前时间是否在可运行时间范围内
|
|
||||||
static async Task<bool> GetNowTimeAsync()
|
static async Task<bool> GetNowTimeAsync()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
@ -111,11 +111,14 @@ static async Task<bool> GetNowTimeAsync()
|
||||||
DateTime startTime = DateTime.Parse("2024-09-01");
|
DateTime startTime = DateTime.Parse("2024-09-01");
|
||||||
//从公网上获取当前时间
|
//从公网上获取当前时间
|
||||||
var url = "http://www.worldtimeapi.org/api/ip";
|
var url = "http://www.worldtimeapi.org/api/ip";
|
||||||
var myClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
|
var request = WebRequest.Create(url);
|
||||||
var response = await myClient.GetStringAsync(url);
|
var response = await request.GetResponseAsync();
|
||||||
var time = JObject.Parse(response)["datetime"].ToString();
|
var stream = response.GetResponseStream();
|
||||||
|
var reader = new StreamReader(stream);
|
||||||
|
var content = reader.ReadToEnd();
|
||||||
|
var time = JObject.Parse(content)["datetime"].ToString();
|
||||||
var now = DateTime.Parse(time);
|
var now = DateTime.Parse(time);
|
||||||
Console.WriteLine($"当前时间:{now},过期时间:{startTime.AddDays(365)},距离过期时间还有:{(startTime.AddDays(365) - now).Days} 天");
|
Console.WriteLine($"当前时间:{now},过期时间:{startTime.AddDays(365)},距离过期时间还有:{(startTime.AddDays(30) - now).Days} 天");
|
||||||
return startTime.AddDays(365) > now ? true : false;
|
return startTime.AddDays(365) > now ? true : false;
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
|
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
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
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -30,6 +30,5 @@
|
||||||
"lat": 39.4716613,
|
"lat": 39.4716613,
|
||||||
"lon": 107.1413332
|
"lon": 107.1413332
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"BatchId": 30 //批次号间隔时间30分钟
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
<PackageReference Include="JT808" Version="2.6.8" />
|
<PackageReference Include="JT808" Version="2.6.8" />
|
||||||
<PackageReference Include="Mapster" Version="7.4.0" />
|
<PackageReference Include="Mapster" Version="7.4.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.27" />
|
<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.Bson" Version="2.27.0" />
|
||||||
<PackageReference Include="MongoDB.Driver" Version="2.27.0" />
|
<PackageReference Include="MongoDB.Driver" Version="2.27.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue