|
|
|
@ -89,141 +89,157 @@ namespace IoT.Shared.DeviceServices.Onvif
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
Console.WriteLine(ipCamera.DeviceUrl);
|
|
|
|
|
using (var scope = _applicationServices.CreateScope())
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var productNumber = "onvifcamera";
|
|
|
|
|
var categoryRepo = scope.ServiceProvider.GetService<IRepository<Category>>();
|
|
|
|
|
var productRepo = scope.ServiceProvider.GetService<IRepository<Product>>();
|
|
|
|
|
var product = productRepo.Table().FirstOrDefault(o => o.Number == productNumber);
|
|
|
|
|
var category = categoryRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == "10");
|
|
|
|
|
if (product == null)
|
|
|
|
|
using (var scope = _applicationServices.CreateScope())
|
|
|
|
|
{
|
|
|
|
|
product = new Product
|
|
|
|
|
var productNumber = "onvifcamera";
|
|
|
|
|
var categoryRepo = scope.ServiceProvider.GetService<IRepository<Category>>();
|
|
|
|
|
var productRepo = scope.ServiceProvider.GetService<IRepository<Product>>();
|
|
|
|
|
var product = productRepo.Table().FirstOrDefault(o => o.Number == productNumber);
|
|
|
|
|
var category = categoryRepo.ReadOnlyTable().FirstOrDefault(o => o.Number == "10");
|
|
|
|
|
if (product == null)
|
|
|
|
|
{
|
|
|
|
|
Number = productNumber,
|
|
|
|
|
Name = "ONVIF摄像头",
|
|
|
|
|
ApiJson = this.GetApiJson("/Camera/"),
|
|
|
|
|
CategoryId = category.Id
|
|
|
|
|
};
|
|
|
|
|
OpenApiService.UpdateApi(product);
|
|
|
|
|
productRepo.Add(product);
|
|
|
|
|
productRepo.SaveChanges();
|
|
|
|
|
var productDto = product.To<EditProductModel>();
|
|
|
|
|
productDto.CategoryNumber = category.Number;
|
|
|
|
|
this.SendToServer(Methods.EditProductResponse, productDto);
|
|
|
|
|
}
|
|
|
|
|
var deviceNodeRepo = scope.ServiceProvider.GetService<IRepository<Node>>();
|
|
|
|
|
var node = deviceNodeRepo.ReadOnlyTable().FirstOrDefault();
|
|
|
|
|
product = new Product
|
|
|
|
|
{
|
|
|
|
|
Number = productNumber,
|
|
|
|
|
Name = "ONVIF摄像头",
|
|
|
|
|
ApiJson = this.GetApiJson("/Camera/"),
|
|
|
|
|
CategoryId = category.Id
|
|
|
|
|
};
|
|
|
|
|
OpenApiService.UpdateApi(product);
|
|
|
|
|
productRepo.Add(product);
|
|
|
|
|
productRepo.SaveChanges();
|
|
|
|
|
var productDto = product.To<EditProductModel>();
|
|
|
|
|
productDto.CategoryNumber = category.Number;
|
|
|
|
|
this.SendToServer(Methods.EditProductResponse, productDto);
|
|
|
|
|
}
|
|
|
|
|
var deviceNodeRepo = scope.ServiceProvider.GetService<IRepository<Node>>();
|
|
|
|
|
var node = deviceNodeRepo.ReadOnlyTable().FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
var deviceRepo = scope.ServiceProvider.GetService<IRepository<Device>>();
|
|
|
|
|
var device = deviceRepo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == ipCamera.Id);
|
|
|
|
|
if (device == null)
|
|
|
|
|
{
|
|
|
|
|
device = new Device
|
|
|
|
|
var deviceRepo = scope.ServiceProvider.GetService<IRepository<Device>>();
|
|
|
|
|
var device = deviceRepo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == ipCamera.Id);
|
|
|
|
|
if (device == null)
|
|
|
|
|
{
|
|
|
|
|
Name = "摄像头",
|
|
|
|
|
Number = ipCamera.Id,
|
|
|
|
|
Icon = "camera",
|
|
|
|
|
ProductId = product.Id,
|
|
|
|
|
NodeId = node.Id
|
|
|
|
|
};
|
|
|
|
|
var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}";
|
|
|
|
|
var file = Path.Combine(this._env.WebRootPath, fileName);
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Push", "否", DeviceDataType.String, "推流"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Record", "否", DeviceDataType.String, "录像"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("ffmpeg.args", this._configuration["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("mainrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("mainflv", $"http://{this._configuration["stream.flv"]}/live/main{ipCamera.Id}.flv", DeviceDataType.String, "主码流flv"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("mainhls", $"http://{this._configuration["stream.hls"]}/live/main{ipCamera.Id}.m3u8", DeviceDataType.String, "主码流hls"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("subrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/sub{ipCamera.Id}", DeviceDataType.String, "子码流rtmp"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("subflv", $"http://{this._configuration["stream.flv"]}/live/sub{ipCamera.Id}.flv", DeviceDataType.String, "子码流flv"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("subhls", $"http://{this._configuration["stream.hls"]}/live/sub{ipCamera.Id}.m3u8", DeviceDataType.String, "子码流hls"));
|
|
|
|
|
device.ConnectId = this._configuration["connectId"];
|
|
|
|
|
deviceRepo.Add(device);
|
|
|
|
|
}
|
|
|
|
|
var profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl);
|
|
|
|
|
var needAuth = false;
|
|
|
|
|
var hasAuth = false;
|
|
|
|
|
if (profiles == "")
|
|
|
|
|
{
|
|
|
|
|
needAuth = true;
|
|
|
|
|
device.UserName = device.UserName ?? this._configuration["camera.usr"];
|
|
|
|
|
device.Password = device.Password ?? this._configuration["camera.pwd"];
|
|
|
|
|
profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password);
|
|
|
|
|
device = new Device
|
|
|
|
|
{
|
|
|
|
|
Name = "摄像头",
|
|
|
|
|
Number = ipCamera.Id,
|
|
|
|
|
Ip = ipCamera.Ip,
|
|
|
|
|
Icon = "camera",
|
|
|
|
|
ProductId = product.Id,
|
|
|
|
|
NodeId = node.Id
|
|
|
|
|
};
|
|
|
|
|
var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}";
|
|
|
|
|
var file = Path.Combine(this._env.WebRootPath, fileName);
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Push", "是", DeviceDataType.String, "推流"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Record", "否", DeviceDataType.String, "录像"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("ffmpeg.args", this._configuration["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("mainrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("mainflv", $"http://{this._configuration["stream.flv"]}/live/main{ipCamera.Id}.flv", DeviceDataType.String, "主码流flv"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("mainhls", $"http://{this._configuration["stream.hls"]}/live/main{ipCamera.Id}.m3u8", DeviceDataType.String, "主码流hls"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("subrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/sub{ipCamera.Id}", DeviceDataType.String, "子码流rtmp"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("subflv", $"http://{this._configuration["stream.flv"]}/live/sub{ipCamera.Id}.flv", DeviceDataType.String, "子码流flv"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("subhls", $"http://{this._configuration["stream.hls"]}/live/sub{ipCamera.Id}.m3u8", DeviceDataType.String, "子码流hls"));
|
|
|
|
|
device.ConnectId = this._configuration["connectId"];
|
|
|
|
|
deviceRepo.Add(device);
|
|
|
|
|
deviceRepo.SaveChanges();
|
|
|
|
|
}
|
|
|
|
|
var profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl);
|
|
|
|
|
var needAuth = false;
|
|
|
|
|
var hasAuth = false;
|
|
|
|
|
if (profiles == "")
|
|
|
|
|
{
|
|
|
|
|
hasAuth = false;
|
|
|
|
|
needAuth = true;
|
|
|
|
|
device.UserName = device.UserName ?? this._configuration["camera.usr"];
|
|
|
|
|
device.Password = device.Password ?? this._configuration["camera.pwd"];
|
|
|
|
|
profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password);
|
|
|
|
|
if (profiles == "")
|
|
|
|
|
{
|
|
|
|
|
hasAuth = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
hasAuth = true;
|
|
|
|
|
ipCamera.GetProfilesXml = profiles;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
hasAuth = true;
|
|
|
|
|
ipCamera.GetProfilesXml = profiles;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ipCamera.GetProfilesXml = profiles;
|
|
|
|
|
}
|
|
|
|
|
ipCamera.ParseProfiles();
|
|
|
|
|
ipCamera.ParseProfiles();
|
|
|
|
|
|
|
|
|
|
if (needAuth)
|
|
|
|
|
{
|
|
|
|
|
ipCamera.MainStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.MainSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.SubStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.Last().Token);
|
|
|
|
|
ipCamera.SubSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.Last().Token);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ipCamera.MainStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.MainSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.SubStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.Last().Token);
|
|
|
|
|
ipCamera.SubSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.Last().Token);
|
|
|
|
|
}
|
|
|
|
|
ipCamera.ParseStreamUri();
|
|
|
|
|
ipCamera.ParseSnapshotUri();
|
|
|
|
|
device.AddorUpdateData(device.CreateData("NeedAuth", needAuth ? "是" : "否", DeviceDataType.String, "需认证"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("HasAuth", hasAuth ? "是" : "否", DeviceDataType.String, "已认证"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("DeviceUrl", ipCamera.DeviceUrl, DeviceDataType.String, "设备地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("PtzAddress", ipCamera.PTZAddress, DeviceDataType.String, "云台地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Ptz3DZoomSupport", ipCamera.Ptz3DZoomSupport ? "是" : "否", DeviceDataType.String, "缩放支持"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("MainToken", ipCamera.Profiles.First().Token, DeviceDataType.String, "主码流Token"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("SubToken", ipCamera.Profiles.Last().Token, DeviceDataType.String, "子码流Token"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("MainStreamUri", ipCamera.MainStreamUri, DeviceDataType.String, "主码流地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("MainSnapshotUri", ipCamera.MainSnapshotUri, DeviceDataType.String, "主码流截图地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("SubStreamUri", ipCamera.SubStreamUri, DeviceDataType.String, "子码流地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("SubSnapshotUri", ipCamera.SubSnapshotUri, DeviceDataType.String, "子码流截图地址"));
|
|
|
|
|
var jpgBytes = ScreenShot(device);
|
|
|
|
|
using (var stream = new MemoryStream(jpgBytes))
|
|
|
|
|
{
|
|
|
|
|
using (var bigImage = Image.FromStream(stream))
|
|
|
|
|
if (needAuth)
|
|
|
|
|
{
|
|
|
|
|
var width = 640;
|
|
|
|
|
var height = 480;
|
|
|
|
|
using (var bitmap = new Bitmap(width, height))
|
|
|
|
|
ipCamera.MainStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.MainSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.SubStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.Last().Token);
|
|
|
|
|
ipCamera.SubSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.Last().Token);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ipCamera.MainStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.MainSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.First().Token);
|
|
|
|
|
ipCamera.SubStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.Last().Token);
|
|
|
|
|
ipCamera.SubSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, ipCamera.Profiles.Last().Token);
|
|
|
|
|
}
|
|
|
|
|
ipCamera.ParseStreamUri();
|
|
|
|
|
ipCamera.ParseSnapshotUri();
|
|
|
|
|
device.AddorUpdateData(device.CreateData("NeedAuth", needAuth ? "是" : "否", DeviceDataType.String, "需认证"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("HasAuth", hasAuth ? "是" : "否", DeviceDataType.String, "已认证"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("DeviceUrl", ipCamera.DeviceUrl, DeviceDataType.String, "设备地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("PtzAddress", ipCamera.PTZAddress, DeviceDataType.String, "云台地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Ptz3DZoomSupport", ipCamera.Ptz3DZoomSupport ? "是" : "否", DeviceDataType.String, "缩放支持"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("MainToken", ipCamera.Profiles.First().Token, DeviceDataType.String, "主码流Token"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("SubToken", ipCamera.Profiles.Last().Token, DeviceDataType.String, "子码流Token"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("MainStreamUri", ipCamera.MainStreamUri, DeviceDataType.String, "主码流地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("MainSnapshotUri", ipCamera.MainSnapshotUri, DeviceDataType.String, "主码流截图地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("SubStreamUri", ipCamera.SubStreamUri, DeviceDataType.String, "子码流地址"));
|
|
|
|
|
device.AddorUpdateData(device.CreateData("SubSnapshotUri", ipCamera.SubSnapshotUri, DeviceDataType.String, "子码流截图地址"));
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var jpgBytes = ScreenShot(device);
|
|
|
|
|
using (var stream = new MemoryStream(jpgBytes))
|
|
|
|
|
{
|
|
|
|
|
using (Graphics g = Graphics.FromImage((Image)bitmap))
|
|
|
|
|
using (var bigImage = Image.FromStream(stream))
|
|
|
|
|
{
|
|
|
|
|
g.DrawImage(bigImage, 0, 0, width, height);
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Snapshot", Convert.ToBase64String(bitmap.ToJpeg(80)), DeviceDataType.String, "截图"));
|
|
|
|
|
var width = 640;
|
|
|
|
|
var height = 480;
|
|
|
|
|
using (var bitmap = new Bitmap(width, height))
|
|
|
|
|
{
|
|
|
|
|
using (Graphics g = Graphics.FromImage((Image)bitmap))
|
|
|
|
|
{
|
|
|
|
|
g.DrawImage(bigImage, 0, 0, width, height);
|
|
|
|
|
device.AddorUpdateData(device.CreateData("Snapshot", Convert.ToBase64String(bitmap.ToJpeg(80)), DeviceDataType.String, "截图"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
ex.PrintStack();
|
|
|
|
|
}
|
|
|
|
|
deviceRepo.SaveChanges();
|
|
|
|
|
var deviceDto = device.To<EditDeviceModel>();
|
|
|
|
|
deviceDto.ProductNumber = product.Number;
|
|
|
|
|
deviceDto.NodeNumber = node.Number;
|
|
|
|
|
this.SendToServer(Methods.EditDeviceResponse, deviceDto);
|
|
|
|
|
var dataList = new List<EditDataModel>();
|
|
|
|
|
foreach (var deviceData in device.Data.Where(o => !o.Hidden))
|
|
|
|
|
{
|
|
|
|
|
var dataDto = deviceData.To<EditDataModel>();
|
|
|
|
|
dataDto.DeviceNumber = device.Number;
|
|
|
|
|
dataList.Add(dataDto);
|
|
|
|
|
}
|
|
|
|
|
this.SendToServer(Methods.EditDataResponse, dataList);
|
|
|
|
|
}
|
|
|
|
|
deviceRepo.SaveChanges();
|
|
|
|
|
var deviceDto = device.To<EditDeviceModel>();
|
|
|
|
|
deviceDto.ProductNumber = product.Number;
|
|
|
|
|
deviceDto.NodeNumber = node.Number;
|
|
|
|
|
this.SendToServer(Methods.EditDeviceResponse, deviceDto);
|
|
|
|
|
var dataList = new List<EditDataModel>();
|
|
|
|
|
foreach (var deviceData in device.Data.Where(o => !o.Hidden))
|
|
|
|
|
{
|
|
|
|
|
var dataDto = deviceData.To<EditDataModel>();
|
|
|
|
|
dataDto.DeviceNumber = device.Number;
|
|
|
|
|
dataList.Add(dataDto);
|
|
|
|
|
}
|
|
|
|
|
this.SendToServer(Methods.EditDataResponse, dataList);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
ex.PrintStack();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|