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;
}
///
/// 获取随机数
///
///
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