SecureCRT自动化测试脚本实战:从零开始搭建你的第一个设备监控系统

在嵌入式开发和测试领域,设备监控是确保产品质量的关键环节。想象一下,当你需要连续72小时监测设备电池状态,手动操作不仅效率低下,还容易出错。这就是SecureCRT自动化脚本大显身手的时候了。本文将带你从零开始,构建一个完整的设备监控系统,而不仅仅是简单的脚本编写。

1. 环境准备与基础配置

在开始编写脚本前,我们需要确保SecureCRT环境正确配置。不同于简单的安装教程,这里会着重讲解那些容易被忽略但至关重要的配置细节。

首先,确保你使用的是官方最新版本的SecureCRT。虽然旧版本也能运行脚本,但新版本在脚本调试和错误处理方面有显著改进。安装完成后,建议进行以下基础配置:

  1. 会话设置优化

    • 调整缓冲区大小至10000行,确保长时间运行的日志不会丢失
    • 启用时间戳记录,方便后续日志分析
    • 设置合理的终端类型和字符编码
  2. 脚本调试环境准备

    ' 启用脚本调试模式
    crt.Debug.Enable = True
    crt.Debug.LogFile = "C:\SecureCRT_Debug.log"
    
  3. 权限配置

    • 确保脚本执行权限已开启
    • 为常用命令创建快捷方式,减少脚本复杂度

提示:在正式运行监控脚本前,建议先在小规模测试环境中验证脚本的稳定性和资源占用情况。

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 高级日志特性

为了实现更专业的日志管理,我们可以添加以下功能:

  1. 日志分级

    • DEBUG:详细调试信息
    • INFO:常规运行信息
    • WARNING:需要注意的情况
    • ERROR:需要立即处理的错误
  2. 日志轮转

    • 按大小轮转:当日志超过指定大小时创建新文件
    • 按时间轮转:每天/每小时创建新日志文件
  3. 关键数据提取

    • 实时解析日志中的电池电量、温度等关键参数
    • 生成易于分析的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. 性能优化技巧

当监控系统需要长期运行时,性能优化变得尤为重要。以下是几个实用的优化技巧:

  1. 减少屏幕操作

    • 使用crt.Screen.Send而非图形界面操作
    • 禁用不必要的屏幕更新
  2. 内存管理

    ' 定期清理大对象
    Sub CleanupResources
        Set largeObject = Nothing
        EmptyTheClipboard
    End Sub
    
  3. 智能休眠机制

    • 根据设备状态动态调整轮询间隔
    • 在非工作时间减少监控频率
  4. 脚本模块化

    • 将常用功能封装为独立函数
    • 使用#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

在实际项目中,我发现最容易被忽视但极其重要的是完善的日志系统。曾经有一次设备夜间出现异常,由于日志系统不够完善,我们花费了大量时间才定位到问题根源。后来改进后的日志系统不仅记录了原始数据,还包括了系统状态、环境信息等上下文,大大提高了故障诊断效率。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