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

59 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 任务目标
在主界面上接通"校园安防":新建 `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 关闭,摄像机也关闭。