Former-commit-id: b020f58232ec821fe8d8fc2d7e3c23af03c0b88b
TangShanKaiPing
wanggang 6 years ago
parent fc0914de48
commit 94d86c8f29

@ -12,6 +12,7 @@ namespace IoT.Shared.DeviceServices.Onvif
public string DiscoveryXml { get; set; } public string DiscoveryXml { get; set; }
public string GetCapabilitiesXml { get; set; } public string GetCapabilitiesXml { get; set; }
public string DeviceUrl { get; set; } public string DeviceUrl { get; set; }
public string Ip { get; set; }
public string Id { get; set; } public string Id { get; set; }
public string MediaUrl { get; set; } public string MediaUrl { get; set; }
public string GetProfilesXml { get; set; } public string GetProfilesXml { get; set; }
@ -36,6 +37,7 @@ namespace IoT.Shared.DeviceServices.Onvif
this.Id = doc.Descendants() this.Id = doc.Descendants()
.FirstOrDefault(o => o.Name.LocalName == "EndpointReference").Elements() .FirstOrDefault(o => o.Name.LocalName == "EndpointReference").Elements()
.FirstOrDefault(o => o.Name.LocalName == "Address").Value.Replace("urn:uuid:", "").Replace("-", ""); .FirstOrDefault(o => o.Name.LocalName == "Address").Value.Replace("urn:uuid:", "").Replace("-", "");
this.Ip = Regex.Match(this.DeviceUrl, "//([^/]*)/").Groups[1].Value;
} }
public void ParseCapabilities() public void ParseCapabilities()
@ -48,6 +50,10 @@ namespace IoT.Shared.DeviceServices.Onvif
public void ParseProfiles() public void ParseProfiles()
{ {
if (string.IsNullOrEmpty(this.GetProfilesXml))
{
return;
}
var doc = XDocument.Parse(this.GetProfilesXml); var doc = XDocument.Parse(this.GetProfilesXml);
foreach (var item in doc.Descendants().Where(o => o.Name.LocalName == "Profiles")) foreach (var item in doc.Descendants().Where(o => o.Name.LocalName == "Profiles"))
{ {

@ -89,141 +89,157 @@ namespace IoT.Shared.DeviceServices.Onvif
continue; continue;
} }
Console.WriteLine(ipCamera.DeviceUrl); Console.WriteLine(ipCamera.DeviceUrl);
using (var scope = _applicationServices.CreateScope()) try
{ {
var productNumber = "onvifcamera"; using (var scope = _applicationServices.CreateScope())
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)
{ {
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, product = new Product
Name = "ONVIF摄像头", {
ApiJson = this.GetApiJson("/Camera/"), Number = productNumber,
CategoryId = category.Id Name = "ONVIF摄像头",
}; ApiJson = this.GetApiJson("/Camera/"),
OpenApiService.UpdateApi(product); CategoryId = category.Id
productRepo.Add(product); };
productRepo.SaveChanges(); OpenApiService.UpdateApi(product);
var productDto = product.To<EditProductModel>(); productRepo.Add(product);
productDto.CategoryNumber = category.Number; productRepo.SaveChanges();
this.SendToServer(Methods.EditProductResponse, productDto); var productDto = product.To<EditProductModel>();
} productDto.CategoryNumber = category.Number;
var deviceNodeRepo = scope.ServiceProvider.GetService<IRepository<Node>>(); this.SendToServer(Methods.EditProductResponse, productDto);
var node = deviceNodeRepo.ReadOnlyTable().FirstOrDefault(); }
var deviceNodeRepo = scope.ServiceProvider.GetService<IRepository<Node>>();
var node = deviceNodeRepo.ReadOnlyTable().FirstOrDefault();
var deviceRepo = scope.ServiceProvider.GetService<IRepository<Device>>(); var deviceRepo = scope.ServiceProvider.GetService<IRepository<Device>>();
var device = deviceRepo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == ipCamera.Id); var device = deviceRepo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == ipCamera.Id);
if (device == null) if (device == null)
{
device = new Device
{ {
Name = "摄像头", device = new Device
Number = ipCamera.Id, {
Icon = "camera", Name = "摄像头",
ProductId = product.Id, Number = ipCamera.Id,
NodeId = node.Id Ip = ipCamera.Ip,
}; Icon = "camera",
var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}"; ProductId = product.Id,
var file = Path.Combine(this._env.WebRootPath, fileName); NodeId = node.Id
device.AddorUpdateData(device.CreateData("Push", "否", DeviceDataType.String, "推流")); };
device.AddorUpdateData(device.CreateData("Record", "否", DeviceDataType.String, "录像")); var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}";
device.AddorUpdateData(device.CreateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true)); var file = Path.Combine(this._env.WebRootPath, fileName);
device.AddorUpdateData(device.CreateData("ffmpeg.args", this._configuration["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true)); device.AddorUpdateData(device.CreateData("Push", "是", DeviceDataType.String, "推流"));
device.AddorUpdateData(device.CreateData("mainrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp")); device.AddorUpdateData(device.CreateData("Record", "否", DeviceDataType.String, "录像"));
device.AddorUpdateData(device.CreateData("mainflv", $"http://{this._configuration["stream.flv"]}/live/main{ipCamera.Id}.flv", DeviceDataType.String, "主码流flv")); device.AddorUpdateData(device.CreateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true));
device.AddorUpdateData(device.CreateData("mainhls", $"http://{this._configuration["stream.hls"]}/live/main{ipCamera.Id}.m3u8", DeviceDataType.String, "主码流hls")); device.AddorUpdateData(device.CreateData("ffmpeg.args", this._configuration["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true));
device.AddorUpdateData(device.CreateData("subrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/sub{ipCamera.Id}", DeviceDataType.String, "子码流rtmp")); device.AddorUpdateData(device.CreateData("mainrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/main{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("mainflv", $"http://{this._configuration["stream.flv"]}/live/main{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.AddorUpdateData(device.CreateData("mainhls", $"http://{this._configuration["stream.hls"]}/live/main{ipCamera.Id}.m3u8", DeviceDataType.String, "主码流hls"));
device.ConnectId = this._configuration["connectId"]; device.AddorUpdateData(device.CreateData("subrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/sub{ipCamera.Id}", DeviceDataType.String, "子码流rtmp"));
deviceRepo.Add(device); 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"));
var profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl); device.ConnectId = this._configuration["connectId"];
var needAuth = false; deviceRepo.Add(device);
var hasAuth = false; deviceRepo.SaveChanges();
if (profiles == "") }
{ var profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl);
needAuth = true; var needAuth = false;
device.UserName = device.UserName ?? this._configuration["camera.usr"]; var hasAuth = false;
device.Password = device.Password ?? this._configuration["camera.pwd"];
profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password);
if (profiles == "") 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 else
{ {
hasAuth = true;
ipCamera.GetProfilesXml = profiles; ipCamera.GetProfilesXml = profiles;
} }
} ipCamera.ParseProfiles();
else
{
ipCamera.GetProfilesXml = profiles;
}
ipCamera.ParseProfiles();
if (needAuth) 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))
{ {
var width = 640; ipCamera.MainStreamUriXml = this._onvifDeviceManagement.GetStreamUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
var height = 480; ipCamera.MainSnapshotUriXml = this._onvifDeviceManagement.GetSnapshotUri(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password, ipCamera.Profiles.First().Token);
using (var bitmap = new Bitmap(width, height)) 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); var width = 640;
device.AddorUpdateData(device.CreateData("Snapshot", Convert.ToBase64String(bitmap.ToJpeg(80)), DeviceDataType.String, "截图")); 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>(); catch (Exception ex)
deviceDto.ProductNumber = product.Number; {
deviceDto.NodeNumber = node.Number; ex.PrintStack();
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);
} }
} }
} }

