修改ONVIF服务,修改为默认使用第一个Profile,否则当前海康摄像头无法操作云台

Former-commit-id: 64f3fb3639b9bb78a0032f5ace90aa957e52d170
Former-commit-id: 388d850a253da6727db0ae76fb1d3f4b317719e9
1.0
wanggang 5 years ago
parent 8783cd07f9
commit 43f76eba0c

@ -97,27 +97,5 @@ namespace Application.Domain.Entities
Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds()
};
}
//public IoTData AddorUpdateData(IoTData data)
//{
// var oldData = this.Data.FirstOrDefault(o => o.Key == data.Key);
// if (oldData == null)
// {
// oldData = data;
// this.Data.Add(data);
// }
// else
// {
// if (oldData.Name != data.Name || oldData.Value != data.Value || oldData.Unit != data.Unit || oldData.Description != data.Description)
// {
// oldData.Name = data.Name;
// oldData.Value = data.Value;
// oldData.Unit = data.Unit;
// oldData.Description = data.Description;
// oldData.Timestamp = data.Timestamp;
// }
// }
// return oldData;
//}
}
}

@ -92,7 +92,8 @@ namespace IoTNode.DeviceServices
}
else
{
entity.From(data);
//must add skipNull
entity.From(data,skipNull:true);
}
repo.SaveChanges();
}

@ -166,7 +166,7 @@ namespace IoTNode.DeviceServices.Onvif
return result;
}
private string GetOnoce(string deviceUrl)
public string GetOnoce(string deviceUrl)
{
var message = @"<s:Envelope xmlns:s=""http://www.w3.org/2003/05/soap-envelope"">
<s:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
@ -175,9 +175,18 @@ namespace IoTNode.DeviceServices.Onvif
</s:Envelope>";
var hc = this._httpClientFactory.CreateClient();
hc.DefaultRequestHeaders.Add("ContentType", $"application/soap+xml; charset=utf-8; action=\"{MessageTemplate.GetDeviceInformationAction}\"");
var task = hc.PostAsync(deviceUrl, new StringContent(message));
var result = task.Result.Headers.WwwAuthenticate;
return Regex.Match(result.ToString(), "nonce=\"([^\"]+)\"").Groups[1].Value;
try
{
var task = hc.PostAsync(deviceUrl, new StringContent(message));
var result = task.Result.Headers.WwwAuthenticate;
return Regex.Match(result.ToString(), "nonce=\"([^\"]+)\"").Groups[1].Value;
}
catch (Exception ex)
{
ex.PrintStack();
return "";
}
}
}
}

