185 lines
7.4 KiB
C#
185 lines
7.4 KiB
C#
using Furion;
|
||
using Furion.DependencyInjection;
|
||
using Furion.DistributedIDGenerator;
|
||
using Nirvana.Common;
|
||
using SqlSugar;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using Waste.Domain;
|
||
|
||
namespace Waste.Application.ThirdApiInfo
|
||
{
|
||
/// <summary>
|
||
/// 设备对接接口
|
||
/// </summary>
|
||
public class OpenService : IOpenService, ITransient
|
||
{
|
||
private static string ApiUrl = App.Configuration["SZDevPlatSetting:ApiUrl"];
|
||
private static string UserId = App.Configuration["SZDevPlatSetting:UserId"];
|
||
private static string ApiSecret = App.Configuration["SZDevPlatSetting:ApiSecret"];
|
||
private static string ApiSecretHash = App.Configuration["SZDevPlatSetting:ApiSecretHash"];
|
||
private readonly ISqlSugarRepository<W_Device> repository;
|
||
private readonly SqlSugarClient dbClient;
|
||
private readonly ISuZhouService _suZhouService;
|
||
public OpenService(ISqlSugarRepository<W_Device> sqlSugarRepository, ISuZhouService suZhouService)
|
||
{
|
||
repository = sqlSugarRepository;
|
||
dbClient = repository.Context;
|
||
_suZhouService = suZhouService;
|
||
}
|
||
/// <summary>
|
||
/// 获取设备上报相关信息
|
||
/// </summary>
|
||
/// <param name="data"></param>
|
||
/// <returns></returns>
|
||
public async Task<ResultInfo> GetDevInfoAsync(GetDevInfoRequestDto data)
|
||
{
|
||
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => x.Ecode == data.ECode);
|
||
if (device == null)
|
||
{
|
||
return new ResultInfo(ResultState.FAIL, "设备未找到");
|
||
}
|
||
var devicesecret = await dbClient.Queryable<W_SZDevice>().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, "设备还未获取验证信息");
|
||
}
|
||
int timestamp = _suZhouService.GetTimestamp();
|
||
int noncestr = _suZhouService.GetNonce();
|
||
var returndata = new GetDevInfoResponseDto
|
||
{
|
||
DeviceId = devicesecret.DevId,
|
||
noncestr = noncestr,
|
||
timestamp = timestamp,
|
||
Secret = devicesecret.Secret,
|
||
SecretHash = devicesecret.SecretHash,
|
||
UserId = UserId,
|
||
PostUrl = ApiUrl,
|
||
ScanningTime = GetTimestamp(DateTime.Now),
|
||
ResultId = IDGen.NextID()
|
||
};
|
||
//解析协议,IC卡数据@垃圾桶编号@厨余垃圾@7.91
|
||
// 00000000003031 40 000F000002 40 C6E4CBFBC0ACBBF8 40 35312E300D0A
|
||
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 weighthex = data.data.Substring(46, data.data.Length - 46);
|
||
returndata.trash = Convert.ToInt32(trashhex, 16).ToString();
|
||
var type = GetChsFromHex(typehex);
|
||
var weight = GetChsFromHex(weighthex);
|
||
returndata.type = TrashType(type);
|
||
returndata.Weight = weight.ToDouble();
|
||
returndata.IsSuccessed = true;
|
||
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);
|
||
}
|
||
/// <summary>
|
||
/// 16进制转汉字
|
||
/// </summary>
|
||
/// <param name="hex"></param>
|
||
/// <returns></returns>
|
||
private string GetChsFromHex(string hex)
|
||
{
|
||
if (hex == null)
|
||
return "";
|
||
if (hex.Length % 2 != 0)
|
||
{
|
||
hex += "20";//空格
|
||
}
|
||
// 需要将 hex 转换成 byte 数组。
|
||
byte[] bytes = new byte[hex.Length / 2];
|
||
for (int i = 0; i < bytes.Length; i++)
|
||
{
|
||
try
|
||
{
|
||
// 每两个字符是一个 byte。
|
||
bytes[i] = byte.Parse(hex.Substring(i * 2, 2),
|
||
System.Globalization.NumberStyles.HexNumber);
|
||
}
|
||
catch
|
||
{
|
||
}
|
||
}
|
||
// 获得 GB2312,Chinese Simplified。
|
||
Encoding chs = Encoding.GetEncoding("gb2312");
|
||
return chs.GetString(bytes);
|
||
}
|
||
/// <summary>
|
||
/// 心跳数据上报
|
||
/// </summary>
|
||
/// <param name="data"></param>
|
||
/// <returns></returns>
|
||
public async Task<ResultInfo> PostHeartAsync(DevHeartRequestDto data)
|
||
{
|
||
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => x.Ecode == data.ECode);
|
||
if (device == null)
|
||
{
|
||
return new ResultInfo(ResultState.FAIL, "设备未找到");
|
||
}
|
||
return new ResultInfo(ResultState.SUCCESS, "success");
|
||
}
|
||
/// <summary>
|
||
/// 获取设备注册信息,第一次开机使用
|
||
/// </summary>
|
||
/// <param name="ecode"></param>
|
||
/// <returns></returns>
|
||
public async Task<ResultInfo> RegInfoAsync(string ecode)
|
||
{
|
||
var device = await dbClient.Queryable<W_Device>().FirstAsync(x => x.Ecode == ecode);
|
||
//if (device == null)
|
||
//{
|
||
// return new ResultInfo(ResultState.FAIL, "设备未找到");
|
||
//}
|
||
var data = new DevRegInfoResponseDto
|
||
{
|
||
status = 0
|
||
};
|
||
return new ResultInfo(ResultState.SUCCESS, "success", data);
|
||
}
|
||
private int TrashType(string type)
|
||
{
|
||
if (type == "厨余垃圾") return 1;
|
||
else if (type == "可回收物") return 2;
|
||
else if (type == "有害垃圾") return 3;
|
||
else if (type == "其他垃圾") return 4;
|
||
else return 0;
|
||
}
|
||
private int GetTimestamp(DateTime time)
|
||
{
|
||
DateTime dateTimeStart = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1, 8, 0, 0));
|
||
int timestamp = Convert.ToInt32((time - dateTimeStart).TotalSeconds);
|
||
return timestamp;
|
||
}
|
||
/// <summary>
|
||
/// 字节数组转16进制
|
||
/// </summary>
|
||
/// <param name="bt"></param>
|
||
/// <returns></returns>
|
||
private string BytesToHexStr( byte[] bt)
|
||
{
|
||
string returnStr = "";
|
||
if (bt != null)
|
||
{
|
||
for (int i = 0; i < bt.Length; i++)
|
||
{
|
||
returnStr += bt[i].ToString("X2");
|
||
}
|
||
}
|
||
return returnStr;
|
||
}
|
||
}
|
||
}
|