Files
IOT_SIM/samples/p8-t4-校园安防/task.md
T
xuyueandClaude Opus 5.5 d4b8bf9241 任务说明补齐 23 份;设计器支持窗体改名
- 其余 21 个实验的 task.md:控件名照示例代码,"在平台上怎么试"和评分步骤一致,列出书上的印刷错误和控件名不一致
- 窗体改名:属性窗口里选中窗体可以改名称,类名、构造函数、new X()、Program.cs 和两个文件名一起改;方法名和字符串不变
- 11 个主窗体不叫 Form1 的实验,任务说明提示先改窗体名再双击生成 Load 事件
- 测试:表头只认分隔行上面那一行,数据行里出现"名称"不再被当成表头

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:55:39 +08:00

5.2 KiB
Raw Blame History

任务目标

在主界面上接通"校园安防":新建 Security 窗体,打开时连上网络摄像机显示实时画面,后台线程每秒检查一次红外对射,有人闯入时显示"发现入侵"并把当前画面存进数据库;四个方向键控制摄像机转动;"拍照"把画面存成图片文件、同时存进数据库;返回主窗体时关掉摄像机。"查看历史图像"按钮先放好,任务 5 再做。

练习重点:摄像机的 ImageRead 事件、后台线程、图片框的鼠标按下 / 松开事件(MouseDown / MouseUp)、换背景图片、保存图片文件。详细步骤见书 p174–180。

先准备数据库

用任务 3 的 WisdomCampus 库,入侵和拍照的图片存进 SecurityData 表(报警时间 EvenTime、图片 EvenImage),存的方法是任务 3 写好的 SQLBLL.SecurityUpData。还没有这个库或数据弄乱了,到数据库页面点恢复实验初始数据,选这个实验。

界面和控件名

接着任务 3 的程序做。Security 窗体顶部和 Environment 一样:标题栏 + "< 返回主窗体"。

窗体 名称(Name) 文字(Text)和用途
主界面 pic_security "校园安防":打开 Security 窗体
校园安防 Security 无边框、屏幕居中
校园安防 panel1、panel3 标题栏(放标题图 ico_title)、返回栏,都停靠 Top
校园安防 lb_return < 返回主窗体
校园安防 panel_bg_video 停靠 Fill,白色背景,下面的控件都放在它上面
校园安防 panel2 灰色(DimGray)的视频区
校园安防 pic_video 放在 panel2 上,显示摄像机画面;背景图片 icon_monitor,背景排列 Center
校园安防 lb_infrared 放在 panel2 上,标签"入侵:"的右边,开始是 N/A,之后显示"发现入侵"或"正常"
校园安防 panel_video_ctrl 方向盘:背景图片 panel_video_ctrl,背景排列 Stretch
校园安防 pic_up、pic_down、pic_left、pic_right 放在方向盘上的四个方向键,背景图片 btn_arrow_up_normal 等,背景排列 Stretch
校园安防 btn_camera 拍照
校园安防 btn_history 查看历史图像(任务 5 再写代码)

实现步骤

  1. 项目资源里再勾选 icon_monitor、panel_video_ctrl 和四个方向键的 btn_arrow_*_normal、btn_arrow_*_press(共 8 张)。
  2. 点 + 新建窗体 建 Security,按上表搭界面。
  3. 主窗体 pic_security 的 Click:new Security().Show();。
  4. 在 Security 里引用 System.IO、System.Threading、DeviceCtrlLibrary、智慧校园.SQLHelpers,声明字段:入侵标志 IsInfrared、图片文件夹 ImgDir(程序目录下的 Camera 文件夹)、线程、SynchronizationContext、当前画面 img。
  5. 写 ipCameraHelper_ImageRead(ImageReadEvenArgs e):把 e.img 记到 img,并显示到 pic_video。
  6. 写 tick():while (true) 循环,读 ADAM-4150 的 infraredValue,用 _main.Send 把"发现入侵"或"正常"显示到 lb_infrared;有入侵且有画面时调用 SQLBLL.SecurityUpData(img);Thread.Sleep(1000)。
  7. Security_Load:打开摄像机(AppSet 里的 IP、用户名、密码),挂上 ImageRead 事件,Start();启动 tick 线程;Camera 文件夹不存在就建一个。
  8. Security_FormClosed:摄像机 Stop()、Close(),停止线程。
  9. btn_camera 的 Click:把 pic_video.Image 存成 ImgDir + 年月日_时分秒 + ".jpg",再调用 SQLBLL.SecurityUpData 存进数据库。
  10. 四个方向键:在 ⚡ 事件里双击"鼠标按下"和"鼠标松开"生成方法。按下时换成 _press 图片并调用 PanUp()(或 PanDown / PanLeft / PanRight),松开时换回 _normal 图片并再调用一次同一个方法。
  11. lb_return 的 Click:this.Close();。

和书上不一样的地方

摄像机每次调用转一格:平台的摄像机左右 7 格、上下 3 格,开始在正中,PanUp() 等方法每调用一次转一格。书上按下、松开各调用一次,所以点一下方向键会转两格。

面板的名字:示例(取自配套工程)里白色的大面板叫 panel_bg_video、灰色视频区叫 panel2,书上叫 panel_bg、panel_bg_video。面板的名字不评分,照书上起名也可以。

书上的路径 "Camera\\" 照写就行,平台会换成服务器上能用的路径。

在平台上怎么试

  1. 运行后点"校园安防",打开 Security 窗体,几秒内 pic_video 里出现摄像机画面(校园东围墙)。
  2. 点实训台的红外对射遮挡光束,"入侵:"后面显示"发现入侵",画面里出现翻墙的人;再点一次恢复,显示"正常"。
  3. 点四个方向键,画面跟着转;松开后方向键换回原来的图片。把鼠标放在实训台的网络摄像头上能看到云台的位置。
  4. 点"拍照",运行区下面的"程序保存的图片"里多出一张 Camera 文件夹下的照片(文件名是拍照的日期和时间);到数据库页面查询 SecurityData 表,能看到拍照和入侵时存的记录。
  5. 点"< 返回主窗体",Security 关闭,摄像机也关闭。