zeroframework/Services/DeviceCenter/ZeroFramework.DeviceCenter.API/Controllers/ValuesController.cs

164 lines
5.9 KiB
C#
Raw Normal View History

2023-12-05 09:22:48 +00:00
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using System.Text;
using System.Text.Json;
namespace ZeroFramework.DeviceCenter.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class ValuesController(IDistributedCache distributedCache) : ControllerBase
{
private readonly IDistributedCache _distributedCache = distributedCache;
const string memberkey = "9VQrbUztIWJGu9IhPPeK";
const string appkey = "2302600008";
const string secret = "288Hs33a";
const string apiEndpoint = "http://219.151.131.31:19103";
static readonly HttpClient httpClient = new() { BaseAddress = new Uri(apiEndpoint) };
static readonly Dictionary<string, string> geocodingMap = new()
{
{ "50000002041320029010", "108.6280,30.6700" }, // 龙驹一级
{ "50000002041320029011", "108.6190,30.6400" }, // 龙驹二级
{ "50000002041320029008", "108.5476,30.7365" }, // 龙滩电站
{ "50000002041320029009", "108.4380,30.7713" }, // 高洞子电站
};
[HttpGet]
public async Task<IActionResult> GetAsync()
{
Dictionary<string, object> deviceListparmeters = new()
{
{ nameof(memberkey), memberkey },
};
string deviceListReadAsString = await SendApiRequest(HttpMethod.Post, "api/dict/device/select", deviceListparmeters);
JsonElement deviceListData = JsonDocument.Parse(deviceListReadAsString).RootElement;
if (deviceListData.GetProperty("code").GetString() == "0")
{
return Ok(deviceListData);
}
List<object> result = [];
foreach (var device in deviceListData.GetProperty("result").EnumerateArray())
{
string? deviceid = device.GetProperty("deviceid").GetString() ?? string.Empty;
string? devicename = device.GetProperty("devicename").GetString();
int online = device.GetProperty("online").GetInt32();
string? devicepwd = device.GetProperty("devicepwd").GetString();
string? address = device.GetProperty("address").GetString();
Dictionary<string, object> playUriParmeters = new()
{
{ nameof(memberkey), memberkey },
{ nameof(deviceid), deviceid },
{ "networktype", 1 },
};
string? playUriReadAsString = await SendApiRequest(HttpMethod.Post, "/api/dict/media/live", playUriParmeters);
JsonElement playUriData = JsonDocument.Parse(playUriReadAsString).RootElement;
string? playUri = null;
if (playUriData.GetProperty("code").GetString() == "1")
{
playUri = playUriData.GetProperty("result").EnumerateObject().First(e => e.Name == "m3u8uri").Value.GetString();
}
string? location = null;
if (geocodingMap.ContainsKey(deviceid))
{
location = geocodingMap[deviceid];
}
result.Add(new { DeivceId = deviceid, DeviceName = devicename, Address = address, PlayUri = playUri, Online = Convert.ToBoolean(online), Location = location });
}
return Ok(result);
}
static async Task<string> SendApiRequest(HttpMethod httpMethod, string apiName, Dictionary<string, object> parmeters)
{
string sign = CreateSign(httpMethod, parmeters, secret);
Dictionary<string, object> commonParmeters = new()
{
{ nameof(appkey), appkey },
{ nameof(sign), sign },
};
StringBuilder stringBuilder = new();
foreach (var item in commonParmeters)
{
stringBuilder.Append($"{item.Key}={item.Value}&");
}
string requestUri = $"{apiName}?{stringBuilder.ToString().TrimEnd('&')}";
if (httpMethod == HttpMethod.Get)
{
foreach (var item in parmeters)
{
stringBuilder.Append($"{item.Key}={item.Value}&");
}
requestUri = $"{apiName}?{stringBuilder.ToString().TrimEnd('&')}";
return await httpClient.GetStringAsync(requestUri);
}
var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
string json = JsonSerializer.Serialize(new { Parmdata = parmeters }, options);
StringContent content = new(json, Encoding.UTF8, "application/json");
var result = await httpClient.PostAsync(requestUri, content);
return await result.Content.ReadAsStringAsync();
}
static string CreateSign(HttpMethod httpMethod, Dictionary<string, object> parmeters, string secret)
{
string signString = $"{secret}&&";
SortedDictionary<string, object> sortedParmeters = new(parmeters);
if (httpMethod == HttpMethod.Get)
{
foreach (var item in sortedParmeters)
{
signString += $"{item.Key}={item.Value}&";
}
signString = signString.TrimEnd('&');
}
else
{
signString += JsonSerializer.Serialize(parmeters);
}
return ComputeHashMd5(signString);
}
public static string ComputeHashMd5(string text)
{
using var provider = System.Security.Cryptography.MD5.Create();
StringBuilder builder = new();
foreach (byte b in provider.ComputeHash(Encoding.UTF8.GetBytes(text)))
{
builder.Append(b.ToString("X2"));
}
return builder.ToString();
}
}
}