增加新的wifi上报接口

This commit is contained in:
Hinse 2022-03-28 17:19:48 +08:00
parent 4e9bf32859
commit 50a66a813d
10 changed files with 459 additions and 11 deletions

View File

@ -8,7 +8,7 @@ using Waste.Domain;
namespace Waste.Application namespace Waste.Application
{ {
public class ResultList : W_Result public class ResultList : W_Result
{ {
/// <summary> /// <summary>
/// 商户名称 /// 商户名称
/// </summary> /// </summary>
@ -191,4 +191,34 @@ namespace Waste.Application
/// </summary> /// </summary>
public bool IsWeight { get; set; } = false; public bool IsWeight { get; set; } = false;
} }
/// <summary>
/// wifi模块上传的数据包体
/// </summary>
public class WifiPackage
{
/// <summary>
/// 设备机器码
/// </summary>
public string sn { get; set; }
/// <summary>
/// 桶大小
/// </summary>
public string size { get; set; } = "";
/// <summary>
/// 垃圾桶编号
/// </summary>
public string trashcode { get; set; } = "";
/// <summary>
/// 垃圾类别
/// </summary>
public string WasteType { get; set; } = "";
/// <summary>
/// 重量,KG
/// </summary>
public string Weight { get; set; } = "0";
/// <summary>
/// 是否为心跳包
/// </summary>
public bool IsHeart { get; set; } = false;
}
} }

View File

@ -30,5 +30,11 @@ namespace Waste.Application
/// <param name="myPackage"></param> /// <param name="myPackage"></param>
/// <returns></returns> /// <returns></returns>
Task InsertResultBy4GAsync(nMyPackage myPackage); Task InsertResultBy4GAsync(nMyPackage myPackage);
/// <summary>
/// wifi模块测量结果增加
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
Task InsertResultByWifiAsync(WifiPackage data);
} }
} }

View File

@ -93,7 +93,7 @@ namespace Waste.Application
NetWeight = x.NetWeight, NetWeight = x.NetWeight,
Registration = x.Registration, Registration = x.Registration,
CreateTime = x.CreateTime, CreateTime = x.CreateTime,
PostStatus= -1 PostStatus = -1
}) })
.Mapper((it, cache) => .Mapper((it, cache) =>
{ {
@ -116,13 +116,13 @@ namespace Waste.Application
it.DeviceEcode = dev.Ecode; it.DeviceEcode = dev.Ecode;
it.DeviceAddress = dev.Address; it.DeviceAddress = dev.Address;
} }
var allres = cache.Get(list => var allres = cache.Get(list =>
{ {
var ids = list.Select(e => e.Id).ToList(); var ids = list.Select(e => e.Id).ToList();
return dbClient.Queryable<W_ResultExt>().Where(e => ids.Contains(e.ResultId)).ToList(); return dbClient.Queryable<W_ResultExt>().Where(e => ids.Contains(e.ResultId)).ToList();
}); });
var res = allres.FirstOrDefault(e => e.ResultId == it.Id); var res = allres.FirstOrDefault(e => e.ResultId == it.Id);
if(res != null) if (res != null)
{ {
it.PostStatus = res.Status; it.PostStatus = res.Status;
} }
@ -136,6 +136,53 @@ namespace Waste.Application
limit = param.limit limit = param.limit
}; };
} }
/// <summary>
/// wifi模块测量结果增加
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task InsertResultByWifiAsync(WifiPackage data)
{
//查找设备
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => data.sn == x.Ecode);
// _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3);
if (device == null)
{
//记录日志
_loggerService.AddLogger($"设备未找到,参数:{data.ToJson()}", 3);
}
var devicedata = await dbClient.Queryable<W_DeviceData>().FirstAsync(x => x.DeviceId == device.Id);
var resultid = IDGen.NextID();
DateTime time = DateTime.Now;
//检查设备是否为今天第一次上报
bool isfrist = false;
if (device.LastHeartTime.HasValue && device.LastHeartTime.Value.Date != DateTime.Now.Date)
{
isfrist = true;
}
//记录数据
await dbClient.Ado.UseStoredProcedure().ExecuteCommandAsync("Proc_InsertResult", new
{
deviceid = device.Id,
businessid = device.Businessid,
resultid = resultid,
imei = devicedata.IMSI,
iccid = devicedata.ICCID,
imsi = devicedata.IMSI,
time = time,
latitude = "",
longitude = "",
sign = "",
city = "",
area = data.trashcode,
wastetype = data.WasteType,
weigth = data.Weight,
isheart = data.IsHeart,
tare = device.Tare,
isfrist = isfrist
});
}
/// <summary> /// <summary>
/// 新的4G模块测量结果增加 /// 新的4G模块测量结果增加
@ -207,7 +254,7 @@ namespace Waste.Application
{ {
//查找设备 //查找设备
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => myPackage.IMEI == x.Ecode); var device = await dbClient.Queryable<W_Device>().FirstAsync(x => myPackage.IMEI == x.Ecode);
// _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3); // _loggerService.AddLogger($"接收到的数据,参数:{myPackage.ToJson()}", 3);
if (device == null) if (device == null)
{ {
//记录日志 //记录日志
@ -255,7 +302,7 @@ namespace Waste.Application
myPackage.Area = Convert.ToInt32(typeHex, 16).ToString(); myPackage.Area = Convert.ToInt32(typeHex, 16).ToString();
} }
//000F000002.16进制 //000F000002.16进制
// var areaHex = Convert.ToHexString(areaBytes); // var areaHex = Convert.ToHexString(areaBytes);
} }
//记录数据 //记录数据