@ -136,23 +136,25 @@ namespace IoTNode.DeviceServices.Onvif
IoTGatewayId = node.Id
};
deviceRepo.Add(device);
deviceRepo.SaveChanges();
var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}";
var file = Path.Combine(this._env.WebRootPath, fileName);
var pushValue = device.Data.FirstOrDefault(o => o.Name == "推流")?.Value ?? "是";
this.UpdateData(deviceRepo, device, device.CreateData("Push", pushValue, IoTDataType.Data, IoTValueType.String, "推流"));
this.UpdateData(deviceRepo, device, device.CreateData("Record", "否", IoTDataType.Data, IoTValueType.String, "录像"));
this.UpdateData(deviceRepo, device, device.CreateData("ffmpeg.file", file, IoTDataType.Info, IoTValueType.String, "ffmpeg路径", hidden: true));
this.UpdateData(deviceRepo, device, device.CreateData("ffmpeg.args", GetSetting("ffmpeg.args"), IoTDataType.Info, IoTValueType.String, "ffmpeg.args", hidden: true));
}
else
{
if (device.Ip != ipCamera.Ip)
{
device.Ip = ipCamera.Ip;
deviceRepo.SaveChanges();
}
device.Ip = ipCamera.Ip;
}
deviceRepo.SaveChanges();
this.UpdateData(deviceRepo, device, device.CreateData("DeviceUrl", ipCamera.DeviceUrl, IoTDataType.Info, IoTValueType.String, "设备地址"));
this.UpdateData(deviceRepo, device, device.CreateData("PtzAddress", ipCamera.PTZAddress, IoTDataType.Info, IoTValueType.String, "云台地址"));
this.UpdateData(deviceRepo, device, device.CreateData("Ptz3DZoomSupport", ipCamera.Ptz3DZoomSupport ? "是" : "否", IoTDataType.Info, IoTValueType.String, "缩放支持"));
var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}";
var file = Path.Combine(this._env.WebRootPath, fileName);
var pushValue = device.Data.FirstOrDefault(o => o.Name == "推流")?.Value ?? "是";
this.UpdateData(deviceRepo, device, device.CreateData("Push", pushValue, IoTDataType.Data, IoTValueType.String, "推流"));
this.UpdateData(deviceRepo, device, device.CreateData("Record", "否", IoTDataType.Data, IoTValueType.String, "录像"));
this.UpdateData(deviceRepo, device, device.CreateData("ffmpeg.file", file, IoTDataType.Info, IoTValueType.String, "ffmpeg路径", hidden: true));
this.UpdateData(deviceRepo, device, device.CreateData("ffmpeg.args", GetSetting("ffmpeg.args"), IoTDataType.Info, IoTValueType.String, "ffmpeg.args", hidden: true));
deviceRepo.SaveChanges();
var profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl);
var needAuth = false;
var hasAuth = false;
@ -187,13 +189,13 @@ namespace IoTNode.DeviceServices.Onvif
var token = device.Data.FirstOrDefault(o => o.Key == "ProfileToken")?.Value;
if (string.IsNullOrEmpty(token))
{
token = ipCamera.Profiles.Last().Token;
token = ipCamera.Profiles.First().Token;
}
else
{
if (!ipCamera.Profiles.Any(o => o.Token == token))
{
token = ipCamera.Profiles.Last().Token;
token = ipCamera.Profiles.First().Token;
}
}
if (needAuth)
@ -220,9 +222,6 @@ namespace IoTNode.DeviceServices.Onvif
}
this.UpdateData(deviceRepo, device, device.CreateData("NeedAuth", needAuth ? "是" : "否", IoTDataType.Info, IoTValueType.String, "需认证"));
this.UpdateData(deviceRepo, device, device.CreateData("HasAuth", hasAuth ? "是" : "否", IoTDataType.Info, IoTValueType.String, "已认证"));
this.UpdateData(deviceRepo, device, device.CreateData("DeviceUrl", ipCamera.DeviceUrl, IoTDataType.Info, IoTValueType.String, "设备地址"));
this.UpdateData(deviceRepo, device, device.CreateData("PtzAddress", ipCamera.PTZAddress, IoTDataType.Info, IoTValueType.String, "云台地址"));
this.UpdateData(deviceRepo, device, device.CreateData("Ptz3DZoomSupport", ipCamera.Ptz3DZoomSupport ? "是" : "否", IoTDataType.Info, IoTValueType.String, "缩放支持"));
}
catch (Exception ex)
{
@ -245,11 +244,11 @@ namespace IoTNode.DeviceServices.Onvif
{
var camera = cameras.FirstOrDefault(o => o.Number == key);
var remove = false;
if (camera.Data.FirstOrDefault(o => o.Key == "Push").Value != "是")
if (camera.Data.Any(o => o.Key == "Push" && o.Value == "否"))
{
remove = true;
}
if (camera.Data.FirstOrDefault(o => o.Key == "NeedAuth").Value == "是" && camera.Data.FirstOrDefault(o => o.Key == "HasAuth").Value == "否")
if (camera.Data.Any(o => o.Key == "NeedAuth" && o.Value == "是") && camera.Data.Any(o => o.Key == "HasAuth" && o.Value == "否"))
{
remove = true;
}
@ -547,7 +546,8 @@ namespace IoTNode.DeviceServices.Onvif
if (!string.IsNullOrEmpty(ptzAddress))
{
var deviceUrl = camera.GetDataValue("DeviceUrl");
RequestXml(ptzAddress, MessageTemplate.StopAction, String.Format(MessageTemplate.StopMessage, camera.GetDataValue("ProfileToken"), true, true), camera.UserName, camera.Password, GetOnoce(deviceUrl));
var onoce = (this._onvifDeviceManagement as OnvifDeviceManagement).GetOnoce(deviceUrl);
RequestXml(ptzAddress, MessageTemplate.StopAction, String.Format(MessageTemplate.StopMessage, camera.GetDataValue("ProfileToken"), true, true), camera.UserName, camera.Password, onoce);
}
}
}
@ -561,7 +561,8 @@ namespace IoTNode.DeviceServices.Onvif
if (!string.IsNullOrEmpty(ptzAddress))
{
var deviceUrl = camera.GetDataValue("DeviceUrl");
RequestXml(ptzAddress, MessageTemplate.ContinuousMoveAction, String.Format(MessageTemplate.ContinuousMoveMessage, camera.GetDataValue("ProfileToken"), zx, px, py), camera.UserName, camera.Password, GetOnoce(deviceUrl));
var onoce = (this._onvifDeviceManagement as OnvifDeviceManagement).GetOnoce(deviceUrl);
RequestXml(ptzAddress, MessageTemplate.ContinuousMoveAction, String.Format(MessageTemplate.ContinuousMoveMessage, camera.GetDataValue("ProfileToken"), zx, px, py), camera.UserName, camera.Password,onoce);
}
}
}

