HttpHelper.cs
/// <summary>
/// get 请求
/// </summary>
/// <param name="url"></param>
/// <param name="headers"></param>
/// <returns></returns>
public static async Task<string> GetAsync(string url, IList<KeyValuePair<string, string>> headers = null, ResHeader resHeader = null, IList<KeyValuePair<string, string>> noValidHeader = null)
{
using (HttpClient client = new HttpClient())
{
SetHeaders(client, headers);
if (noValidHeader != null)
{
foreach (var head in noValidHeader)
{
client.DefaultRequestHeaders.TryAddWithoutValidation(head.Key, head.Value);
}
}
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.GetAsync(url);
if (response.Headers != null && resHeader != null)
{
foreach (var head in response.Headers)
{
resHeader.Header.Add(new KeyValuePair<string, string>(head.Key, head.Value.FirstOrDefault()));
}
}
var result = await response.Content.ReadAsStringAsync();
LogHelper.AliInfo("Get", JsonConvert.SerializeObject(new { url, headers, result }));
return result;
}
}
/// <summary>
/// put 请求
/// </summary>
/// <param name="url"></param>
/// <param name="content"></param>
/// <param name="headers"></param>
/// <param name="contentType"></param>
/// <returns></returns>
public static async Task<string> PutAsync(string url, string content, IList<KeyValuePair<string, string>> headers = null, string contentType = "application/json", IList<KeyValuePair<string, string>> noValidHeader = null, ResHeader resHeader = null)
{
HttpContent httpContext = new StringContent(content);
httpContext.Headers.ContentType = new MediaTypeHeaderValue(contentType);
using (HttpClient client = new HttpClient())
{
SetHeaders(client, headers);
if (noValidHeader != null)
{
foreach (var head in noValidHeader)
{
client.DefaultRequestHeaders.TryAddWithoutValidation(head.Key, head.Value);
}
}
var response = await client.PutAsync(url, httpContext);
if (response.Headers != null && resHeader != null)
{
foreach (var head in response.Headers)
{
resHeader.Header.Add(new KeyValuePair<string, string>(head.Key, head.Value.FirstOrDefault()));
}
}
var result = await response.Content.ReadAsStringAsync();
LogHelper.AliInfo("Put", JsonConvert.SerializeObject(new { url, headers, result }));
return result;
}
}
#region 生成token
/// <summary>
/// 生成token
/// </summary>
/// <param name="ip"></param>
/// <param name="userName"></param>
/// <param name="pwd"></param>
/// <param name="path"></param>
/// <param name="method"></param>
/// <returns></returns>
private async Task<string> GenerateTokenAsync(string ip, string userName, string pwd, string path, string method)
{
ResHeader resHeader = new ResHeader { Header = new List<KeyValuePair<string, string>>() };
await HttpHelper.GetAsync($"http://{ip}/{path}", null, resHeader);
string wwwAuthenticate = resHeader.Header.FirstOrDefault(e => e.Key == "WWW-Authenticate").Value;
// 分割字符串Digest qop="auth", realm="IP Camera(C0689)", nonce="5a6a4a685a6a646c4e446b364e5759344f4459345a54413d", stale="FALSE"
string qop = wwwAuthenticate.Split("qop=")[1];
qop = qop.Split(',')[0];
qop = qop.Replace("\"", "");
string realm = wwwAuthenticate.Split("realm=")[1];
realm = realm.Split(',')[0];
realm = realm.Replace("\"", "");
string nonce = wwwAuthenticate.Split("nonce=")[1];
nonce = nonce.Split(',')[0];
nonce = nonce.Replace("\"", "");
string nc = "00000001"; //请求序号
string cnonce = "f74b7289ebe104ac"; //客户端随机数
var a1 = Md5Helper.Generate(userName + ":" + realm + ":" + pwd);
var a2 = Md5Helper.Generate(method.ToUpper() + ":" + path);
string auth = string.Empty;
if (string.IsNullOrEmpty(qop))
{
auth = $"Digest username=\"{userName}\", realm=\"{realm}\", nonce=\"{nonce}\", uri=\"{path}\", response=\"{Md5Helper.Generate(a1 + ":" + nonce + ":" + a2)}\"";
}
else
{
auth = $"Digest username=\"{userName}\", realm=\"{realm}\", nonce=\"{nonce}\", uri=\"{path}\", response=\"{Md5Helper.Generate(a1 + ":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":" + a2)}\",qop=\"{qop}\", nc=\"{nc}\", cnonce=\"{cnonce}\",Basic realm=\"{realm} \"";
}
return auth;
}
#endregion
#region 获取摄像头配置
/// <summary>
/// 获取摄像头配置
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Callback<CameraConfigResponse>> GetCameraConfigAsync(long id)
{
var data = new CameraConfigResponse();
var camera = await _cameraRepository.GetAsync(id);
if (camera == null)
{
return new Callback<CameraConfigResponse>(false) { Msg = "未找到指定摄像头" };
}
var path = "/ISAPI/System/Network/interfaces";
var token = await GenerateTokenAsync(camera.Ip, camera.LoginName, camera.Pwd, path, "GET");
var res = await HttpHelper.GetAsync($"http://{camera.Ip}{path}", noValidHeader: new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Authorization",token)
});
var doc = new XmlDocument();
doc.LoadXml(res);
var json= JsonConvert.SerializeXmlNode(doc);
var jsonDto = JsonConvert.DeserializeObject<CameraNetConfigDto>(json);
data.Ip = camera.Ip;
data.SubMask = jsonDto.NetworkInterfaceList.NetworkInterface.IPInfo.SubMask;
data.GateWay = jsonDto.NetworkInterfaceList.NetworkInterface.IPInfo.Gateway.Ip;
data.Dns = jsonDto.NetworkInterfaceList.NetworkInterface.IPInfo.Dns.Ip;
return new Callback<CameraConfigResponse> { Data = data };
}
#endregion
#region 修改配置
/// <summary>
/// 修改配置
/// </summary>
/// <param name="id"></param>
/// <param name="request"></param>
/// <returns></returns>
public async Task<Callback> SetConfigAsync(long id, CameraConfigUpdateRequest request)
{
var camera = await _cameraRepository.GetAsync(id);
if (camera == null)
{
return new Callback(false) { Msg = "未找到指定摄像头" };
}
var path = "/ISAPI/System/Network/interfaces/1/ipAddress";
var token = await GenerateTokenAsync(camera.Ip, camera.LoginName, camera.Pwd, path, "PUT");
StringBuilder data = new StringBuilder();
data.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
data.Append("<NetworkInterface>");
data.Append("<id>1</id>");
data.Append("<IPAddress>");
data.Append("<ipVersion>dual</ipVersion>");
data.Append("<addressingType>");
data.Append(request.Dhcp);
data.Append("</addressingType>");
data.Append("<ipAddress>");
data.Append(request.Ip);
data.Append("</ipAddress>");
data.Append("<subnetMask>");
data.Append(request.SubMask);
data.Append("</subnetMask>");
data.Append("<ipV6AddressingType>ra</ipV6AddressingType>");
data.Append("<DefaultGateway>");
data.Append("<ipAddress>");
data.Append(request.GateWay);
data.Append("</ipAddress>");
data.Append("</DefaultGateway>");
data.Append("<PrimaryDNS>");
data.Append("<ipAddress>");
data.Append(request.Dns);
data.Append("</ipAddress>");
data.Append("</PrimaryDNS>");
data.Append("<SecondaryDNS>");
data.Append("<ipAddress>");
data.Append(request.SecondDns);
data.Append("</ipAddress>");
data.Append("</SecondaryDNS>");
data.Append("</IPAddress>");
data.Append("</NetworkInterface>");
var res = await HttpHelper.PutAsync($"http://{camera.Ip}{path}", data.ToString(), noValidHeader: new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Authorization",token)
});
return new Callback();
}
#endregion
#region 重启
/// <summary>
/// 重启
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<Callback> RebotAsync(long id)
{
var camera = await _cameraRepository.GetAsync(id);
if (camera == null)
{
return new Callback(false) { Msg = "未找到指定摄像头" };
}
var path = "/ISAPI/System/reboot";
var token = await GenerateTokenAsync(camera.Ip, camera.LoginName, camera.Pwd, path, "PUT");
var res = await HttpHelper.PutAsync($"http://{camera.Ip}{path}", "{}", noValidHeader: new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Authorization",token)
});
return new Callback();
}
#endregion