View File

@ -207,4 +207,52 @@ namespace Waste.Application.ThirdApiInfo
/// </summary> /// </summary>
public string ExceptionInfo { get; set; } public string ExceptionInfo { get; set; }
} }
/// <summary>
/// wifi模块发送的数据
/// </summary>
public class WifiRequestC2SDto
{
/// <summary>
/// 参数,包含sn和测量数据
/// </summary>
public string @params { get; set; }
}
/// <summary>
/// wifi模块发送的数据解析
/// </summary>
public class WifiRequestS2SDto
{
/// <summary>
/// 设备机器码
/// </summary>
public string sn { get; set; }
/// <summary>
/// 包头,固定为A9
/// </summary>
public string Header { get; set; } = "";
/// <summary>
/// 分隔符,固定为00
/// </summary>
public string splitstr { get; set; } = "";
/// <summary>
/// 解密出的16进制数据
/// </summary>
public string data { get; set; } = "";
/// <summary>
/// 数据是否验证通过
/// </summary>
public bool ischecked { get; set; } = true;
/// <summary>
/// 是否为心跳包
/// </summary>
public bool IsHeart { get; set; } = false;
/// <summary>
/// 结果集
/// </summary>
public byte[] databyte { get; set; }
}
} }

View File

@ -44,5 +44,11 @@ namespace Waste.Application.ThirdApiInfo
/// <param name="data"></param> /// <param name="data"></param>
/// <returns></returns> /// <returns></returns>
Task UpdateVersionAsync(DeviceVerS2SDto data); Task UpdateVersionAsync(DeviceVerS2SDto data);
/// <summary>
/// 通过ailink wifi模式发送的数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
Task<object> WifiPostAsync(WifiRequestC2SDto data);
} }
} }

View File

@ -299,5 +299,15 @@ namespace Waste.Application.ThirdApiInfo
} }
}; };
} }
/// <summary>
/// 通过ailink wifi模式发送的数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task<object> WifiAsync(WifiRequestC2SDto data)
{
return await _openService.WifiPostAsync(data);
}
} }
} }

View File

