Ajoutez des fichiers projet.

This commit is contained in:
Vincent BOUQUET
2024-02-17 21:51:49 +01:00
parent dccac43ed8
commit e0ee7ca9dc
9 changed files with 560 additions and 0 deletions

61
MainForm.Designer.cs generated Normal file
View File

@@ -0,0 +1,61 @@
namespace robospot_camera_finder
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
lbMain = new ListBox();
SuspendLayout();
//
// lbMain
//
lbMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
lbMain.FormattingEnabled = true;
lbMain.ItemHeight = 15;
lbMain.Location = new Point(12, 23);
lbMain.Name = "lbMain";
lbMain.Size = new Size(776, 409);
lbMain.TabIndex = 0;
lbMain.MouseDoubleClick += lbMain_MouseDoubleClick;
//
// MainForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(lbMain);
Name = "MainForm";
Text = "RoboSpot MotionCamera finder";
FormClosing += MainForm_FormClosing;
ResumeLayout(false);
}
#endregion
private ListBox lbMain;
}
}

95
MainForm.cs Normal file
View File

@@ -0,0 +1,95 @@
using System.ComponentModel;
using System.Net;
using System.Runtime.CompilerServices;
using System.Web;
using Tmds.MDns;
namespace robospot_camera_finder
{
public partial class MainForm : Form
{
private readonly ServiceBrowser browser = new();
private BindingList<Camera> all_cameras = new();
class Camera
{
private IPAddress ip;
private string name;
public Camera(string name, IPAddress ip)
{
this.name = name;
this.ip = ip;
}
public string camera_name
{
get
{
return name;
}
}
public IPAddress camera_ip
{
get
{
return ip;
}
}
}
public MainForm()
{
InitializeComponent();
browser.StartBrowse("_rtsp._tcp");
lbMain.DataSource = all_cameras;
lbMain.DisplayMember = "camera_name";
lbMain.ValueMember = "camera_ip";
browser.ServiceAdded += (sender, args) =>
{
foreach (var cam_addr in args.Announcement.Addresses)
{
if (cam_addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
Camera camera = new Camera("Camera " + cam_addr.ToString(), cam_addr);
all_cameras.Add(camera);
}
}
};
browser.ServiceRemoved += (sender, args) =>
{
foreach (var cam_ip in args.Announcement.Addresses)
{
if (cam_ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
foreach (var camera in all_cameras)
{
if (cam_ip == camera.camera_ip)
{
all_cameras.Remove(camera);
return;
}
}
}
}
};
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
browser.StopBrowse();
}
private void lbMain_MouseDoubleClick(object sender, MouseEventArgs e)
{
Form viewer = new StreamViewer(lbMain.GetItemText(lbMain.SelectedItem), lbMain.SelectedValue.ToString());
viewer.Show();
}
}
}

60
MainForm.resx Normal file
View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

17
Program.cs Normal file
View File

@@ -0,0 +1,17 @@
namespace robospot_camera_finder
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new MainForm());
}
}
}

124
StreamViewer.Designer.cs generated Normal file
View File

@@ -0,0 +1,124 @@
using LibVLCSharp.Forms.Shared;
namespace robospot_camera_finder
{
partial class StreamViewer
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
videoView = new LibVLCSharp.WinForms.VideoView();
tbZoom = new TrackBar();
lblMinZoom = new Label();
lblMaxZoom = new Label();
timerUpdateZoom = new System.Windows.Forms.Timer(components);
((System.ComponentModel.ISupportInitialize)videoView).BeginInit();
((System.ComponentModel.ISupportInitialize)tbZoom).BeginInit();
SuspendLayout();
//
// videoView
//
videoView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
videoView.BackColor = Color.Black;
videoView.Location = new Point(12, 12);
videoView.MediaPlayer = null;
videoView.Name = "videoView";
videoView.Size = new Size(870, 495);
videoView.TabIndex = 0;
videoView.Text = "videoView";
//
// tbZoom
//
tbZoom.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
tbZoom.LargeChange = 20;
tbZoom.Location = new Point(889, 30);
tbZoom.Maximum = 9999;
tbZoom.Name = "tbZoom";
tbZoom.Orientation = Orientation.Vertical;
tbZoom.Size = new Size(45, 459);
tbZoom.SmallChange = 10;
tbZoom.TabIndex = 1;
tbZoom.TickFrequency = 300;
tbZoom.TickStyle = TickStyle.TopLeft;
tbZoom.Value = 10;
tbZoom.KeyUp += tbZoom_KeyUp;
tbZoom.MouseUp += tbZoom_MouseUp;
//
// lblMinZoom
//
lblMinZoom.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
lblMinZoom.AutoSize = true;
lblMinZoom.Location = new Point(902, 492);
lblMinZoom.Name = "lblMinZoom";
lblMinZoom.Size = new Size(19, 15);
lblMinZoom.TabIndex = 2;
lblMinZoom.Text = "1x";
//
// lblMaxZoom
//
lblMaxZoom.Anchor = AnchorStyles.Top | AnchorStyles.Right;
lblMaxZoom.AutoSize = true;
lblMaxZoom.Location = new Point(902, 12);
lblMaxZoom.Name = "lblMaxZoom";
lblMaxZoom.Size = new Size(25, 15);
lblMaxZoom.TabIndex = 3;
lblMaxZoom.Text = "32x";
//
// timerUpdateZoom
//
timerUpdateZoom.Enabled = true;
timerUpdateZoom.Interval = 10000;
timerUpdateZoom.Tick += timerUpdateZoom_Tick;
//
// StreamViewer
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(933, 519);
Controls.Add(lblMaxZoom);
Controls.Add(lblMinZoom);
Controls.Add(tbZoom);
Controls.Add(videoView);
Margin = new Padding(4, 3, 4, 3);
Name = "StreamViewer";
Text = "LibVLCSharp.WinForms";
FormClosed += StreamViewer_FormClosed;
((System.ComponentModel.ISupportInitialize)videoView).EndInit();
((System.ComponentModel.ISupportInitialize)tbZoom).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private LibVLCSharp.WinForms.VideoView videoView;
private TrackBar tbZoom;
private Label lblMinZoom;
private Label lblMaxZoom;
private System.Windows.Forms.Timer timerUpdateZoom;
}
}