@ -13,7 +13,7 @@ namespace IoTNode
public static void Main(string[] args) public static void Main(string[] args)
{ {
var host = "localhost"; var host = "localhost";
var stream = "localhost"; var stream = "192.168.3.124";
WebHost.CreateDefaultBuilder(args) WebHost.CreateDefaultBuilder(args)
.Run<Startup>(new List<EFConfigurationValue> { .Run<Startup>(new List<EFConfigurationValue> {
new EFConfigurationValue { Id = "id", Value= "根据设备编号生成的授权码" }, new EFConfigurationValue { Id = "id", Value= "根据设备编号生成的授权码" },

@ -110,6 +110,7 @@ namespace IoTCenter.Controllers
.Include(o => o.Scenes) .Include(o => o.Scenes)
.Include(o => o.Devices) .Include(o => o.Devices)
.ThenInclude(o => o.Data) .ThenInclude(o => o.Data)
.Where(o => o.Number == number)
.FirstOrDefault(o => o.Number == number); .FirstOrDefault(o => o.Number == number);
return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
} }

@ -4,7 +4,7 @@
<div class="row" v-if="ViewModel"> <div class="row" v-if="ViewModel">
<div class="col-md-6"> <div class="col-md-6">
<select class="form-control" id="camera" @change="CameraSelected"> <select class="form-control" id="camera" @change="CameraSelected">
<option v-for="c in GetCameras()" :value="c.Number">{{c.Name}}</option> <option v-for="c in GetCameras()" :value="c.Number">{{c.DisplayName||c.Name}}</option>
</select> </select>
<div style="width:100%;height:265px;margin:0;padding:0;background:#000;"> <div style="width:100%;height:265px;margin:0;padding:0;background:#000;">
<video id="flvPlayer" class="video" muted controls autoplay style="width:100%;max-width:100%;height:100%;"></video> <video id="flvPlayer" class="video" muted controls autoplay style="width:100%;max-width:100%;height:100%;"></video>

Loading…
Cancel
Save