@ -2,6 +2,7 @@
using Furion; using Furion;
using Furion.DependencyInjection; using Furion.DependencyInjection;
using Furion.DistributedIDGenerator; using Furion.DistributedIDGenerator;
using Microsoft.Extensions.Caching.Distributed;
using Nirvana.Common; using Nirvana.Common;
using SqlSugar; using SqlSugar;
using System; using System;
@ -30,13 +31,18 @@ namespace Waste.Application.ThirdApiInfo
private readonly ISuZhouService _suZhouService; private readonly ISuZhouService _suZhouService;
private readonly ILoggerService _loggerService; private readonly ILoggerService _loggerService;
private readonly ICapPublisher _capBus; private readonly ICapPublisher _capBus;
public OpenService(ISqlSugarRepository<W_Device> sqlSugarRepository, ISuZhouService suZhouService, ILoggerService loggerService, ICapPublisher capPublisher) private readonly IDistributedCache _cahce;
private readonly IResultService _resultService;
public OpenService(ISqlSugarRepository<W_Device> sqlSugarRepository, ISuZhouService suZhouService, ILoggerService loggerService, ICapPublisher capPublisher, IDistributedCache distributedCache, IResultService resultService)
{ {
repository = sqlSugarRepository; repository = sqlSugarRepository;
dbClient = repository.Context; dbClient = repository.Context;
_suZhouService = suZhouService; _suZhouService = suZhouService;
_loggerService = loggerService; _loggerService = loggerService;
_capBus = capPublisher; _capBus = capPublisher;
_cahce = distributedCache;
_resultService = resultService;
} }
/// <summary> /// <summary>
/// 更新上报状态 /// 更新上报状态
@ -376,5 +382,159 @@ namespace Waste.Application.ThirdApiInfo
{ {
await _capBus.PublishAsync("device.service.updatever", data); await _capBus.PublishAsync("device.service.updatever", data);
} }
/// <summary>
/// 通过ailink wifi模式发送的数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public async Task<object> WifiPostAsync(WifiRequestC2SDto data)
{
//记录发送过来的数据
_loggerService.AddLogger($"wifi发送原始数据,data={data.ToJson()}", 3);
var successdata = Encoding.UTF8.GetBytes("A901019A");
var returndata = new
{
status = "1",
data = Convert.ToBase64String(successdata)
};
//数据解析
var result = AnalyProto(data);
if (!result.ischecked)
{
return returndata;
}
if (result.databyte.Length == 0)
{
return returndata;
}
//小于14则表示结束
if (result.databyte.Length < 14)
{
var databytes = await _cahce.GetAsync(result.sn);
if (databytes != null && databytes.Length > 0)
{
byte[] newval = new byte[databytes.Length + result.databyte.Length];
databytes.CopyTo(newval, 0);
result.databyte.CopyTo(newval, databytes.Length);
var datastr = Encoding.GetEncoding("gb2312").GetString(newval);
datastr.Replace(@"\r\n", "");
var arr = datastr.Split('@');
string wastetype = arr[2];//垃圾类型
string weight = arr[3];//重量,kg
string trashno = string.Empty; //垃圾桶编号
string size = string.Empty;//桶大小
var sizebytes = Encoding.Default.GetBytes(arr[0]);
size = Convert.ToHexString(sizebytes);
var trashbytes = Encoding.Default.GetBytes(arr[1]);
//长度为5个字节,后三位为垃圾桶编号(16进制)
if (trashbytes.Length == 5)
{
var typeBytes = new byte[3];
for (var i = 0; i < 3; i++)
{
typeBytes[i] = trashbytes[i + 2];
}
var typeHex = Convert.ToHexString(typeBytes);
trashno = Convert.ToInt32(typeHex, 16).ToString();
}
await _resultService.InsertResultByWifiAsync(new WifiPackage
{
sn = result.sn,
WasteType = wastetype,
Weight = weight,
trashcode = trashno,
size = size,
IsHeart = result.IsHeart
});
}
}
else
{
var val = await _cahce.GetAsync(result.sn);
var time = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(60));
if (val != null && val.Length > 0)
{
byte[] newval = new byte[val.Length + result.databyte.Length];
val.CopyTo(newval, 0);
result.databyte.CopyTo(newval, val.Length);
await _cahce.SetAsync(result.sn, newval, time);
}
else
{
await _cahce.SetAsync(result.sn, result.databyte, time);
}
}
return returndata;
}
/// <summary>
/// wifi数据解析
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private WifiRequestS2SDto AnalyProto(WifiRequestC2SDto data)
{
WifiRequestS2SDto dto = new WifiRequestS2SDto();
//检查是否为有效的base64数据
if (!AESEncrypt.IsBase64(data.@params))
{
dto.data = data.@params;
return dto;
}
//数据为base64加密
byte[] resultByte = Convert.FromBase64String(data.@params);
dto.data = BytesToHexStr(resultByte);
//574D07884A1882FCC2FE346BA1D80E 00 A903000D0A1A9A
_loggerService.AddLogger($"wifi结果推送,解析出的数据:{dto.data}", 3);
int len = resultByte.Count();//数据总长度
//长度格式是否正确,固定长度为36位
if (len < 23)
{
return dto;
}
//前15个字节为sn。中间以 00 分隔。后面为测量结果数据 A9 03 00 0D 0A 1A 9A
int i = 0;
byte[] snbyte = new byte[15];
for (i = 0; i < 15; i++)
{
snbyte[i] = resultByte[i];
}
dto.sn = BytesToHexStr(snbyte).Replace(" ", "");
dto.splitstr = ByteToHexStr(resultByte[i]);
i++;
dto.Header = ByteToHexStr(resultByte[i]);//固定为A9
if (dto.Header != "A9") //固定为A9
{
return dto;
}
string heartstr = ByteToHexStr(resultByte[i + 2]);//是否为测量数据
if (heartstr != "00")
{
dto.IsHeart = true;
}
dto.ischecked = true;
string datalenstr = ByteToHexStr(resultByte[i + 1]); //数据体长度
int datalen = HextToDec(datalenstr).ToInt();
i += 3;
dto.databyte = new byte[datalen - 1];
for (int j = 0; j < datalen; j++)
{
if (i < len - 2)
{
dto.databyte[j] = resultByte[i];
}
i++;
}
return dto;
}
///<summary>
/// 字节转16进制
/// </summary>
/// <param name="bt"></param>
/// <returns></returns>
private string ByteToHexStr(byte bt)
{
return ((int)bt).ToString("X2");
}
} }
} }

