diff --git a/Windows/CS/Framework4.0/XCamera/Test/Form1.Designer.cs b/Windows/CS/Framework4.0/XCamera/Test/Form1.Designer.cs
index 7f577ba..0d4bf9f 100644
--- a/Windows/CS/Framework4.0/XCamera/Test/Form1.Designer.cs
+++ b/Windows/CS/Framework4.0/XCamera/Test/Form1.Designer.cs
@@ -46,27 +46,31 @@ namespace Test
this.lblIpAddress = new System.Windows.Forms.Label();
this.txtIpAddress = new System.Windows.Forms.TextBox();
this.btnSetIP = new System.Windows.Forms.Button();
+ this.camera = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.LedImage)).BeginInit();
this.statusStrip1.SuspendLayout();
this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.camera)).BeginInit();
this.SuspendLayout();
//
// LedImage
//
this.LedImage.BackColor = System.Drawing.SystemColors.ControlDark;
this.LedImage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.LedImage.Location = new System.Drawing.Point(12, 12);
+ this.LedImage.Location = new System.Drawing.Point(16, 15);
+ this.LedImage.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.LedImage.Name = "LedImage";
- this.LedImage.Size = new System.Drawing.Size(557, 426);
+ this.LedImage.Size = new System.Drawing.Size(742, 532);
this.LedImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.LedImage.TabIndex = 0;
this.LedImage.TabStop = false;
//
// btnInitialize
//
- this.btnInitialize.Location = new System.Drawing.Point(608, 38);
+ this.btnInitialize.Location = new System.Drawing.Point(811, 48);
+ this.btnInitialize.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnInitialize.Name = "btnInitialize";
- this.btnInitialize.Size = new System.Drawing.Size(111, 31);
+ this.btnInitialize.Size = new System.Drawing.Size(148, 39);
this.btnInitialize.TabIndex = 1;
this.btnInitialize.Text = "1. 初始化";
this.btnInitialize.UseVisualStyleBackColor = true;
@@ -74,46 +78,21 @@ namespace Test
//
// btnSetConfigFile
//
- this.btnSetConfigFile.Location = new System.Drawing.Point(608, 89);
+ this.btnSetConfigFile.Location = new System.Drawing.Point(811, 111);
+ this.btnSetConfigFile.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnSetConfigFile.Name = "btnSetConfigFile";
- this.btnSetConfigFile.Size = new System.Drawing.Size(111, 31);
+ this.btnSetConfigFile.Size = new System.Drawing.Size(148, 39);
this.btnSetConfigFile.TabIndex = 2;
this.btnSetConfigFile.Text = "2. 设置配置文件";
this.btnSetConfigFile.UseVisualStyleBackColor = true;
this.btnSetConfigFile.Click += new System.EventHandler(this.btnSetConfigFile_Click);
//
- // lblIpAddress
- //
- this.lblIpAddress.AutoSize = true;
- this.lblIpAddress.Location = new System.Drawing.Point(608, 125);
- this.lblIpAddress.Name = "lblIpAddress";
- this.lblIpAddress.Size = new System.Drawing.Size(65, 12);
- this.lblIpAddress.TabIndex = 3;
- this.lblIpAddress.Text = "IP地址:";
- //
- // txtIpAddress
- //
- this.txtIpAddress.Location = new System.Drawing.Point(675, 122);
- this.txtIpAddress.Name = "txtIpAddress";
- this.txtIpAddress.Size = new System.Drawing.Size(100, 21);
- this.txtIpAddress.TabIndex = 4;
- this.txtIpAddress.Text = "192.168.100.10";
- //
- // btnSetIP
- //
- this.btnSetIP.Location = new System.Drawing.Point(608, 140);
- this.btnSetIP.Name = "btnSetIP";
- this.btnSetIP.Size = new System.Drawing.Size(111, 31);
- this.btnSetIP.TabIndex = 5;
- this.btnSetIP.Text = "3. 设置IP地址";
- this.btnSetIP.UseVisualStyleBackColor = true;
- this.btnSetIP.Click += new System.EventHandler(this.btnSetIP_Click);
- //
// btnStartCamera
//
- this.btnStartCamera.Location = new System.Drawing.Point(608, 177);
+ this.btnStartCamera.Location = new System.Drawing.Point(811, 221);
+ this.btnStartCamera.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnStartCamera.Name = "btnStartCamera";
- this.btnStartCamera.Size = new System.Drawing.Size(111, 31);
+ this.btnStartCamera.Size = new System.Drawing.Size(148, 39);
this.btnStartCamera.TabIndex = 6;
this.btnStartCamera.Text = "4. 启动摄像头";
this.btnStartCamera.UseVisualStyleBackColor = true;
@@ -121,9 +100,10 @@ namespace Test
//
// btnStartCapture
//
- this.btnStartCapture.Location = new System.Drawing.Point(608, 228);
+ this.btnStartCapture.Location = new System.Drawing.Point(811, 285);
+ this.btnStartCapture.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnStartCapture.Name = "btnStartCapture";
- this.btnStartCapture.Size = new System.Drawing.Size(111, 31);
+ this.btnStartCapture.Size = new System.Drawing.Size(148, 39);
this.btnStartCapture.TabIndex = 7;
this.btnStartCapture.Text = "5. 开始捕获";
this.btnStartCapture.UseVisualStyleBackColor = true;
@@ -131,9 +111,10 @@ namespace Test
//
// btnDetectLeds
//
- this.btnDetectLeds.Location = new System.Drawing.Point(608, 279);
+ this.btnDetectLeds.Location = new System.Drawing.Point(811, 349);
+ this.btnDetectLeds.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnDetectLeds.Name = "btnDetectLeds";
- this.btnDetectLeds.Size = new System.Drawing.Size(111, 31);
+ this.btnDetectLeds.Size = new System.Drawing.Size(148, 39);
this.btnDetectLeds.TabIndex = 8;
this.btnDetectLeds.Text = "6. LED识别";
this.btnDetectLeds.UseVisualStyleBackColor = true;
@@ -141,9 +122,10 @@ namespace Test
//
// btnGetLedStatuses
//
- this.btnGetLedStatuses.Location = new System.Drawing.Point(608, 330);
+ this.btnGetLedStatuses.Location = new System.Drawing.Point(811, 412);
+ this.btnGetLedStatuses.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnGetLedStatuses.Name = "btnGetLedStatuses";
- this.btnGetLedStatuses.Size = new System.Drawing.Size(111, 31);
+ this.btnGetLedStatuses.Size = new System.Drawing.Size(148, 39);
this.btnGetLedStatuses.TabIndex = 9;
this.btnGetLedStatuses.Text = "7. 状态查询";
this.btnGetLedStatuses.UseVisualStyleBackColor = true;
@@ -151,9 +133,10 @@ namespace Test
//
// btnShowRegionEditor
//
- this.btnShowRegionEditor.Location = new System.Drawing.Point(608, 381);
+ this.btnShowRegionEditor.Location = new System.Drawing.Point(811, 476);
+ this.btnShowRegionEditor.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnShowRegionEditor.Name = "btnShowRegionEditor";
- this.btnShowRegionEditor.Size = new System.Drawing.Size(111, 31);
+ this.btnShowRegionEditor.Size = new System.Drawing.Size(148, 39);
this.btnShowRegionEditor.TabIndex = 10;
this.btnShowRegionEditor.Text = "8. 区域编辑器";
this.btnShowRegionEditor.UseVisualStyleBackColor = true;
@@ -161,9 +144,10 @@ namespace Test
//
// btnShutdown
//
- this.btnShutdown.Location = new System.Drawing.Point(608, 432);
+ this.btnShutdown.Location = new System.Drawing.Point(811, 540);
+ this.btnShutdown.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnShutdown.Name = "btnShutdown";
- this.btnShutdown.Size = new System.Drawing.Size(111, 31);
+ this.btnShutdown.Size = new System.Drawing.Size(148, 39);
this.btnShutdown.TabIndex = 11;
this.btnShutdown.Text = "9. 关闭";
this.btnShutdown.UseVisualStyleBackColor = true;
@@ -171,9 +155,10 @@ namespace Test
//
// btnStopCapture
//
- this.btnStopCapture.Location = new System.Drawing.Point(725, 228);
+ this.btnStopCapture.Location = new System.Drawing.Point(967, 285);
+ this.btnStopCapture.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnStopCapture.Name = "btnStopCapture";
- this.btnStopCapture.Size = new System.Drawing.Size(63, 31);
+ this.btnStopCapture.Size = new System.Drawing.Size(84, 39);
this.btnStopCapture.TabIndex = 12;
this.btnStopCapture.Text = "停止";
this.btnStopCapture.UseVisualStyleBackColor = true;
@@ -181,9 +166,10 @@ namespace Test
//
// btnStopCamera
//
- this.btnStopCamera.Location = new System.Drawing.Point(725, 177);
+ this.btnStopCamera.Location = new System.Drawing.Point(967, 221);
+ this.btnStopCamera.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.btnStopCamera.Name = "btnStopCamera";
- this.btnStopCamera.Size = new System.Drawing.Size(63, 31);
+ this.btnStopCamera.Size = new System.Drawing.Size(84, 39);
this.btnStopCamera.TabIndex = 13;
this.btnStopCamera.Text = "停止";
this.btnStopCamera.UseVisualStyleBackColor = true;
@@ -191,26 +177,30 @@ namespace Test
//
// statusStrip1
//
+ this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lblStatus});
- this.statusStrip1.Location = new System.Drawing.Point(0, 451);
+ this.statusStrip1.Location = new System.Drawing.Point(0, 693);
this.statusStrip1.Name = "statusStrip1";
- this.statusStrip1.Size = new System.Drawing.Size(800, 22);
+ this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 19, 0);
+ this.statusStrip1.Size = new System.Drawing.Size(1067, 25);
this.statusStrip1.TabIndex = 11;
this.statusStrip1.Text = "statusStrip1";
//
// lblStatus
//
this.lblStatus.Name = "lblStatus";
- this.lblStatus.Size = new System.Drawing.Size(68, 17);
+ this.lblStatus.Size = new System.Drawing.Size(107, 20);
this.lblStatus.Text = "状态: 未初始化";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.txtLog);
- this.groupBox1.Location = new System.Drawing.Point(12, 444);
+ this.groupBox1.Location = new System.Drawing.Point(16, 555);
+ this.groupBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(557, 100);
+ this.groupBox1.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.groupBox1.Size = new System.Drawing.Size(743, 125);
this.groupBox1.TabIndex = 12;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "日志";
@@ -218,18 +208,58 @@ namespace Test
// txtLog
//
this.txtLog.Dock = System.Windows.Forms.DockStyle.Fill;
- this.txtLog.Location = new System.Drawing.Point(3, 17);
+ this.txtLog.Location = new System.Drawing.Point(4, 22);
+ this.txtLog.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.txtLog.Multiline = true;
this.txtLog.Name = "txtLog";
this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
- this.txtLog.Size = new System.Drawing.Size(551, 80);
+ this.txtLog.Size = new System.Drawing.Size(735, 99);
this.txtLog.TabIndex = 0;
//
+ // lblIpAddress
+ //
+ this.lblIpAddress.AutoSize = true;
+ this.lblIpAddress.Location = new System.Drawing.Point(811, 156);
+ this.lblIpAddress.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lblIpAddress.Name = "lblIpAddress";
+ this.lblIpAddress.Size = new System.Drawing.Size(61, 15);
+ this.lblIpAddress.TabIndex = 3;
+ this.lblIpAddress.Text = "IP地址:";
+ //
+ // txtIpAddress
+ //
+ this.txtIpAddress.Location = new System.Drawing.Point(900, 152);
+ this.txtIpAddress.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.txtIpAddress.Name = "txtIpAddress";
+ this.txtIpAddress.Size = new System.Drawing.Size(132, 25);
+ this.txtIpAddress.TabIndex = 4;
+ this.txtIpAddress.Text = "192.168.100.10";
+ //
+ // btnSetIP
+ //
+ this.btnSetIP.Location = new System.Drawing.Point(811, 175);
+ this.btnSetIP.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+ this.btnSetIP.Name = "btnSetIP";
+ this.btnSetIP.Size = new System.Drawing.Size(148, 39);
+ this.btnSetIP.TabIndex = 5;
+ this.btnSetIP.Text = "3. 设置IP地址";
+ this.btnSetIP.UseVisualStyleBackColor = true;
+ this.btnSetIP.Click += new System.EventHandler(this.btnSetIP_Click);
+ //
+ // camera
+ //
+ this.camera.Location = new System.Drawing.Point(980, 20);
+ this.camera.Name = "camera";
+ this.camera.Size = new System.Drawing.Size(52, 50);
+ this.camera.TabIndex = 14;
+ this.camera.TabStop = false;
+ //
// Form1
//
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(800, 574);
+ this.ClientSize = new System.Drawing.Size(1067, 718);
+ this.Controls.Add(this.camera);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.btnStopCamera);
@@ -246,6 +276,7 @@ namespace Test
this.Controls.Add(this.btnSetConfigFile);
this.Controls.Add(this.btnInitialize);
this.Controls.Add(this.LedImage);
+ this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "Form1";
this.Text = "XCamera LED灯识别测试程序";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
@@ -254,6 +285,7 @@ namespace Test
this.statusStrip1.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.camera)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -279,5 +311,6 @@ namespace Test
private System.Windows.Forms.Label lblIpAddress;
private System.Windows.Forms.TextBox txtIpAddress;
private System.Windows.Forms.Button btnSetIP;
+ private System.Windows.Forms.PictureBox camera;
}
}
\ No newline at end of file
diff --git a/Windows/CS/Framework4.0/XCamera/Test/Form1.cs b/Windows/CS/Framework4.0/XCamera/Test/Form1.cs
index 8eeb1a5..a92ae6b 100644
--- a/Windows/CS/Framework4.0/XCamera/Test/Form1.cs
+++ b/Windows/CS/Framework4.0/XCamera/Test/Form1.cs
@@ -186,7 +186,8 @@ namespace Test
LogMessage("正在启动摄像头...");
- if (global::XCamera.XCamera.StartCamera())
+ // 使用camera控件的窗口句柄进行预览
+ if (global::XCamera.XCamera.StartCamera(camera.Handle))
{
LogMessage("摄像头启动成功!");
}
diff --git a/Windows/CS/Framework4.0/XCamera/Test/Form1.resx b/Windows/CS/Framework4.0/XCamera/Test/Form1.resx
index 1af7de1..174ebc7 100644
--- a/Windows/CS/Framework4.0/XCamera/Test/Form1.resx
+++ b/Windows/CS/Framework4.0/XCamera/Test/Form1.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/CameraConnectionManager.cs b/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/CameraConnectionManager.cs
index bed5e32..6b53619 100644
--- a/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/CameraConnectionManager.cs
+++ b/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/CameraConnectionManager.cs
@@ -1,6 +1,7 @@
using System;
using System.Threading;
using System.Collections.Generic;
+using System.Text;
using XCamera.Models;
namespace XCamera.Core
@@ -82,8 +83,9 @@ namespace XCamera.Core
/// 初始化连接管理器
///
/// 摄像头配置
+ /// 用户句柄
/// 是否成功初始化
- public bool Initialize(CameraConfig config)
+ public bool Initialize(CameraConfig config, int userHandle = -1)
{
if (config == null)
{
@@ -99,11 +101,36 @@ namespace XCamera.Core
lock (_lockObject)
{
_config = config;
+ _userHandle = userHandle;
}
return true;
}
+ ///
+ /// 获取设备信息JSON格式
+ ///
+ private string GetDeviceInfoJson()
+ {
+ // 手动构建JSON字符串
+ StringBuilder json = new StringBuilder();
+ json.Append("{");
+ json.Append($"\"DevId\":\"{DeviceId}\",");
+ json.Append($"\"DevName\":\"Camera_{DeviceId}\",");
+ json.Append("\"DevType\":\"IPCamera\",");
+ json.Append($"\"UserName\":\"{_config.Username}\",");
+ json.Append($"\"Password\":\"{_config.Password}\",");
+ json.Append($"\"Address\":\"{_config.IpAddress ?? "192.168.100.10"}\",");
+ json.Append($"\"Port\":{_config.TcpPort},");
+ json.Append($"\"Channel\":{_config.Channel},");
+ json.Append("\"StreamType\":0,");
+ json.Append("\"Protocol\":\"TCP\",");
+ json.Append("\"Enable\":true");
+ json.Append("}");
+
+ return json.ToString();
+ }
+
///
/// 获取配置验证错误信息
///
@@ -162,14 +189,6 @@ namespace XCamera.Core
throw new Exception($"设置设备用户名密码失败,错误码: {result}");
}
- // 设备登录
- result = XCloudSdkWrapper.XCloudSDK_Device_DevLogin(_userHandle, DeviceId, 1);
-
- if (result < 0)
- {
- throw new Exception($"设备登录失败,错误码: {result}");
- }
-
lock (_lockObject)
{
_isConnected = true;
@@ -206,9 +225,6 @@ namespace XCamera.Core
StopRealPlay();
}
- // 设备登出
- XCloudSdkWrapper.XCloudSDK_Device_DevLogout(DeviceId);
-
// 删除设备信息
XCloudSdkWrapper.XCloudSDK_Device_DeleteDevsInfo(DeviceId);
@@ -249,7 +265,7 @@ namespace XCamera.Core
{
// 开始实时预览
int playHandle = XCloudSdkWrapper.XCloudSDK_Device_MediaRealPlay(
- _userHandle, DeviceId, _config.Channel, 0, hWnd, 1, "");
+ _userHandle, DeviceId, 0, 0, hWnd, 0, "");
if (playHandle < 0)
{
@@ -267,6 +283,11 @@ namespace XCamera.Core
}
catch (Exception ex)
{
+ lock (_lockObject)
+ {
+ _isPlaying = false;
+ _playHandle = -1;
+ }
OnPlayStateChanged();
throw new Exception($"开始实时预览失败: {ex.Message}", ex);
}
diff --git a/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/XCloudSdkWrapper.cs b/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/XCloudSdkWrapper.cs
index 3331e24..30ea0b0 100644
--- a/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/XCloudSdkWrapper.cs
+++ b/Windows/CS/Framework4.0/XCamera/XCamera/src/Core/XCloudSdkWrapper.cs
@@ -149,6 +149,14 @@ namespace XCamera.Core
[DllImport("XCloudSDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int XCloudSDK_Device_DeleteDevsInfo(string sDevId);
+ ///
+ /// 添加设备信息到数据中心
+ ///
+ /// 设备信息JSON格式
+ /// >=0:成功; <0:失败;
+ [DllImport("XCloudSDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
+ public static extern int XCloudSDK_Device_AddDevInfoToDC(string sDevInfo);
+
#endregion
#region 实时预览
diff --git a/Windows/CS/Framework4.0/XCamera/XCamera/src/Models/CameraConfig.cs b/Windows/CS/Framework4.0/XCamera/XCamera/src/Models/CameraConfig.cs
index 2d65ce6..3be4f19 100644
--- a/Windows/CS/Framework4.0/XCamera/XCamera/src/Models/CameraConfig.cs
+++ b/Windows/CS/Framework4.0/XCamera/XCamera/src/Models/CameraConfig.cs
@@ -8,6 +8,11 @@ namespace XCamera.Models
///
public class CameraConfig
{
+ ///
+ /// IP地址
+ ///
+ public string IpAddress { get; set; }
+
///
/// TCP端口(固定34567)
///
@@ -99,7 +104,11 @@ namespace XCamera.Models
///
public string GetDeviceId()
{
- return $"DEV_{TcpPort}_{Channel}";
+ if (!string.IsNullOrEmpty(IpAddress))
+ {
+ return $"{IpAddress}:{TcpPort}";
+ }
+ return "192.168.100.10:34567";
}
///
diff --git a/Windows/CS/Framework4.0/XCamera/XCamera/src/XCamera.cs b/Windows/CS/Framework4.0/XCamera/XCamera/src/XCamera.cs
index 6f18209..cf31822 100644
--- a/Windows/CS/Framework4.0/XCamera/XCamera/src/XCamera.cs
+++ b/Windows/CS/Framework4.0/XCamera/XCamera/src/XCamera.cs
@@ -144,10 +144,11 @@ namespace XCamera
///
/// 3. 根据配置文件内容启动摄像头
///
+ /// 预览窗口句柄(可为IntPtr.Zero)
/// 是否成功启动
- public static bool StartCamera()
+ public static bool StartCamera(IntPtr previewHandle = default(IntPtr))
{
- return Manager.StartCamera();
+ return Manager.StartCamera(previewHandle);
}
///
diff --git a/Windows/CS/Framework4.0/XCamera/XCamera/src/XCameraManager.cs b/Windows/CS/Framework4.0/XCamera/XCamera/src/XCameraManager.cs
index c851258..be274a1 100644
--- a/Windows/CS/Framework4.0/XCamera/XCamera/src/XCameraManager.cs
+++ b/Windows/CS/Framework4.0/XCamera/XCamera/src/XCameraManager.cs
@@ -26,6 +26,7 @@ namespace XCamera
private readonly object _lockObject = new object();
private int _captureInterval = 1000;
private string _cameraIpAddress = "192.168.100.10"; // 摄像头IP地址
+ private int _userHandle = -1; // 用户句柄
///
/// LED状态更新事件
@@ -148,6 +149,9 @@ namespace XCamera
throw new Exception($"注册回调函数失败,错误码: {userHandle}");
}
+ // 保存用户句柄
+ _userHandle = userHandle;
+
// 仅在提供了配置文件路径时加载配置
if (!string.IsNullOrEmpty(configFilePath))
{
@@ -223,8 +227,9 @@ namespace XCamera
///
/// 3. 根据配置文件内容启动摄像头
///
+ /// 预览窗口句柄(可为IntPtr.Zero)
/// 是否成功启动
- public bool StartCamera()
+ public bool StartCamera(IntPtr previewHandle = default(IntPtr))
{
if (!_isInitialized)
{
@@ -241,7 +246,7 @@ namespace XCamera
try
{
// 初始化连接管理器
- _connectionManager.Initialize(CurrentConfig);
+ _connectionManager.Initialize(CurrentConfig, _userHandle);
// 连接到摄像头
if (!_connectionManager.Connect())
@@ -249,8 +254,8 @@ namespace XCamera
return false;
}
- // 开始实时预览(不显示窗口)
- if (!_connectionManager.StartRealPlay(IntPtr.Zero))
+ // 开始实时预览(使用指定窗口句柄)
+ if (!_connectionManager.StartRealPlay(previewHandle))
{
_connectionManager.Disconnect();
return false;
@@ -536,6 +541,12 @@ namespace XCamera
lock (_lockObject)
{
_cameraIpAddress = ipAddress;
+
+ // 更新当前配置的IP地址
+ if (CurrentConfig != null)
+ {
+ CurrentConfig.IpAddress = ipAddress;
+ }
}
// 使用信息事件而不是错误事件
@@ -643,8 +654,44 @@ namespace XCamera
{
try
{
- var ledStatuses = DetectLeds();
- OnLedStatusUpdated(ledStatuses);
+ // 无论是否有LED区域,都捕获图像
+ string tempFile = System.IO.Path.GetTempFileName() + ".jpg";
+ try
+ {
+ if (_connectionManager.CaptureImage(tempFile))
+ {
+ // 加载图像并触发图像捕获事件
+ try
+ {
+ using (var image = System.Drawing.Image.FromFile(tempFile))
+ {
+ // 触发图像捕获事件(无LED状态)
+ OnImageCaptured((System.Drawing.Image)image.Clone(), tempFile);
+ }
+ }
+ catch (Exception imgEx)
+ {
+ OnErrorOccurred($"图像加载失败: {imgEx.Message}");
+ }
+
+ // 如果有LED区域,再进行LED检测
+ if (CurrentConfig?.LedRegions != null && CurrentConfig.LedRegions.Count > 0)
+ {
+ var ledStatuses = DetectLeds();
+ OnLedStatusUpdated(ledStatuses);
+ }
+ else
+ {
+ // 没有LED区域,只更新空状态
+ OnLedStatusUpdated(new List());
+ }
+ }
+ }
+ finally
+ {
+ // 清理临时文件
+ try { System.IO.File.Delete(tempFile); } catch { }
+ }
// 等待指定间隔
int waited = 0;
@@ -681,6 +728,8 @@ namespace XCamera
if (nParam1 < 0)
{
OnErrorOccurred($"设备登录失败,错误码: {nParam1}");
+ // 设备登录失败,断开连接
+ _connectionManager?.Disconnect();
}
}
else if (nMsgId == (int)XCloudSdkMessage.MediaStartRealPlay)
@@ -688,6 +737,8 @@ namespace XCamera
if (nParam1 < 0)
{
OnErrorOccurred($"开始实时预览失败,错误码: {nParam1}");
+ // 实时预览失败,更新连接管理器状态
+ _connectionManager?.StopRealPlay();
}
}