From 7cb0918326e19cdd230b020d14ee420f80ceca16 Mon Sep 17 00:00:00 2001
From: Hinse <756681202@qq.com>
Date: Wed, 13 Oct 2021 10:56:59 +0800
Subject: [PATCH] =?UTF-8?q?/api/open/getdevinfo=E6=8E=A5=E5=8F=A3=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E5=8E=BB=E9=87=8D=E5=A4=84=E7=90=86,=E8=BF=99?=
=?UTF-8?q?=E4=B8=AA=E4=B8=8D=E8=83=BD=E5=8E=BB=E6=8E=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Waste.Application/ThirdApiInfo/OpenService.cs | 225 +++++++++++-------
1 file changed, 137 insertions(+), 88 deletions(-)
diff --git a/Waste.Application/ThirdApiInfo/OpenService.cs b/Waste.Application/ThirdApiInfo/OpenService.cs
index f1f98c1..cac7ef9 100644
--- a/Waste.Application/ThirdApiInfo/OpenService.cs
+++ b/Waste.Application/ThirdApiInfo/OpenService.cs
@@ -55,106 +55,155 @@ namespace Waste.Application.ThirdApiInfo
///
public async Task GetDevInfoAsync(GetDevInfoRequestDto data)
{
+
//更新上报记录结果
- var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ECode);
- if (device == null)
+ Guid resultid = Guid.Empty;
+ //这里进行去重处理
+ if (!string.IsNullOrEmpty(data.ResultId) && Guid.TryParse(data.ResultId, out resultid))
{
- return new ResultInfo(ResultState.FAIL, "设备未找到");
- }
- if(device.Status == (int)DeviceStatus.Error)
- {
- return new ResultInfo(ResultState.FAIL, "设备已停止运行");
- }
- var returndata = new GetDevInfoResponseDto
- {
- ResultId = IDGen.NextID(),
- UserId = UserId,
- PostUrl = ApiUrl
- };
- var devicesecret = await dbClient.Queryable().FirstAsync(x => x.DeviceId == device.Id);
- if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret)
- || string.IsNullOrEmpty(devicesecret.SecretHash)
- || string.IsNullOrEmpty(devicesecret.DevId))
- {
- return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息");
- }
- //解析协议,IC卡数据@垃圾桶编号@厨余垃圾@7.91
- // 00000000003031 40 0F00010009 40 C6E4CBFBC0ACBBF8 40 31352E39
- // 00000000003031 40 000F000002 40 C6E4CBFBC0ACBBF8 40 35312E30 0D0A
- if (!string.IsNullOrEmpty(data.data) && data.data.Length > 52)
- {
- data.data = data.data.Replace(" ", "");
- //收到的为16进制,对数据进行解析,0-4预留,5-垃圾种类,6-垃圾桶大小,7-@,8-12垃圾桶编号,13@,14-21垃圾种类汉字,22@,23-结束重量, OD OA 回车换行
- data.data = data.data.Substring(0, data.data.Length - 4);
- var trashhex = data.data.Substring(16, 10); //垃圾桶编号
- var typehex = data.data.Substring(28, 16); //垃圾种类
- var sizehex = data.data.Substring(12, 2);//桶大小,30-小桶,31-大桶
- var weighthex = data.data.Substring(46, data.data.Length - 46);
- returndata.trash = HextToDec(trashhex).ToString(); //垃圾桶编号使用10进制
- var type = GetChsFromHex(typehex);
- var weight = GetChsFromHex(weighthex);
- returndata.type = TrashType(type);
- returndata.Weight = weight.ToDouble();
- //计算净重,毛重-皮重=净重,如果净重小于等于0则不上报保存
- returndata.Weight = (returndata.Weight - device.Tare.ToDouble()).ToDouble(2);
- if (returndata.Weight <= 0)
+ var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ECode);
+ if (device == null)
{
- _loggerService.AddLogger($"{data.ECode},{device.Name},重量小于等于0:{returndata.ToJson()}", 1);
- return new ResultInfo(ResultState.FAIL, "无效的重量");
+ return new ResultInfo(ResultState.FAIL, "设备未找到");
}
- //检查是否为15分钟内第一次上报
- //如果是巴城的设备则不使用这个限制
- if(device.Businessid != Guid.Parse("39FCB9DE-404E-68F5-384B-EE2462EAB87C"))
+ var devicesecret = await dbClient.Queryable().FirstAsync(x => x.DeviceId == device.Id);
+ if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret)
+ || string.IsNullOrEmpty(devicesecret.SecretHash)
+ || string.IsNullOrEmpty(devicesecret.DevId))
{
- var time15 = DateTime.Now.AddMinutes(-15);
- if (await dbClient.Queryable().AnyAsync(x => x.DeviceId == device.Id && x.LastTrash == returndata.trash && x.LastHeartTime > time15))
- {
- _loggerService.AddLogger($"{data.ECode},{device.Name},重复垃圾桶编号的数据:{returndata.ToJson()}", 1);
- return new ResultInfo(ResultState.FAIL, "15分钟内同一垃圾桶编号上报");
- }
+ return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息");
}
- returndata.IsSuccessed = true;
- //记录数据
- data.IMEI = data.IMEI.ToStr();
- data.ICCID = data.ICCID.ToStr();
- data.IMSI = data.IMSI.ToStr();
- await _capBus.PublishAsync("result.service.insert", new ResultS2SDto
+ int timestamp = _suZhouService.GetUTCTimestamp();
+ int noncestr = _suZhouService.GetNonce();
+ var result = await dbClient.Queryable().FirstAsync(x => x.Id == resultid);
+ if (result == null)
{
- BusinessId = device.Businessid,
- DeviceId = device.Id,
- gslq = data.GSLQ,
- iccid = data.ICCID,
- imei = data.IMEI,
- imsi = data.IMSI,
- LastHeartTime = device.LastHeartTime,
- latitude = data.Latitude,
- longtitude = data.Longitude,
- ResultId = returndata.ResultId,
- Tare = device.Tare,
- trash = returndata.trash,
- wastetype = type,
- weight = weight
- });
+ return new ResultInfo(ResultState.SUCCESS, "记录id未找到");
+ }
+ var returndata = new GetDevInfoResponseDto
+ {
+ DeviceId = devicesecret.DevId,
+ noncestr = noncestr,
+ timestamp = timestamp,
+ Secret = devicesecret.Secret,
+ SecretHash = devicesecret.SecretHash,
+ UserId = UserId,
+ PostUrl = ApiUrl,
+ ScanningTime = timestamp,
+ ResultId = resultid,
+ trash = result.Registration,
+ Weight = result.GrossWeight.ToDouble(),
+ status = 0,
+ IsSuccessed = true,
+ type = TrashType(result.WasteType)
+ };
+ string[] paramlist = new string[] {
+ returndata.Weight.ToString(),returndata.trash,returndata.type.ToString(),returndata.ScanningTime.ToString(),returndata.status.ToString()};
+ returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist);
+ return new ResultInfo(ResultState.SUCCESS, "success", returndata);
}
else
{
- _loggerService.AddLogger($"{data.ECode},{device.Name},协议格式不正确:{data.ToJson()}", 1);
- return new ResultInfo(ResultState.FAIL, "协议格式不正确");
- }
- int timestamp = _suZhouService.GetUTCTimestamp();
- int noncestr = _suZhouService.GetNonce();
- returndata.DeviceId = devicesecret.DevId;
- returndata.noncestr = noncestr;
- returndata.timestamp = timestamp;
- returndata.Secret = devicesecret.Secret;
- returndata.SecretHash = devicesecret.SecretHash;
- returndata.ScanningTime = timestamp;
- string[] paramlist = new string[] {
+ var device = await dbClient.Queryable().FirstAsync(x => x.Ecode == data.ECode);
+ if (device == null)
+ {
+ return new ResultInfo(ResultState.FAIL, "设备未找到");
+ }
+ if (device.Status == (int)DeviceStatus.Error)
+ {
+ return new ResultInfo(ResultState.FAIL, "设备已停止运行");
+ }
+ var returndata = new GetDevInfoResponseDto
+ {
+ ResultId = IDGen.NextID(),
+ UserId = UserId,
+ PostUrl = ApiUrl
+ };
+ var devicesecret = await dbClient.Queryable().FirstAsync(x => x.DeviceId == device.Id);
+ if (devicesecret == null || string.IsNullOrEmpty(devicesecret.Secret)
+ || string.IsNullOrEmpty(devicesecret.SecretHash)
+ || string.IsNullOrEmpty(devicesecret.DevId))
+ {
+ return new ResultInfo(ResultState.FAIL, "设备还未获取验证信息");
+ }
+ //解析协议,IC卡数据@垃圾桶编号@厨余垃圾@7.91
+ // 00000000003031 40 0F00010009 40 C6E4CBFBC0ACBBF8 40 31352E39
+ // 00000000003031 40 000F000002 40 C6E4CBFBC0ACBBF8 40 35312E30 0D0A
+ if (!string.IsNullOrEmpty(data.data) && data.data.Length > 52)
+ {
+ data.data = data.data.Replace(" ", "");
+ //收到的为16进制,对数据进行解析,0-4预留,5-垃圾种类,6-垃圾桶大小,7-@,8-12垃圾桶编号,13@,14-21垃圾种类汉字,22@,23-结束重量, OD OA 回车换行
+ data.data = data.data.Substring(0, data.data.Length - 4);
+ var trashhex = data.data.Substring(16, 10); //垃圾桶编号
+ var typehex = data.data.Substring(28, 16); //垃圾种类
+ var sizehex = data.data.Substring(12, 2);//桶大小,30-小桶,31-大桶
+ var weighthex = data.data.Substring(46, data.data.Length - 46);
+ returndata.trash = HextToDec(trashhex).ToString(); //垃圾桶编号使用10进制
+ var type = GetChsFromHex(typehex);
+ var weight = GetChsFromHex(weighthex);
+ returndata.type = TrashType(type);
+ returndata.Weight = weight.ToDouble();
+ //计算净重,毛重-皮重=净重,如果净重小于等于0则不上报保存
+ returndata.Weight = (returndata.Weight - device.Tare.ToDouble()).ToDouble(2);
+ if (returndata.Weight <= 0)
+ {
+ _loggerService.AddLogger($"{data.ECode},{device.Name},重量小于等于0:{returndata.ToJson()}", 1);
+ return new ResultInfo(ResultState.FAIL, "无效的重量");
+ }
+ //检查是否为15分钟内第一次上报
+ //如果是巴城的设备则不使用这个限制
+ if (device.Businessid != Guid.Parse("39FCB9DE-404E-68F5-384B-EE2462EAB87C"))
+ {
+ var time15 = DateTime.Now.AddMinutes(-15);
+ if (await dbClient.Queryable().AnyAsync(x => x.DeviceId == device.Id && x.LastTrash == returndata.trash && x.LastHeartTime > time15))
+ {
+ _loggerService.AddLogger($"{data.ECode},{device.Name},重复垃圾桶编号的数据:{returndata.ToJson()}", 1);
+ return new ResultInfo(ResultState.FAIL, "15分钟内同一垃圾桶编号上报");
+ }
+ }
+ returndata.IsSuccessed = true;
+ //记录数据
+ data.IMEI = data.IMEI.ToStr();
+ data.ICCID = data.ICCID.ToStr();
+ data.IMSI = data.IMSI.ToStr();
+ await _capBus.PublishAsync("result.service.insert", new ResultS2SDto
+ {
+ BusinessId = device.Businessid,
+ DeviceId = device.Id,
+ gslq = data.GSLQ,
+ iccid = data.ICCID,
+ imei = data.IMEI,
+ imsi = data.IMSI,
+ LastHeartTime = device.LastHeartTime,
+ latitude = data.Latitude,
+ longtitude = data.Longitude,
+ ResultId = returndata.ResultId,
+ Tare = device.Tare,
+ trash = returndata.trash,
+ wastetype = type,
+ weight = weight
+ });
+ }
+ else
+ {
+ _loggerService.AddLogger($"{data.ECode},{device.Name},协议格式不正确:{data.ToJson()}", 1);
+ return new ResultInfo(ResultState.FAIL, "协议格式不正确");
+ }
+ int timestamp = _suZhouService.GetUTCTimestamp();
+ int noncestr = _suZhouService.GetNonce();
+ returndata.DeviceId = devicesecret.DevId;
+ returndata.noncestr = noncestr;
+ returndata.timestamp = timestamp;
+ returndata.Secret = devicesecret.Secret;
+ returndata.SecretHash = devicesecret.SecretHash;
+ returndata.ScanningTime = timestamp;
+ string[] paramlist = new string[] {
returndata.Weight.ToString(),returndata.trash,returndata.type.ToString(),returndata.ScanningTime.ToString(),returndata.status.ToString()
};
- returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist);
- _loggerService.AddLogger($"{data.ECode},{device.Name},发送的数据:{returndata.ToJson()}", 1);
- return new ResultInfo(ResultState.SUCCESS, "success", returndata);
+ returndata.sign = _suZhouService.GetUserApiSign(returndata.Secret, paramlist);
+ _loggerService.AddLogger($"{data.ECode},{device.Name},发送的数据:{returndata.ToJson()}", 1);
+ return new ResultInfo(ResultState.SUCCESS, "success", returndata);
+ }
}
///
/// 16进制转汉字