View File

@ -1752,6 +1752,36 @@
是否为有效测量 是否为有效测量
</summary> </summary>
</member> </member>
<member name="T:Waste.Application.WifiPackage">
<summary>
wifi模块上传的数据包体
</summary>
</member>
<member name="P:Waste.Application.WifiPackage.sn">
<summary>
设备机器码
</summary>
</member>
<member name="P:Waste.Application.WifiPackage.size">
<summary>
桶大小
</summary>
</member>
<member name="P:Waste.Application.WifiPackage.trashcode">
<summary>
垃圾桶编号
</summary>
</member>
<member name="P:Waste.Application.WifiPackage.WasteType">
<summary>
垃圾类别
</summary>
</member>
<member name="P:Waste.Application.WifiPackage.Weight">
<summary>
重量,KG
</summary>
</member>
<member name="T:Waste.Application.IResultService"> <member name="T:Waste.Application.IResultService">
<summary> <summary>
投放记录 投放记录
@ -1778,6 +1808,13 @@
<param name="myPackage"></param> <param name="myPackage"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Waste.Application.IResultService.InsertResultByWifiAsync(Waste.Application.WifiPackage)">
<summary>
wifi模块测量结果增加
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="T:Waste.Application.ResultInfos.ResultAppService"> <member name="T:Waste.Application.ResultInfos.ResultAppService">
<summary> <summary>
投放记录 投放记录
@ -1809,6 +1846,13 @@
<param name="param"></param> <param name="param"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Waste.Application.ResultService.InsertResultByWifiAsync(Waste.Application.WifiPackage)">
<summary>
wifi模块测量结果增加
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="M:Waste.Application.ResultService.InsertResultBy4GAsync(Waste.Application.nMyPackage)"> <member name="M:Waste.Application.ResultService.InsertResultBy4GAsync(Waste.Application.nMyPackage)">
<summary> <summary>
新的4G模块测量结果增加 新的4G模块测量结果增加
@ -2577,6 +2621,56 @@
错误信息 错误信息
</summary> </summary>
</member> </member>
<member name="T:Waste.Application.ThirdApiInfo.WifiRequestC2SDto">
<summary>
wifi模块发送的数据
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestC2SDto.params">
<summary>
参数,包含sn和测量数据
</summary>
</member>
<member name="T:Waste.Application.ThirdApiInfo.WifiRequestS2SDto">
<summary>
wifi模块发送的数据解析
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.sn">
<summary>
设备机器码
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.Header">
<summary>
包头,固定为A9
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.splitstr">
<summary>
分隔符,固定为00
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.data">
<summary>
解密出的16进制数据
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.ischecked">
<summary>
数据是否验证通过
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.IsHeart">
<summary>
是否为心跳包
</summary>
</member>
<member name="P:Waste.Application.ThirdApiInfo.WifiRequestS2SDto.databyte">
<summary>
结果集
</summary>
</member>
<member name="T:Waste.Application.ThirdApiInfo.IOpenService"> <member name="T:Waste.Application.ThirdApiInfo.IOpenService">
<summary> <summary>
设备对接接口 设备对接接口
@ -2617,6 +2711,13 @@
<param name="data"></param> <param name="data"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Waste.Application.ThirdApiInfo.IOpenService.WifiPostAsync(Waste.Application.ThirdApiInfo.WifiRequestC2SDto)">
<summary>
通过ailink wifi模式发送的数据
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="T:Waste.Application.ThirdApiInfo.OpenAppService"> <member name="T:Waste.Application.ThirdApiInfo.OpenAppService">
<summary> <summary>
开放数据 开放数据
@ -2678,6 +2779,13 @@
<param name="ecode"></param> <param name="ecode"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Waste.Application.ThirdApiInfo.OpenAppService.WifiAsync(Waste.Application.ThirdApiInfo.WifiRequestC2SDto)">
<summary>
通过ailink wifi模式发送的数据
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="T:Waste.Application.ThirdApiInfo.OpenService"> <member name="T:Waste.Application.ThirdApiInfo.OpenService">
<summary> <summary>
设备对接接口 设备对接接口
@ -2739,6 +2847,27 @@
<param name="data"></param> <param name="data"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Waste.Application.ThirdApiInfo.OpenService.WifiPostAsync(Waste.Application.ThirdApiInfo.WifiRequestC2SDto)">
<summary>
通过ailink wifi模式发送的数据
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="M:Waste.Application.ThirdApiInfo.OpenService.AnalyProto(Waste.Application.ThirdApiInfo.WifiRequestC2SDto)">
<summary>
wifi数据解析
</summary>
<param name="data"></param>
<returns></returns>
</member>
<member name="M:Waste.Application.ThirdApiInfo.OpenService.ByteToHexStr(System.Byte)">
<summary>
字节转16进制
</summary>
<param name="bt"></param>
<returns></returns>
</member>
<member name="M:Waste.Application.IWasteService.GetTypeListAsync(Nirvana.Common.QueryParams)"> <member name="M:Waste.Application.IWasteService.GetTypeListAsync(Nirvana.Common.QueryParams)">
<summary> <summary>
垃圾分类列表 垃圾分类列表

View File

@ -23,6 +23,7 @@
<PackageReference Include="Furion.Extras.DatabaseAccessor.SqlSugar" Version="2.20.6" /> <PackageReference Include="Furion.Extras.DatabaseAccessor.SqlSugar" Version="2.20.6" />
<PackageReference Include="Furion.Extras.Logging.Serilog" Version="2.20.6" /> <PackageReference Include="Furion.Extras.Logging.Serilog" Version="2.20.6" />
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="2.20.6" /> <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="2.20.6" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -13,6 +13,7 @@ using Serilog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Waste.Core; using Waste.Core;
@ -70,12 +71,22 @@ namespace Waste.Web.Core
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
MyHttpContext.serviceCollection = services; MyHttpContext.serviceCollection = services;
#endregion #endregion
//添加redis缓存
services.AddStackExchangeRedisCache(options =>
{
// 连接字符串,这里也可以读取配置文件
options.Configuration = "localhost";
// 键名前缀
options.InstanceName = "jt_";
});
//添加即时通讯 //添加即时通讯
// services.AddSignalR(); // services.AddSignalR();
} }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ {
//启用 GB2312按需
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
app.UseSession(); app.UseSession();
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {