using Furion; using Furion.DependencyInjection; using Furion.RemoteRequest.Extensions; using MessagePack; using Nirvana.Common; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace Waste.Application { /// /// 苏州设备对接平台 /// public class SuZhouService : ISuZhouService, 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 IHttpClientFactory _clientFactory; private readonly ILoggerService _loggerService; public SuZhouService(IHttpClientFactory clientFactory, ILoggerService loggerService) { _clientFactory = clientFactory; _loggerService = loggerService; } /// /// 分页查询当前账号下存在的地产区域数据 /// /// /// /// /// public async Task GetEstatesAsync(int page = 1, int size = 10, string search = "") { var url = $"{ApiUrl}/api/estates?page={page}&size={size}&search={search}"; var response = await GetDataAsync(url, 1, ""); var resdata = await response.Content.ReadAsByteArrayAsync(); var s2c_dto = MessagePackSerializer.Deserialize>(resdata); if (response.IsSuccessStatusCode) { return new ResultInfo(ResultState.SUCCESS, "success", s2c_dto); } else { var msg = await response.Content.ReadAsStringAsync(); return new ResultInfo(ResultState.FAIL, msg); } } /// /// 查询地产区域信息 /// /// /// public async Task GetEstatesByIdAsync(string id) { var url = $"{ApiUrl}/api/estates/{id}"; var response = await GetDataAsync(url, 1, ""); var resdata = await response.Content.ReadAsByteArrayAsync(); var s2c_dto = MessagePackSerializer.Deserialize(resdata); if (response.IsSuccessStatusCode) { return new ResultInfo(ResultState.SUCCESS, "success", s2c_dto); } else { var msg = await response.Content.ReadAsStringAsync(); return new ResultInfo(ResultState.FAIL, msg); } } /// /// Hello接口GET测试 /// /// /// public async Task GetHelloAsync(string greet) { var url = $"{ApiUrl}/api/hello/{greet}"; var response = await GetDataAsync(url, 2, greet); var resdata = await response.Content.ReadAsStringAsync(); var returndata = ""; if (response.IsSuccessStatusCode) { returndata = $"成功:{resdata}"; } else { returndata = $"失败:{resdata}"; } return new ResultInfo(ResultState.SUCCESS, "success", returndata); } /// /// 添加地产区域信息 /// /// /// public async Task PostEstatesAsync(EstatesC2SDto estatesC2SDto) { var url = $"{ApiUrl}/api/estates"; string[] paramlist = new string[] { estatesC2SDto.Code,estatesC2SDto.Name,estatesC2SDto.Addr,estatesC2SDto.City,estatesC2SDto.Area,estatesC2SDto.Street }; var response = await PostDataAsync(url, 1, estatesC2SDto, paramlist); var resdata = await response.Content.ReadAsByteArrayAsync(); if (response.IsSuccessStatusCode) { var s2c_dto = MessagePackSerializer.Deserialize(resdata); return new ResultInfo(ResultState.SUCCESS, "success", s2c_dto.id); } else { var msg = await response.Content.ReadAsStringAsync(); return new ResultInfo(ResultState.FAIL, msg); } } /// /// 向服务端推送测试用垃圾采集数据 /// /// /// public async Task PostGarbagesAsync(GarbageC2SDto garbageC2SDto) { var url = $"{ApiUrl}/api/garbages"; garbageC2SDto.ScanningTime = GetTimestamp(); string[] paramlist = new string[] { garbageC2SDto.Weight.ToString(),garbageC2SDto.Trash,garbageC2SDto.Type.ToString(),garbageC2SDto.ScanningTime.ToString(),garbageC2SDto.DStatus.ToString() }; int timestamp = GetTimestamp(); int nonce = GetNonce(); string sign = GetUserApiSign("lsBThmYBYUMrmwkl", paramlist); var c2s_dto = new SuZhouPostApiBaseDto { Data = garbageC2SDto, SecretHash = "bfbaf98fb5b343b2", Nonce = nonce, Signature = sign, TimeStamp = timestamp, DeviceId = "08d9588d-4796-48f9-8c5b-f28f271b51d0" }; var request = new HttpRequestMessage(HttpMethod.Post, url); var bytes = MessagePackSerializer.Serialize(c2s_dto); request.Content = new ByteArrayContent(bytes); request.Headers.Add("Accept", "application/x-msgpack"); request.Content.Headers.Add("Content-Type", "application/x-msgpack"); var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { return new ResultInfo(ResultState.SUCCESS, "success"); } else { var msg = await response.Content.ReadAsStringAsync(); return new ResultInfo(ResultState.FAIL, msg); } } /// /// Hello接口Post测试 /// /// /// public async Task PostHelloAsync(string greet) { var url = $"{ApiUrl}/api/hello"; var hello_dto = new HelloC2SDto { Greet = greet }; var response = await PostDataAsync(url, 1, hello_dto, greet); var resdata = await response.Content.ReadAsByteArrayAsync(); var s2c_dto = MessagePackSerializer.Deserialize(resdata); var returndata = ""; if (response.IsSuccessStatusCode) { returndata = $"成功:{s2c_dto.Message},{s2c_dto.Code}"; } else { returndata = $"失败:{s2c_dto.Message},{s2c_dto.Code}"; } return new ResultInfo(ResultState.SUCCESS, "success", returndata); } /// /// 获取时间戳 /// /// public int GetTimestamp() { DateTime dateTimeStart = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1, 8, 0, 0)); int timestamp = Convert.ToInt32((DateTime.Now - dateTimeStart).TotalSeconds); return timestamp; } /// /// 获取UTC时间戳 /// /// public int GetUTCTimestamp() { DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now); DateTime utcStartTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); int timestamp = Convert.ToInt32((utcTime - utcStartTime).TotalSeconds); return timestamp; } /// /// 获取随机数 /// /// public int GetNonce() { var random = new Random(); int nonce = random.Next(1, Int32.MaxValue); return nonce; } /// /// 获取签名 /// /// /// /// public string GetUserApiSign(string secret, params string[] dataparams) { StringBuilder sb = new StringBuilder(); if (dataparams != null && dataparams.Length > 0) { foreach (var item in dataparams) { sb.Append(item); } } if (!string.IsNullOrEmpty(secret)) { sb.Append(secret); } else { sb.Append(ApiSecret); } string str = sb.ToString(); string sign = Md5.md5(str, 16).ToLower(); return sign; } /// /// POST封装接口 /// /// 地址 /// 1-返回参数为msgpack,2-返回参数为text /// post的数据 /// 加密参数 /// private async Task PostDataAsync(string url, int type, object postdata, params string[] data) { int timestamp = GetTimestamp(); int nonce = GetNonce(); string sign = GetUserApiSign("", data); var c2s_dto = new SuZhouApiBaseDto { Data = postdata, SecretHash = ApiSecretHash, Nonce = nonce, Signature = sign, TimeStamp = timestamp, UserId = UserId }; var request = new HttpRequestMessage(HttpMethod.Post, url); //发起post请求 byte[] bytes = MessagePackSerializer.Serialize(c2s_dto); //序列化请求数据为byte request.Content = new ByteArrayContent(bytes); //设置请求信息体 if (type == 2) { request.Headers.Add("Accept", "text/plain"); } else { request.Headers.Add("Accept", "application/x-msgpack"); } request.Content.Headers.Add("Content-Type", "application/x-msgpack"); var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); var testdata = await response.Content.ReadAsStringAsync(); return response; } /// /// GET接口封装 /// /// 地址 /// 1-返回参数为msgpack,2-返回参数为text /// 加密参数 /// private async Task GetDataAsync(string url, int type, params string[] data) { int timestamp = GetTimestamp(); int nonce = GetNonce(); string sign = GetUserApiSign("", data); var request = new HttpRequestMessage(HttpMethod.Get, url); if (type == 2) { request.Headers.Add("Accept", "text/plain"); } else { request.Headers.Add("Accept", "application/x-msgpack"); } request.Headers.Add("secret", ApiSecretHash); request.Headers.Add("nonce", nonce.ToString()); request.Headers.Add("time", timestamp.ToString()); request.Headers.Add("user", UserId); request.Headers.Add("sign", sign); var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); var testdata = await response.Content.ReadAsStringAsync(); return response; } /// /// Delete接口封装 /// /// 地址 /// 1-返回参数为msgpack,2-返回参数为text /// 加密参数 /// private async Task DeleteDataAsync(string url, int type, params string[] data) { int timestamp = GetTimestamp(); int nonce = GetNonce(); string sign = GetUserApiSign("", data); var request = new HttpRequestMessage(HttpMethod.Delete, url); if (type == 2) { request.Headers.Add("Accept", "text/plain"); } else { request.Headers.Add("Accept", "application/x-msgpack"); } request.Headers.Add("secret", ApiSecretHash); request.Headers.Add("nonce", nonce.ToString()); request.Headers.Add("time", timestamp.ToString()); request.Headers.Add("user", UserId); request.Headers.Add("sign", sign); var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); var testdata = await response.Content.ReadAsStringAsync(); return response; } /// /// 删除地产区域 /// /// /// public async Task DeleteEstates(string id) { var url = $"{ApiUrl}/api/estates/{id}"; var response = await DeleteDataAsync(url, 2, id); var resdata = await response.Content.ReadAsByteArrayAsync(); if (response.IsSuccessStatusCode) { return new ResultInfo(ResultState.SUCCESS, "删除成功"); } else { var msg = await response.Content.ReadAsStringAsync(); return new ResultInfo(ResultState.FAIL, msg); } } /// /// 删除采集点 /// /// /// public async Task DeleteCollect(string id) { var url = $"{ApiUrl}/api/collectionpoints/{id}"; var response = await DeleteDataAsync(url, 2, id); var resdata = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { return new ResultInfo(ResultState.SUCCESS, "删除成功"); } else { return new ResultInfo(ResultState.FAIL, resdata); } } /// /// 添加采集点 /// /// /// public async Task PostCollectAsync(CollectC2SDto estatesC2SDto) { var url = $"{ApiUrl}/api/CollectionPoints"; string[] paramlist = new string[] { estatesC2SDto.Code,estatesC2SDto.Name,estatesC2SDto.Addr,estatesC2SDto.Estate }; var response = await PostDataAsync(url, 1, estatesC2SDto, paramlist); var resdata = await response.Content.ReadAsByteArrayAsync(); if (response.IsSuccessStatusCode) { var s2c_dto = MessagePackSerializer.Deserialize(resdata); return new ResultInfo(ResultState.SUCCESS, "success", s2c_dto.id); } else { var msg = await response.Content.ReadAsStringAsync(); return new ResultInfo(ResultState.FAIL, msg); } } /// /// 上传数据 /// /// /// public async Task PostGarbagesAsync(GarbagePltC2SDto garbageC2SDto) { var url = $"{ApiUrl}/api/garbages"; string[] paramlist = new string[] { garbageC2SDto.Weight.ToString(),garbageC2SDto.Trash,garbageC2SDto.Type.ToString(),garbageC2SDto.ScanningTime.ToString(),garbageC2SDto.DStatus.ToString() }; int timestamp = GetTimestamp(); int nonce = GetNonce(); string sign = GetUserApiSign(garbageC2SDto.secret, paramlist); var c2s_dto = new SuZhouPostApiBaseDto { Data = new GarbageC2SDto { DStatus = garbageC2SDto.DStatus, ScanningTime = garbageC2SDto.ScanningTime, Trash = garbageC2SDto.Trash, Type = garbageC2SDto.Type, Weight = garbageC2SDto.Weight }, SecretHash = garbageC2SDto.secrethash, Nonce = nonce, Signature = sign, TimeStamp = timestamp, DeviceId = garbageC2SDto.deviceid }; var request = new HttpRequestMessage(HttpMethod.Post, url); var bytes = MessagePackSerializer.Serialize(c2s_dto); request.Content = new ByteArrayContent(bytes); request.Headers.Add("Accept", "application/x-msgpack"); request.Content.Headers.Add("Content-Type", "application/x-msgpack"); var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { //记录日志 _loggerService.AddLogger($"测量信息上报成功:参数:{c2s_dto.ToJson()}", 3); return new ResultInfo(ResultState.SUCCESS, "success"); } else { var msg = await response.Content.ReadAsStringAsync(); //记录日志 _loggerService.AddLogger($"测量信息上报失败:参数:{c2s_dto.ToJson()}\r\n返回值:{msg}", 3); return new ResultInfo(ResultState.FAIL, msg); } } } }