SecureCRT自动化测试脚本实战:从零开始搭建你的第一个设备监控系统
本文详细介绍了如何使用SecureCRT自动化测试脚本构建设备监控系统,从环境配置到核心监控循环实现,再到日志系统设计与异常处理。通过实战案例,帮助开发者掌握自动测试脚本编写技巧,提升设备监控效率与系统健壮性。
SecureCRT自动化测试脚本实战:从零开始搭建你的第一个设备监控系统
在嵌入式开发和测试领域,设备监控是确保产品质量的关键环节。想象一下,当你需要连续72小时监测设备电池状态,手动操作不仅效率低下,还容易出错。这就是SecureCRT自动化脚本大显身手的时候了。本文将带你从零开始,构建一个完整的设备监控系统,而不仅仅是简单的脚本编写。
1. 环境准备与基础配置
在开始编写脚本前,我们需要确保SecureCRT环境正确配置。不同于简单的安装教程,这里会着重讲解那些容易被忽略但至关重要的配置细节。
首先,确保你使用的是官方最新版本的SecureCRT。虽然旧版本也能运行脚本,但新版本在脚本调试和错误处理方面有显著改进。安装完成后,建议进行以下基础配置:
-
会话设置优化:
- 调整缓冲区大小至10000行,确保长时间运行的日志不会丢失
- 启用时间戳记录,方便后续日志分析
- 设置合理的终端类型和字符编码
-
脚本调试环境准备:
' 启用脚本调试模式 crt.Debug.Enable = True crt.Debug.LogFile = "C:\SecureCRT_Debug.log" -
权限配置:
- 确保脚本执行权限已开启
- 为常用命令创建快捷方式,减少脚本复杂度
提示:在正式运行监控脚本前,建议先在小规模测试环境中验证脚本的稳定性和资源占用情况。
2. 构建核心监控循环
监控系统的核心在于稳定可靠的循环机制。下面我们将构建一个不仅能完成基本监控功能,还能处理各种异常情况的健壮脚本。
2.1 基础监控循环实现
Sub Main
' 初始化计数器
Dim loopCount
loopCount = 0
' 主监控循环
Do While(1)
' 发送电池信息查询命令
crt.Screen.Send "pm_client batteryinfo" & chr(13)
' 等待响应
crt.Sleep 2000
' 增加循环计数
loopCount = loopCount + 1
' 每10次循环输出一次状态信息
If loopCount Mod 10 = 0 Then
crt.Screen.Send "echo '已完成 " & loopCount & " 次监控循环'" & chr(13)
End If
Loop
End Sub
这个基础版本已经可以实现每2秒查询一次电池信息的功能,但实际项目中我们需要考虑更多因素。
2.2 增强型监控循环
在实际应用中,我们需要考虑以下增强功能:
- 超时处理:当设备无响应时自动重试
- 错误检测:识别并记录异常响应
- 资源监控:跟踪脚本自身的资源使用情况
Function SendCommandWithRetry(command, maxRetry)
Dim retryCount, success
retryCount = 0
success = False
Do While retryCount < maxRetry And Not success
crt.Screen.Send command & chr(13)
' 设置超时为3秒
If crt.Screen.WaitForString("batteryinfo", 3) Then
success = True
Else
retryCount = retryCount + 1
LogError "命令 " & command & " 第 " & retryCount & " 次重试"
End If
Loop
SendCommandWithRetry = success
End Function
3. 日志系统的设计与实现
一个完善的监控系统离不开强大的日志功能。我们不仅要记录原始数据,还要实现日志轮转、分级和关键信息提取。
3.1 基础日志功能
Sub StartLogging
' 创建按日期命名的日志文件
Dim logFileName
logFileName = "BatteryLog_" & Year(Now) & "-" & Month(Now) & "-" & Day(Now) & ".log"
' 开始记录会话日志
crt.Session.LogFileName = "C:\Logs\" & logFileName
crt.Session.Log(true)
End Sub
3.2 高级日志特性
为了实现更专业的日志管理,我们可以添加以下功能:
-
日志分级:
- DEBUG:详细调试信息
- INFO:常规运行信息
- WARNING:需要注意的情况
- ERROR:需要立即处理的错误
-
日志轮转:
- 按大小轮转:当日志超过指定大小时创建新文件
- 按时间轮转:每天/每小时创建新日志文件
-
关键数据提取:
- 实时解析日志中的电池电量、温度等关键参数
- 生成易于分析的CSV格式数据
Function ExtractBatteryLevel(logLine)
Dim level
' 使用正则表达式提取电池电量
Set regEx = New RegExp
regEx.Pattern = "battery level: (\d+)%"
If regEx.Test(logLine) Then
Set matches = regEx.Execute(logLine)
level = matches(0).SubMatches(0)
ExtractBatteryLevel = level
Else
ExtractBatteryLevel = -1 ' 表示提取失败
End If
End Function
4. 异常处理与系统健壮性
监控系统需要能够处理各种异常情况而不中断运行。以下是几种常见的异常处理场景。
4.1 连接异常处理
Sub CheckConnection
If Not crt.Session.Connected Then
LogError "连接中断,尝试重新连接"
' 尝试重新连接
If Not Reconnect() Then
SendAlert "无法重新建立连接,系统将退出"
Exit Sub
End If
End If
End Sub
Function Reconnect
Dim retryCount
retryCount = 0
Do While retryCount < 3
crt.Session.Connect
If crt.Session.Connected Then
Reconnect = True
Exit Function
End If
crt.Sleep 5000 ' 等待5秒后重试
retryCount = retryCount + 1
Loop
Reconnect = False
End Function
4.2 资源监控与保护
长时间运行的脚本可能会遇到内存泄漏或CPU占用过高的问题。我们可以添加资源监控逻辑:
Sub MonitorResources
Static lastCheckTime
Dim currentTime
currentTime = Now
' 每小时检查一次资源使用情况
If IsEmpty(lastCheckTime) Or DateDiff("h", lastCheckTime, currentTime) >= 1 Then
Dim memoryUsage
memoryUsage = GetMemoryUsage()
If memoryUsage > 90 Then ' 百分比
LogWarning "内存使用率过高: " & memoryUsage & "%"
' 执行清理操作
CleanupResources
End If
lastCheckTime = currentTime
End If
End Sub
5. 数据分析与可视化
收集数据只是第一步,如何从海量日志中提取有价值的信息同样重要。
5.1 实时数据分析
我们可以扩展脚本,使其能够实时分析电池数据并触发警报:
| 指标 | 正常范围 | 预警阈值 | 紧急阈值 |
|---|---|---|---|
| 电量 | 20-100% | 15-20% | <15% |
| 温度 | 10-40°C | 40-45°C | >45°C |
| 电压 | 3.6-4.2V | 3.4-3.6V | <3.4V |
Sub AnalyzeBatteryData
Dim level, temperature, voltage
' 从日志中提取最新数据
level = GetLatestBatteryLevel()
temperature = GetLatestTemperature()
voltage = GetLatestVoltage()
' 检查各项指标
If level < 15 Then
SendAlert "电池电量低: " & level & "%"
End If
If temperature > 45 Then
SendAlert "电池温度过高: " & temperature & "°C"
End If
' 更多检查逻辑...
End Sub
5.2 生成可视化报告
虽然SecureCRT脚本本身无法直接生成图表,但我们可以输出格式化的数据供其他工具使用:
Sub GenerateReport
' 生成CSV格式的报告
Dim csvContent
csvContent = "时间,电量(%),温度(°C),电压(V)" & vbCrLf
' 添加数据行
csvContent = csvContent & FormatDateTime(Now) & "," & currentLevel & "," & currentTemp & "," & currentVoltage & vbCrLf
' 写入文件
WriteToFile "BatteryReport.csv", csvContent
End Sub
6. 系统集成与扩展
一个完整的监控系统往往需要与其他系统集成。以下是几种常见的集成方式。
6.1 邮件通知集成
Sub SendAlert(message)
Dim mailSubject, mailBody
mailSubject = "电池监控警报 - " & FormatDateTime(Now)
mailBody = "警报时间: " & FormatDateTime(Now) & vbCrLf & _
"设备: " & GetDeviceName() & vbCrLf & _
"警报信息: " & message
' 使用CDO发送邮件
Dim cdoMail
Set cdoMail = CreateObject("CDO.Message")
With cdoMail
.From = "monitor@example.com"
.To = "admin@example.com"
.Subject = mailSubject
.TextBody = mailBody
' 配置SMTP服务器
.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.com"
.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Configuration.Fields.Update
.Send
End With
Set cdoMail = Nothing
End Sub
6.2 数据库存储集成
对于需要长期存储和分析的数据,我们可以将结果保存到数据库:
Sub SaveToDatabase(level, temperature, voltage)
Dim conn, sql
' 创建数据库连接
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=SQLOLEDB;Data Source=myServerAddress;" & _
"Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
' 准备SQL语句
sql = "INSERT INTO BatteryReadings (ReadingTime, BatteryLevel, Temperature, Voltage) " & _
"VALUES ('" & FormatDateTime(Now, vbShortDate) & " " & FormatDateTime(Now, vbLongTime) & "', " & _
level & ", " & temperature & ", " & voltage & ")"
' 执行SQL
conn.Execute sql
' 关闭连接
conn.Close
Set conn = Nothing
End Sub
7. 性能优化技巧
当监控系统需要长期运行时,性能优化变得尤为重要。以下是几个实用的优化技巧:
-
减少屏幕操作:
- 使用
crt.Screen.Send而非图形界面操作 - 禁用不必要的屏幕更新
- 使用
-
内存管理:
' 定期清理大对象 Sub CleanupResources Set largeObject = Nothing EmptyTheClipboard End Sub -
智能休眠机制:
- 根据设备状态动态调整轮询间隔
- 在非工作时间减少监控频率
-
脚本模块化:
- 将常用功能封装为独立函数
- 使用
#include指令复用代码
' 示例:动态调整轮询间隔
Function GetPollingInterval
Dim hourOfDay
hourOfDay = Hour(Now)
' 工作时间频繁检查,夜间减少频率
If hourOfDay >= 8 And hourOfDay < 20 Then
GetPollingInterval = 2000 ' 2秒
Else
GetPollingInterval = 10000 ' 10秒
End If
End Function
在实际项目中,我发现最容易被忽视但极其重要的是完善的日志系统。曾经有一次设备夜间出现异常,由于日志系统不够完善,我们花费了大量时间才定位到问题根源。后来改进后的日志系统不仅记录了原始数据,还包括了系统状态、环境信息等上下文,大大提高了故障诊断效率。
更多推荐



所有评论(0)