using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Windows.Forms; using ErrorEventArgs = XCamera.Models.ErrorEventArgs; using InfoEventArgs = XCamera.Models.InfoEventArgs; using XCamera.Models; namespace Test { public partial class Form1 : Form { private bool _isInitialized = false; private bool _isConnected = false; private bool _isCapturing = false; private string _cameraIpAddress = "192.168.100.10"; // 默认IP地址 public Form1() { InitializeComponent(); // 检查是否处于设计模式 if (!DesignMode) { InitializeEvents(); } UpdateUI(); } /// /// 初始化事件处理 /// private void InitializeEvents() { // 避免在设计模式下订阅事件 if (DesignMode) return; // 订阅XCamera事件 global::XCamera.XCamera.LedStatusUpdated += OnLedStatusUpdated; global::XCamera.XCamera.ConnectionStateChanged += OnConnectionStateChanged; global::XCamera.XCamera.CaptureStateChanged += OnCaptureStateChanged; global::XCamera.XCamera.ErrorOccurred += OnErrorOccurred; global::XCamera.XCamera.InfoOccurred += OnInfoOccurred; global::XCamera.XCamera.ImageCaptured += OnImageCaptured; } /// /// 1. 初始化 /// private void btnInitialize_Click(object sender, EventArgs e) { try { LogMessage("正在初始化SDK..."); // 初始化SDK(不加载配置文件) if (global::XCamera.XCamera.Initialize()) { _isInitialized = true; LogMessage("SDK初始化成功!"); LogMessage("现在可以设置配置文件或启动摄像头"); } else { LogMessage("SDK初始化失败!"); } } catch (Exception ex) { LogMessage($"初始化错误: {ex.Message}"); } UpdateUI(); } /// /// 2. 设置配置文件路径 /// private void btnSetConfigFile_Click(object sender, EventArgs e) { try { using (FolderBrowserDialog folderDialog = new FolderBrowserDialog()) { // 设置默认路径为程序目录下的config文件夹 string defaultConfigPath = Path.Combine(Application.StartupPath, "config"); if (Directory.Exists(defaultConfigPath)) { folderDialog.SelectedPath = defaultConfigPath; } else { folderDialog.SelectedPath = Application.StartupPath; } folderDialog.Description = "选择配置目录"; folderDialog.ShowNewFolderButton = false; if (folderDialog.ShowDialog() == DialogResult.OK) { LogMessage($"正在设置配置目录: {folderDialog.SelectedPath}"); if (global::XCamera.XCamera.SetConfigPath(folderDialog.SelectedPath)) { LogMessage("配置目录设置成功!"); // 显示配置信息 var config = global::XCamera.XCamera.GetCurrentConfig(); if (config != null) { LogMessage($"LED区域数: {config.LedRegions.Count}"); LogMessage($"TCP端口: {config.TcpPort}"); LogMessage($"用户名: {config.Username}"); LogMessage($"通道: {config.Channel}"); } } else { LogMessage("配置目录设置失败!"); } } } } catch (Exception ex) { LogMessage($"配置目录设置错误: {ex.Message}"); } } /// /// 3. 设置IP地址 /// private void btnSetIP_Click(object sender, EventArgs e) { try { if (!_isInitialized) { LogMessage("请先初始化!"); return; } string ipAddress = txtIpAddress.Text.Trim(); if (string.IsNullOrEmpty(ipAddress)) { LogMessage("IP地址不能为空!"); return; } if (global::XCamera.XCamera.SetIP(ipAddress)) { _cameraIpAddress = ipAddress; LogMessage($"IP地址设置成功: {ipAddress}"); } else { LogMessage($"IP地址设置失败: {ipAddress}"); } } catch (Exception ex) { LogMessage($"设置IP地址错误: {ex.Message}"); } } /// /// 5. 启动摄像头 /// private void btnStartCamera_Click(object sender, EventArgs e) { try { if (!_isInitialized) { LogMessage("请先初始化!"); return; } LogMessage("正在启动摄像头..."); // 使用camera控件的窗口句柄进行预览 if (global::XCamera.XCamera.StartCamera(camera.Handle)) { LogMessage("摄像头启动成功!"); } else { LogMessage("摄像头启动失败!"); } } catch (Exception ex) { LogMessage($"启动摄像头错误: {ex.Message}"); } UpdateUI(); } /// /// 6. 开始捕获图像 /// private void btnStartCapture_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("请先连接摄像头!"); return; } if (_isCapturing) { LogMessage("已经在捕获中!"); return; } LogMessage("正在开始捕获图像..."); if (global::XCamera.XCamera.StartCapture(1000)) // 1秒间隔 { LogMessage("开始捕获图像成功!"); } else { LogMessage("开始捕获图像失败!"); } } catch (Exception ex) { LogMessage($"开始捕获错误: {ex.Message}"); } UpdateUI(); } /// /// 7. LED灯识别 /// private void btnDetectLeds_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("请先连接摄像头!"); return; } LogMessage("正在识别LED灯..."); var statuses = global::XCamera.XCamera.DetectLeds(); LogMessage($"检测到 {statuses.Count} 个LED灯:"); foreach (var status in statuses) { LogMessage($" {status.GetStatusDescription()}"); } // 显示图像(如果有的话) DisplayLedImage(statuses); } catch (Exception ex) { LogMessage($"LED识别错误: {ex.Message}"); } } /// /// 8. 状态查询 /// private void btnGetLedStatuses_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("请先连接摄像头!"); return; } LogMessage("正在查询LED状态..."); var statuses = global::XCamera.XCamera.GetLedStatuses(); LogMessage($"当前LED状态 ({statuses.Count} 个):"); foreach (var status in statuses) { LogMessage($" {status.GetStatusDescription()}"); } // 显示图像 DisplayLedImage(statuses); } catch (Exception ex) { LogMessage($"状态查询错误: {ex.Message}"); } } /// /// 9. 区域编辑器 /// private void btnShowRegionEditor_Click(object sender, EventArgs e) { try { LogMessage("正在打开区域编辑器..."); global::XCamera.XCamera.ShowRegionEditor(); LogMessage("区域编辑器已关闭"); } catch (Exception ex) { LogMessage($"区域编辑器错误: {ex.Message}"); } } /// /// 9. 关闭 /// private void btnShutdown_Click(object sender, EventArgs e) { try { LogMessage("正在关闭..."); // 停止捕获 if (_isCapturing) { global::XCamera.XCamera.StopCapture(); LogMessage("捕获已停止"); } // 停止摄像头 if (_isConnected) { global::XCamera.XCamera.StopCamera(); LogMessage("摄像头已停止"); } // 关闭SDK if (_isInitialized) { global::XCamera.XCamera.Shutdown(); LogMessage("SDK已关闭"); } LogMessage("关闭完成!"); } catch (Exception ex) { LogMessage($"关闭错误: {ex.Message}"); } // 重置状态 _isInitialized = false; _isConnected = false; _isCapturing = false; UpdateUI(); } /// /// 停止捕获 /// private void btnStopCapture_Click(object sender, EventArgs e) { try { if (!_isCapturing) { LogMessage("当前未在捕获状态!"); return; } LogMessage("正在停止捕获..."); global::XCamera.XCamera.StopCapture(); LogMessage("停止捕获成功!"); } catch (Exception ex) { LogMessage($"停止捕获错误: {ex.Message}"); } UpdateUI(); } /// /// 停止摄像头 /// private void btnStopCamera_Click(object sender, EventArgs e) { try { if (!_isConnected) { LogMessage("当前未连接摄像头!"); return; } LogMessage("正在停止摄像头..."); global::XCamera.XCamera.StopCamera(); LogMessage("停止摄像头成功!"); } catch (Exception ex) { LogMessage($"停止摄像头错误: {ex.Message}"); } UpdateUI(); } /// /// LED状态更新事件处理 /// private void OnLedStatusUpdated(object sender, LedStatusEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnLedStatusUpdated), sender, e); return; } // 更新状态 _isConnected = global::XCamera.XCamera.IsConnected; _isCapturing = global::XCamera.XCamera.IsCapturing; UpdateUI(); // 显示LED状态 if (e.Statuses.Count > 0) { LogMessage($"LED状态更新 ({e.Statuses.Count} 个):"); foreach (var status in e.Statuses) { LogMessage($" {status.GetStatusDescription()}"); } // 显示图像 DisplayLedImage(e.Statuses); } } /// /// 连接状态变更事件处理 /// private void OnConnectionStateChanged(object sender, ConnectionStateEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnConnectionStateChanged), sender, e); return; } _isConnected = e.IsConnected; UpdateUI(); if (e.IsConnected) { LogMessage("摄像头已连接"); } else { LogMessage("摄像头已断开"); } } /// /// 捕获状态变更事件处理 /// private void OnCaptureStateChanged(object sender, CaptureStateEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnCaptureStateChanged), sender, e); return; } _isCapturing = e.IsCapturing; UpdateUI(); if (e.IsCapturing) { LogMessage("开始捕获图像"); } else { LogMessage("停止捕获图像"); } } /// /// 错误事件处理 /// private void OnErrorOccurred(object sender, ErrorEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnErrorOccurred), sender, e); return; } LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] 错误: {e.ErrorMessage}"); } /// /// 信息事件处理 /// private void OnInfoOccurred(object sender, InfoEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnInfoOccurred), sender, e); return; } LogMessage($"[{DateTime.Now:HH:mm:ss.fff}] {e.InfoMessage}"); } /// /// 图像捕获事件处理 /// private void OnImageCaptured(object sender, ImageCapturedEventArgs e) { if (InvokeRequired) { BeginInvoke(new Action(OnImageCaptured), sender, e); return; } try { // 显示捕获的图像 if (e.Image != null) { // 清理之前的图像 if (LedImage.Image != null) { var oldImage = LedImage.Image; LedImage.Image = null; oldImage.Dispose(); } // 如果LED状态为空,直接显示原图 if (e.LedStatuses == null || e.LedStatuses.Count == 0) { LedImage.Image = (System.Drawing.Image)e.Image.Clone(); } else { // 创建带LED区域标注的图像 var annotatedImage = CreateAnnotatedImage(e.Image, e.LedStatuses); LedImage.Image = annotatedImage; } // 调整显示模式 LedImage.SizeMode = PictureBoxSizeMode.Zoom; } } catch (Exception ex) { LogMessage($"显示图像失败: {ex.Message}"); } } /// /// 创建带LED区域标注的图像 /// private System.Drawing.Image CreateAnnotatedImage(System.Drawing.Image originalImage, List ledStatuses) { // 创建位图副本 var bitmap = new Bitmap(originalImage.Width, originalImage.Height); using (var g = Graphics.FromImage(bitmap)) { // 绘制原始图像 g.DrawImage(originalImage, 0, 0, originalImage.Width, originalImage.Height); // 绘制LED状态信息 for (int i = 0; i < ledStatuses.Count; i++) { var status = ledStatuses[i]; // 根据状态设置颜色 Color ledColor = GetLedColor(status); // 计算LED显示位置 int ledSize = 40; int spacing = 60; int startX = 20; int startY = 20; int x = startX + (i % 5) * spacing; int y = startY + (i / 5) * spacing; // 绘制LED圆形 Rectangle ledRect = new Rectangle(x, y, ledSize, ledSize); using (var ledBrush = new SolidBrush(ledColor)) { g.FillEllipse(ledBrush, ledRect); } // 绘制LED边框 using (var borderPen = new Pen(Color.Black, 2)) { g.DrawEllipse(borderPen, ledRect); } // 绘制标签 using (var font = new Font("Arial", 8)) using (var textBrush = new SolidBrush(Color.White)) { string label = status.RegionName; g.DrawString(label, font, textBrush, x, y + ledSize + 2); string stateText = status.State.ToString(); if (status.IsBlinking) stateText = "Blinking"; g.DrawString(stateText, font, textBrush, x, y + ledSize + 15); } } } return bitmap; } /// /// 显示LED图像 /// private void DisplayLedImage(List statuses) { // 这里可以添加显示LED图像的逻辑 // 例如:在PictureBox中绘制LED状态的可视化表示 if (statuses.Count > 0) { // 创建简单的可视化表示 Bitmap bitmap = new Bitmap(LedImage.Width, LedImage.Height); using (Graphics g = Graphics.FromImage(bitmap)) { g.Clear(Color.Black); int ledCount = statuses.Count; int ledWidth = LedImage.Width / Math.Max(ledCount, 1); int ledHeight = LedImage.Height / 2; for (int i = 0; i < statuses.Count; i++) { var status = statuses[i]; Rectangle ledRect = new Rectangle(i * ledWidth + 10, LedImage.Height / 4, ledWidth - 20, ledHeight); // 根据状态设置颜色 Color ledColor = GetLedColor(status); using (Brush brush = new SolidBrush(ledColor)) { g.FillEllipse(brush, ledRect); } // 绘制标签 using (Font font = new Font("Arial", 8)) using (Brush textBrush = new SolidBrush(Color.White)) { string label = $"{status.RegionName}\n{status.State}"; g.DrawString(label, font, textBrush, ledRect.X, ledRect.Bottom + 5); } } } LedImage.Image = bitmap; } } /// /// 获取LED颜色 /// private Color GetLedColor(LedStatus status) { if (status.State == LedState.Off) return Color.Gray; switch (status.DetectedColor) { case LedColor.Red: return status.IsBlinking ? Color.Pink : Color.Red; case LedColor.Yellow: return status.IsBlinking ? Color.LightYellow : Color.Yellow; case LedColor.Blue: return status.IsBlinking ? Color.LightBlue : Color.Blue; case LedColor.Green: return status.IsBlinking ? Color.LightGreen : Color.Green; default: return Color.DarkGray; } } /// /// 更新UI状态 /// private void UpdateUI() { btnInitialize.Enabled = !_isInitialized; btnSetConfigFile.Enabled = _isInitialized; btnStartCamera.Enabled = _isInitialized && !_isConnected; btnStopCamera.Enabled = _isConnected; btnStartCapture.Enabled = _isConnected && !_isCapturing; btnStopCapture.Enabled = _isCapturing; btnDetectLeds.Enabled = _isConnected; btnGetLedStatuses.Enabled = _isConnected; btnShowRegionEditor.Enabled = _isInitialized; btnShutdown.Enabled = _isInitialized; // 更新状态标签 if (_isCapturing) lblStatus.Text = "状态: 正在捕获"; else if (_isConnected) lblStatus.Text = "状态: 已连接"; else if (_isInitialized) lblStatus.Text = "状态: 已初始化"; else lblStatus.Text = "状态: 未初始化"; // ToolStripStatusLabel没有ForeColor属性,我们可以使用BackColor或者保持默认样式 // 如果需要颜色变化,可以考虑使用BackColor // lblStatus.BackColor = _isConnected ? Color.LightGreen : Color.LightPink; } /// /// 窗体关闭事件 /// private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { // 确保在关闭时清理资源 if (_isCapturing) { global::XCamera.XCamera.StopCapture(); } if (_isConnected) { global::XCamera.XCamera.StopCamera(); } if (_isInitialized) { global::XCamera.XCamera.Shutdown(); } } catch (Exception ex) { // 忽略关闭时的错误 System.Diagnostics.Debug.WriteLine($"关闭错误: {ex.Message}"); } } /// /// 日志消息 /// private void LogMessage(string message) { if (InvokeRequired) { BeginInvoke(new Action(LogMessage), message); return; } string timestamp = DateTime.Now.ToString("HH:mm:ss.fff"); txtLog.AppendText($"[{timestamp}] {message}" + Environment.NewLine); txtLog.ScrollToCaret(); } /// /// 10. ONVIF抓图测试 /// private void btnTestOnvifSnapshot_Click(object sender, EventArgs e) { try { LogMessage("正在测试ONVIF抓图..."); var imageStream = GetSnapshot(); if (imageStream != null) { // 显示捕获的图像 using (var image = System.Drawing.Image.FromStream(imageStream)) { // 清理之前的图像 if (LedImage.Image != null) { var oldImage = LedImage.Image; LedImage.Image = null; oldImage.Dispose(); } LedImage.Image = (System.Drawing.Image)image.Clone(); LedImage.SizeMode = PictureBoxSizeMode.Zoom; LogMessage("ONVIF抓图成功!"); } } else { LogMessage("ONVIF抓图失败: 无法获取图像流"); } } catch (Exception ex) { LogMessage($"ONVIF抓图错误: {ex.Message}"); } } /// /// 使用ONVIF协议获取快照 /// public System.IO.Stream GetSnapshot() { var request = (HttpWebRequest)WebRequest.Create("http://192.168.100.10:8899/cgi-bin/snapshot.cgi"); request.Method = "POST"; request.ContentType = "application/json"; request.Timeout = 10000; // 10秒超时 request.ReadWriteTimeout = 10000; // 添加认证信息 string username = "admin"; string password = ""; string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")); request.Headers["Authorization"] = $"Basic {credentials}"; // 发送JSON格式的POST数据 string postData = "{\"action\": \"snapshot\"}"; byte[] data = Encoding.UTF8.GetBytes(postData); request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } // 发送请求 var response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { // 检查响应内容类型 string contentType = response.ContentType; if (contentType.StartsWith("image/")) { // 返回图片二进制流 return response.GetResponseStream(); } else { // 读取JSON错误信息 using (var reader = new StreamReader(response.GetResponseStream())) { string errorMessage = reader.ReadToEnd(); response.Close(); throw new Exception($"ONVIF抓图失败: {errorMessage}"); } } } else { response.Close(); throw new Exception($"ONVIF抓图失败,状态码: {response.StatusCode}"); } } } }