Former-commit-id: 047dc5700d8eb39c12b074d91f4587fee2f2c949
TangShanKaiPing
wanggang 6 years ago
parent 8eb761500a
commit 6a2bd07b0e

@ -42,9 +42,6 @@ namespace Application.Domain.Entities
[Display(Name = "密码")] [Display(Name = "密码")]
public string Password { get; set; } public string Password { get; set; }
[Display(Name = "启用")]
public bool Enable { get; set; }
[Display(Name = "中转")] [Display(Name = "中转")]
public bool IsTransfer { get; set; } public bool IsTransfer { get; set; }

@ -37,9 +37,6 @@ namespace Application.Models
[Display(Name = "密码")] [Display(Name = "密码")]
public string Password { get; set; } public string Password { get; set; }
[Display(Name = "启用")]
public bool Enable { get; set; }
[Display(Name = "编号")] [Display(Name = "编号")]
[Required(ErrorMessage = nameof(RequiredAttribute))] [Required(ErrorMessage = nameof(RequiredAttribute))]
public string Number { get; set; } public string Number { get; set; }

@ -96,5 +96,23 @@ namespace IoT.Shared.Controllers.Onvif
this._deviceService.Stop(number); this._deviceService.Stop(number);
}); });
} }
[HttpGet, Route("/[controller]/[action]"), SwaggerOperation("")]
public ApiResponse StartPush([SwaggerParameter("网关编号")]string gateway, [SwaggerParameter("设备编号")]string number)
{
return this.AsyncAction(() =>
{
this._deviceService.StartPush(number);
});
}
[HttpGet, Route("/[controller]/[action]"), SwaggerOperation("")]
public ApiResponse StopPush([SwaggerParameter("网关编号")]string gateway, [SwaggerParameter("设备编号")]string number)
{
return this.AsyncAction(() =>
{
this._deviceService.StopPush(number);
});
}
} }
} }

@ -160,7 +160,6 @@ namespace IoT.Shared.DeviceServices.FBee
{ {
Number = sn, Number = sn,
Name = "网关", Name = "网关",
Enable = true,
Icon = "gateway", Icon = "gateway",
CategoryNumber = "0", CategoryNumber = "0",
InfoNumber = deviceInfoNumber, InfoNumber = deviceInfoNumber,
@ -178,42 +177,28 @@ namespace IoT.Shared.DeviceServices.FBee
var gateways = deviceRepo.ReadOnlyTable().Where(o => o.Info.DeviceType == DeviceType.Gateway).ToList(); var gateways = deviceRepo.ReadOnlyTable().Where(o => o.Info.DeviceType == DeviceType.Gateway).ToList();
foreach (var gateway in gateways) foreach (var gateway in gateways)
{ {
if (gateway.Enable) if (Clients.Any(o => o.Key == gateway.Number))
{ {
if (Clients.Any(o => o.Key == gateway.Number)) Clients.TryGetValue(gateway.Number, out TcpClientWrapper client);
if (client.Ip != gateway.Ip)
{ {
Clients.TryGetValue(gateway.Number, out TcpClientWrapper client); this.Connect(client);
if (client.Ip != gateway.Ip)
{
this.Connect(client);
}
else
{
if (!client.Client.Connected)
{
this.Connect(client);
}
}
} }
else else
{ {
var client = new TcpClientWrapper { Sn = gateway.Number, Ip = gateway.Ip, Client = new TcpClient() }; if (!client.Client.Connected)
Clients.TryAdd(gateway.Number, client); {
this.Connect(client); this.Connect(client);
}
} }
this.X81(gateway.Number);
} }
else else
{ {
if (Clients.Any(o => o.Key == gateway.Number)) var client = new TcpClientWrapper { Sn = gateway.Number, Ip = gateway.Ip, Client = new TcpClient() };
{ Clients.TryAdd(gateway.Number, client);
Clients.TryRemove(gateway.Number, out TcpClientWrapper client); this.Connect(client);
if (client.Client.Connected)
{
client.Client.Close();
}
}
} }
this.X81(gateway.Number);
} }
} }
} }

