海康摄像头通过isapi 操作摄像头

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
鲸之声为您拼命加载中...