diff --git a/projects/IoT/IoT.Shared/DeviceServices/Onvif/IPCamera.cs b/projects/IoT/IoT.Shared/DeviceServices/Onvif/IPCamera.cs index f3d966d9..3241d60f 100644 --- a/projects/IoT/IoT.Shared/DeviceServices/Onvif/IPCamera.cs +++ b/projects/IoT/IoT.Shared/DeviceServices/Onvif/IPCamera.cs @@ -12,6 +12,7 @@ namespace IoT.Shared.DeviceServices.Onvif public string DiscoveryXml { get; set; } public string GetCapabilitiesXml { get; set; } public string DeviceUrl { get; set; } + public string Ip { get; set; } public string Id { get; set; } public string MediaUrl { get; set; } public string GetProfilesXml { get; set; } @@ -36,6 +37,7 @@ namespace IoT.Shared.DeviceServices.Onvif this.Id = doc.Descendants() .FirstOrDefault(o => o.Name.LocalName == "EndpointReference").Elements() .FirstOrDefault(o => o.Name.LocalName == "Address").Value.Replace("urn:uuid:", "").Replace("-", ""); + this.Ip = Regex.Match(this.DeviceUrl, "//([^/]*)/").Groups[1].Value; } public void ParseCapabilities() @@ -48,6 +50,10 @@ namespace IoT.Shared.DeviceServices.Onvif public void ParseProfiles() { + if (string.IsNullOrEmpty(this.GetProfilesXml)) + { + return; + } var doc = XDocument.Parse(this.GetProfilesXml); foreach (var item in doc.Descendants().Where(o => o.Name.LocalName == "Profiles")) { diff --git a/projects/IoT/IoT.Shared/DeviceServices/Onvif/OnvifService.cs b/projects/IoT/IoT.Shared/DeviceServices/Onvif/OnvifService.cs index 87b929c4..651fe0a6 100644 --- a/projects/IoT/IoT.Shared/DeviceServices/Onvif/OnvifService.cs +++ b/projects/IoT/IoT.Shared/DeviceServices/Onvif/OnvifService.cs @@ -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>(); - var productRepo = scope.ServiceProvider.GetService>(); - 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>(); + var productRepo = scope.ServiceProvider.GetService>(); + 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(); - productDto.CategoryNumber = category.Number; - this.SendToServer(Methods.EditProductResponse, productDto); - } - var deviceNodeRepo = scope.ServiceProvider.GetService>(); - 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(); + productDto.CategoryNumber = category.Number; + this.SendToServer(Methods.EditProductResponse, productDto); + } + var deviceNodeRepo = scope.ServiceProvider.GetService>(); + var node = deviceNodeRepo.ReadOnlyTable().FirstOrDefault(); - var deviceRepo = scope.ServiceProvider.GetService>(); - 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>(); + 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(); + deviceDto.ProductNumber = product.Number; + deviceDto.NodeNumber = node.Number; + this.SendToServer(Methods.EditDeviceResponse, deviceDto); + var dataList = new List(); + foreach (var deviceData in device.Data.Where(o => !o.Hidden)) + { + var dataDto = deviceData.To(); + dataDto.DeviceNumber = device.Number; + dataList.Add(dataDto); + } + this.SendToServer(Methods.EditDataResponse, dataList); } - deviceRepo.SaveChanges(); - var deviceDto = device.To(); - deviceDto.ProductNumber = product.Number; - deviceDto.NodeNumber = node.Number; - this.SendToServer(Methods.EditDeviceResponse, deviceDto); - var dataList = new List(); - foreach (var deviceData in device.Data.Where(o => !o.Hidden)) - { - var dataDto = deviceData.To(); - dataDto.DeviceNumber = device.Number; - dataList.Add(dataDto); - } - this.SendToServer(Methods.EditDataResponse, dataList); + } + catch (Exception ex) + { + ex.PrintStack(); } } } diff --git a/projects/IoT/IoTNode/Program.cs b/projects/IoT/IoTNode/Program.cs index acc9289e..361ac167 100644 --- a/projects/IoT/IoTNode/Program.cs +++ b/projects/IoT/IoTNode/Program.cs @@ -13,7 +13,7 @@ namespace IoTNode public static void Main(string[] args) { var host = "localhost"; - var stream = "localhost"; + var stream = "192.168.3.124"; WebHost.CreateDefaultBuilder(args) .Run(new List { new EFConfigurationValue { Id = "id", Value= "根据设备编号生成的授权码" }, diff --git a/projects/IoTCenter/Controllers/HomeController.cs b/projects/IoTCenter/Controllers/HomeController.cs index 58813863..ecc7ba09 100644 --- a/projects/IoTCenter/Controllers/HomeController.cs +++ b/projects/IoTCenter/Controllers/HomeController.cs @@ -110,6 +110,7 @@ namespace IoTCenter.Controllers .Include(o => o.Scenes) .Include(o => o.Devices) .ThenInclude(o => o.Data) + .Where(o => o.Number == number) .FirstOrDefault(o => o.Number == number); return Json(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); } diff --git a/projects/IoTCenter/wwwroot/node.default.html b/projects/IoTCenter/wwwroot/node.default.html index f8a8aada..65cd3b53 100644 --- a/projects/IoTCenter/wwwroot/node.default.html +++ b/projects/IoTCenter/wwwroot/node.default.html @@ -4,7 +4,7 @@