@ -1,7 +1,6 @@
using Application.Domain.Entities; using Application.Domain.Entities;
using Infrastructure.Data; using Infrastructure.Data;
using Infrastructure.Extensions; using Infrastructure.Extensions;
using Infrastructure.Models;
using IoT.Shared.Infrastructure; using IoT.Shared.Infrastructure;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -124,6 +123,8 @@ namespace IoT.Shared.DeviceServices.Onvif
}; };
var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}"; var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}";
var file = Path.Combine(this._env.WebRootPath, fileName); var file = Path.Combine(this._env.WebRootPath, fileName);
device.AddorUpdateData("Push", "否", DeviceDataType.String, "推流");
device.AddorUpdateData("Record", "否", DeviceDataType.String, "录像");
device.AddorUpdateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true); device.AddorUpdateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true);
device.AddorUpdateData("ffmpeg.args", this._configuration["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true); device.AddorUpdateData("ffmpeg.args", this._configuration["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true);
device.AddorUpdateData("mainrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp"); device.AddorUpdateData("mainrtmp", $"rtmp://{this._configuration["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp");
@ -221,12 +222,12 @@ namespace IoT.Shared.DeviceServices.Onvif
using (var scope = _applicationServices.CreateScope()) using (var scope = _applicationServices.CreateScope())
{ {
var repo = scope.ServiceProvider.GetService<IRepository<Device>>(); var repo = scope.ServiceProvider.GetService<IRepository<Device>>();
var cameras = repo.ReadOnlyTable().Include(o => o.Data).Where(o => o.Enable).ToList(); var cameras = repo.ReadOnlyTable().Include(o => o.Data).Where(o => o.Name == "摄像头").ToList();
foreach (var key in this._list.Keys) foreach (var key in this._list.Keys)
{ {
var camera = cameras.FirstOrDefault(o => o.Number == key); var camera = cameras.FirstOrDefault(o => o.Number == key);
var remove = false; var remove = false;
if (!camera.Enable) if (camera.Data.FirstOrDefault(o => o.Key == "Push").Value != "是")
{ {
remove = true; remove = true;
} }
@ -243,7 +244,7 @@ namespace IoT.Shared.DeviceServices.Onvif
{ {
try try
{ {
if (camera.Enable) if (camera.Data.FirstOrDefault(o => o.Key == "Push").Value == "是")
{ {
if (camera.Data.FirstOrDefault(o => o.Key == "NeedAuth").Value == "否" || camera.Data.FirstOrDefault(o => o.Key == "HasAuth").Value == "是") if (camera.Data.FirstOrDefault(o => o.Key == "NeedAuth").Value == "否" || camera.Data.FirstOrDefault(o => o.Key == "HasAuth").Value == "是")
{ {
@ -280,7 +281,7 @@ namespace IoT.Shared.DeviceServices.Onvif
{ {
var repo = scope.ServiceProvider.GetService<IRepository<Device>>(); var repo = scope.ServiceProvider.GetService<IRepository<Device>>();
var camera = repo.ReadOnlyTable().Include(o => o.Data).FirstOrDefault(o => o.Number == key); var camera = repo.ReadOnlyTable().Include(o => o.Data).FirstOrDefault(o => o.Number == key);
if (camera != null && camera.Enable)// && camera.Publish && (!camera.NeedAuth || (camera.NeedAuth && camera.HasAuth))) if (camera != null && camera.Data.FirstOrDefault(o => o.Key == "Push").Value == "是")// && camera.Publish && (!camera.NeedAuth || (camera.NeedAuth && camera.HasAuth)))
{ {
if (camera.Data.FirstOrDefault(o => o.Key == "NeedAuth").Value == "否" || camera.Data.FirstOrDefault(o => o.Key == "HasAuth").Value == "是") if (camera.Data.FirstOrDefault(o => o.Key == "NeedAuth").Value == "否" || camera.Data.FirstOrDefault(o => o.Key == "HasAuth").Value == "是")
{ {
@ -377,7 +378,7 @@ namespace IoT.Shared.DeviceServices.Onvif
{ {
if (!string.IsNullOrEmpty(e.Data)) if (!string.IsNullOrEmpty(e.Data))
{ {
//Console.WriteLine(e.Data); Console.WriteLine(e.Data);
if (e.Data.IndexOf("forcing output") > -1) if (e.Data.IndexOf("forcing output") > -1)
{ {
process.Kill(); process.Kill();
@ -538,6 +539,28 @@ namespace IoT.Shared.DeviceServices.Onvif
return hc.GetByteDigest(url, camera.UserName, camera.Password); return hc.GetByteDigest(url, camera.UserName, camera.Password);
} }
public void StartPush(string number)
{
using (var scope = _applicationServices.CreateScope())
{
var repo = scope.ServiceProvider.GetService<IRepository<Device>>();
var device = repo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == number);
var data = device.Data.FirstOrDefault(o => o.Key == "Push");
data.Value = "是";
}
}
public void StopPush(string number)
{
using (var scope = _applicationServices.CreateScope())
{
var repo = scope.ServiceProvider.GetService<IRepository<Device>>();
var device = repo.Table().Include(o => o.Data).FirstOrDefault(o => o.Number == number);
var data = device.Data.FirstOrDefault(o => o.Key == "Push");
data.Value = "否";
}
}
private byte[] ScreenShot(Device camera) private byte[] ScreenShot(Device camera)
{ {
var url = camera.GetDataValue("SubSnapshotUri"); var url = camera.GetDataValue("SubSnapshotUri");

@ -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 = "49.4.92.112"; var stream = "localhost";
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= "根据设备编号生成的授权码" },
@ -42,8 +42,8 @@ namespace IoTNode
new EFConfigurationValue { Id = "camera.usr", Value="admin"}, new EFConfigurationValue { Id = "camera.usr", Value="admin"},
new EFConfigurationValue { Id = "camera.pwd", Value="dsideal123"}, new EFConfigurationValue { Id = "camera.pwd", Value="dsideal123"},
new EFConfigurationValue { Id = "stream.rtmp", Value=stream}, new EFConfigurationValue { Id = "stream.rtmp", Value=stream},
new EFConfigurationValue { Id = "stream.flv", Value=$"{stream}:8080"}, new EFConfigurationValue { Id = "stream.flv", Value=$"{stream}/live"},
new EFConfigurationValue { Id = "stream.hls", Value=$"{stream}:8080"}, new EFConfigurationValue { Id = "stream.hls", Value=$"{stream}/live"},
new EFConfigurationValue { Id = "ffmpeg.args", Value=" -y -threads {0} -rtsp_transport tcp -use_wallclock_as_timestamps 1 -stimeout 3000000 -i \"{1}\" -fflags +genpts -c copy -f flv \"{2}\""}, new EFConfigurationValue { Id = "ffmpeg.args", Value=" -y -threads {0} -rtsp_transport tcp -use_wallclock_as_timestamps 1 -stimeout 3000000 -i \"{1}\" -fflags +genpts -c copy -f flv \"{2}\""},
// //
new EFConfigurationValue { Id = "name", Value= "物联网节点"}, new EFConfigurationValue { Id = "name", Value= "物联网节点"},

@ -27,7 +27,7 @@ namespace IoTNode
services.AddSingleton<ClientService>(); services.AddSingleton<ClientService>();
//services.AddSingleton<SerialPortService>(); //services.AddSingleton<SerialPortService>();
services.AddSingleton<OnvifService>(); services.AddSingleton<OnvifService>();
services.AddSingleton<FBeeService>(); //services.AddSingleton<FBeeService>();
base.ConfigureServices(services); base.ConfigureServices(services);
} }
@ -39,7 +39,7 @@ namespace IoTNode
app.ApplicationServices.GetService<ClientService>().Start(); app.ApplicationServices.GetService<ClientService>().Start();
app.ApplicationServices.GetService<SerialPortService>()?.Start(); app.ApplicationServices.GetService<SerialPortService>()?.Start();
app.ApplicationServices.GetService<OnvifService>()?.Start(); app.ApplicationServices.GetService<OnvifService>()?.Start();
app.ApplicationServices.GetService<FBeeService>()?.Start(); //app.ApplicationServices.GetService<FBeeService>()?.Start();
}); });
} }

@ -13,6 +13,7 @@ using Microsoft.Extensions.Configuration;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using Vibrant.InfluxDB.Client; using Vibrant.InfluxDB.Client;
using Vibrant.InfluxDB.Client.Rows; using Vibrant.InfluxDB.Client.Rows;
@ -164,5 +165,17 @@ namespace IoTCenter.Controllers
} }
return Json(list); return Json(list);
} }
//{"action":"on_dvr","client_id":128,"ip":"127.0.0.1","vhost":"__defaultVhost__","app":"live","stream":"mainb57e867ae29d11b483864cbd8fd0f747","param":"","cwd":"/root/publish/apps/srs","file":"./objs/nginx/html/live/mainb57e867ae29d11b483864cbd8fd0f747.1565084670048.flv"}
public IActionResult OnDvr()
{
using (var reader = new StreamReader(Request.Body))
{
var body = reader.ReadToEnd();
// Do something
}
return Content(string.Empty);
}
} }
} }

@ -26,7 +26,7 @@ http {
listen 80; listen 80;
server_name localhost; server_name localhost;
location ^~ /srs/ { location ^~ /live/ {
proxy_pass http://localhost:8080/; proxy_pass http://localhost:8080/;
} }

Loading…
Cancel
Save