@ -1,39 +0,0 @@
//using Infrastructure.Events;
//using Application.Domain.Entities;
//using Microsoft.Extensions.Caching.Distributed;
//namespace IoTNode.Services
//{
// public class CacheEventHandler :
// IEventHander<EntityInsertedEvent<IoTSceneTigger>>,
// IEventHander<EntityUpdatedEvent<IoTSceneTigger>>,
// IEventHander<EntityDeletedEvent<IoTSceneTigger>>
// {
// private readonly IDistributedCache _cache;
// public CacheEventHandler(IDistributedCache cache)
// {
// this._cache = cache;
// }
// public void Handle(EntityInsertedEvent<IoTSceneTigger> message)
// {
// this.Remove();
// }
// public void Handle(EntityUpdatedEvent<IoTSceneTigger> message)
// {
// this.Remove();
// }
// public void Handle(EntityDeletedEvent<IoTSceneTigger> message)
// {
// this.Remove();
// }
// private void Remove()
// {
// this._cache.Remove(CacheKey.SceneTiggerKey);
// }
// }
//}

@ -1,30 +0,0 @@
//using Infrastructure.Extensions;
//using Application.Domain.Entities;
//using Microsoft.Extensions.Caching.Distributed;
//using System.Collections.Generic;
//namespace IoTNode.Services
//{
// public class CachedSceneTiggerService : ISceneTiggerService
// {
// private readonly IDistributedCache _cache;
// private readonly SceneTiggerService _sceneTiggerService;
// public CachedSceneTiggerService(IDistributedCache cache, SceneTiggerService sceneTiggerService)
// {
// this._cache = cache;
// this._sceneTiggerService = sceneTiggerService;
// }
// public IList<IoTSceneTigger> GetSceneTiggers()
// {
// var sceneTiggers = this._cache.Get<IList<IoTSceneTigger>>(CacheKey.SceneTiggerKey);
// if (sceneTiggers == null)
// {
// sceneTiggers = this._sceneTiggerService.GetSceneTiggers();
// _cache.Set(CacheKey.SceneTiggerKey, sceneTiggers);
// }
// return sceneTiggers;
// }
// }
//}
Loading…
Cancel
Save