95
StreamViewer.cs Normal file
View File

@@ -0,0 +1,95 @@
using LibVLCSharp.Shared;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.DirectoryServices.ActiveDirectory;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace robospot_camera_finder
{
public partial class StreamViewer : Form
{
public LibVLC _libVLC;
public MediaPlayer _mp;
string username = "admin";
string password = "RoboSpot10";
string cam_ip = "";
public StreamViewer(string name, string ip)
{
InitializeComponent();
_libVLC = new LibVLC();
_mp = new MediaPlayer(_libVLC);
cam_ip = ip;
timerUpdateZoom.Start();
updateZoomSlider();
videoView.MediaPlayer = _mp;
var media = new Media(_libVLC, new Uri("rtsp://" + ip + "/profile2/media.smp"));
media.AddOption(":network-caching=25");
_mp.Play(media);
media.Dispose();
this.Text = name;
}
private void updateZoomSlider()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + cam_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=query&action=view&Query=Zoom");
request.Credentials = new NetworkCredential(username, password);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string text;
using (var sr = new StreamReader(response.GetResponseStream())) { text = sr.ReadToEnd(); }
string[] resp_lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
string zoom_value = resp_lines[1].Substring(resp_lines[1].LastIndexOf('=') + 1);
tbZoom.Value = int.Parse(zoom_value);
}
private void sendZoomValue(string zoom_pulse)
{
// clamp values to allowed range
if (int.Parse(zoom_pulse) < 10)
{
zoom_pulse = "10";
}
if (int.Parse(zoom_pulse) > 9999)
{
zoom_pulse = "9999";
}
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + cam_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=absolute&action=control&ZoomPulse=" + zoom_pulse);
request.Credentials = new NetworkCredential(username, password);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
}
private void StreamViewer_FormClosed(object sender, FormClosedEventArgs e)
{
_mp.Stop();
_mp.Dispose();
_libVLC.Dispose();
}
private void tbZoom_KeyUp(object sender, KeyEventArgs e)
{
sendZoomValue(tbZoom.Value.ToString());
}
private void tbZoom_MouseUp(object sender, MouseEventArgs e)
{
sendZoomValue(tbZoom.Value.ToString());
}
private void timerUpdateZoom_Tick(object sender, EventArgs e)
{
updateZoomSlider();
}
}
}

63
StreamViewer.resx Normal file
View File

@@ -0,0 +1,63 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="timerUpdateZoom.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<RootNamespace>robospot_camera_finder</RootNamespace>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="LibVLCSharp" Version="3.8.2" />
<PackageReference Include="LibVLCSharp.Forms" Version="3.8.2" />
<PackageReference Include="LibVLCSharp.WinForms" Version="3.8.2" />
<PackageReference Include="Tmds.MDns" Version="0.8.0" />
<PackageReference Include="VideoLAN.LibVLC.Windows" Version="3.0.20" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33516.290
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "robospot-camera-finder", "robospot-camera-finder.csproj", "{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D68CD277-4F05-4BEC-879C-E2097CC4BEDC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {23A9FE53-49F6-4D0C-951F-CF3CA11F091C}
EndGlobalSection
EndGlobal