首页 > 编程语言 >golang调用第三方程序并实现交互输入自动化

golang调用第三方程序并实现交互输入自动化

时间:2024-11-18 08:45:24浏览次数:1  
标签:调用 return err dev golang api test 交互 ql

应用场景:在openwrt下调用移远的测试程序,并实现输入自动话,获取imei

root@OpenWrt:~# ql-api-test
Test groups:

0:      ql_dsi

1:      ql_nw

2:      ql_sim

3:      ql_dev

4:      ql_voice

5:      ql_sms

6:      ql_adc

7:      ql_i2c

8:      ql_enit

9:      ql_fota

10:     ql_gpio

11:     ql_spi

12:     ql_uart

13:     ql_locator

14:     ql_lpm

15:     ql_audio

16:     ql_wifi

17:     ql_atc

please input command index(-1 exit):
3
Group Name:ql_dev, Supported test cases:

0:      ql_dev_init

1:      ql_dev_release

2:      ql_dev_get_imei

3:      ql_dev_get_firmware_version

4:      ql_dev_get_model

5:      ql_dev_get_sn

6:      ql_dev_set_modem_fun

7:      ql_dev_get_modem_fun

8:      ql_dev_forbidind

please input cmd index(-1 exit):
0
ql_dev_init ret = 0

please input cmd index(-1 exit):
2
ql_dev_get_imei ret = 0, imei:860503070780822;

please input cmd index(-1 exit):
-1
Test groups:

0:      ql_dsi

1:      ql_nw

2:      ql_sim

3:      ql_dev

4:      ql_voice

5:      ql_sms

6:      ql_adc

7:      ql_i2c

8:      ql_enit

9:      ql_fota

10:     ql_gpio

11:     ql_spi

12:     ql_uart

13:     ql_locator

14:     ql_lpm

15:     ql_audio

16:     ql_wifi

17:     ql_atc

please input command index(-1 exit):
-1

自动化指令:

方式1
echo -e "3\n0\n2\n-1\n-1" | ql-api-test

方式2
ql-api-test <<EOF
3
0
2
-1
-1
EOF

 

golang代码实现

process.go

package util

import (
    "bytes"
    "os/exec"
    "regexp"
    "runtime"
    "strings"
    "tboxconfig/util/common"
)

// 检查进程是否在运行(适用于类Unix系统和Windows)
func GetIMEI() string {
    imei := ""

    if runtime.GOOS == "windows" {
        return "不支持windows获取MEI"
    } else {
        echoCmd := exec.Command("echo", "-e", "3\n0\n2\n-1\n-1")

        // 创建 ql-api-test 命令
        qlApiTestCmd := exec.Command("ql-api-test")

        // 将 echo 命令的输出作为 ql-api-test 命令的输入
        echoOut, _ := echoCmd.StdoutPipe()
        qlApiTestCmd.Stdin = echoOut

        // 捕获 ql-api-test 命令的标准输出
        var stdout bytes.Buffer
        qlApiTestCmd.Stdout = &stdout

        // 启动 echo 命令
        if err := echoCmd.Start(); err != nil {
            common.LogError2("启动 echo 命令失败:", err)
            return ""
        }

        // 启动 ql-api-test 命令
        if err := qlApiTestCmd.Start(); err != nil {
            common.LogError2("启动 ql-api-test 命令失败:", err)
            return ""
        }

        // 等待 echo 命令完成
        if err := echoCmd.Wait(); err != nil {
            common.LogError2("echo 命令执行失败:", err)
            return ""
        }

        // 等待 ql-api-test 命令完成
        if err := qlApiTestCmd.Wait(); err != nil {
            common.LogError2("ql-api-test 命令执行失败:", err)
        }

        // 获取标准输出的内容
        output := stdout.String()
        common.LogInfo("imei输出:" + output)

        // 使用正则表达式提取 imei
        re := regexp.MustCompile(`imei:([0-9]+);`)
        matches := re.FindStringSubmatch(output)
        if len(matches) > 1 {
            imei = matches[1]
        }
    }

    return imei
}

func GetICCID() string {
    iccid := ""
    if runtime.GOOS == "windows" {
        return "不支持windows获取ICCID"
    } else {
        cmd := exec.Command("serial_atcmd", "AT+QCCID")

        // 捕获命令的标准输出和标准错误输出
        var stdout bytes.Buffer
        var stderr bytes.Buffer
        cmd.Stdout = &stdout
        cmd.Stderr = &stderr

        // 启动命令
        if err := cmd.Run(); err != nil {
            common.LogError2("命令执行失败:", err)
            return ""
        }

        output := stdout.String()
        common.LogInfo("iccid输出:" + output)

        // 提取 ICCID
        iccid = extractICCID(output)
    }

    return iccid
}

// 从输出中提取 ICCID
func extractICCID(output string) string {
    // 假设输出格式为 "+QCCID: 89860012345678901234" 或类似格式
    lines := strings.Split(output, "\n")
    for _, line := range lines {
        if strings.HasPrefix(line, "+QCCID:") {
            parts := strings.Split(line, ":")
            if len(parts) > 1 {
                return strings.TrimSpace(parts[1])
            }
        }
    }
    return ""
}

 

标签:调用,return,err,dev,golang,api,test,交互,ql
From: https://www.cnblogs.com/chen1880/p/18551622

相关文章

  • 【ABAP——在ALV报表中调用表单打印信息】
    文章目录创建表单定义接口创建全局变量并初始化循环显示学校信息表注意在报表中调用表单,打印信息增加用户选择数据功能添加ALV按钮并在ALV_USER_COMMAND接收按钮响应设置的打印按钮实现一个学生信息表的打印功能,表头打印学生基本信息,循环该学生的学校信息,每当学生I......
  • HarmonyOS:UIAbility组件间交互(设备内)
    UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,包括应用内的其他UIAbility、或者其他应用的UIAbility(例如启动三方支付UIAbility)。一、启动应用内的UIAbility当一个应用内包含多个UIAbility时,存在应用内启动UIAbility的场景......
  • Golang的GMP调度模型与源码解析
    0、引言我们知道,这当代操作系统中,多线程和多进程模型被广泛的使用以提高系统的并发效率。随着互联网不断的发展,面对如今的高并发场景,为每个任务都创建一个线程是不现实的,使用线程则需要系统不断的在用户态和内核态之间不断的切换,引起不必要的损耗,于是引入了协程。协程存在于用户......
  • 行驶证 OCR 识别 API 接口用PHP如何调用
    行驶证OCR识别接口是一种极为强大的工具。其强大之处在于,当用户传入行驶证照片后,它能够以令人惊叹的速度和极高的准确性,快速准确地识别出行驶证上的所有文字信息。识别完成后,它会将这些文字信息以高度结构化的形式进行返回。以下是行驶证OCR识别API接口用PHP如何调用的......
  • 行驶证 OCR 识别 API 接口用C#如何调用
    具体来说,行驶证OCR识别接口具备强大的功能,可以准确识别包括所有人、品牌型号、住址、车牌号、发动机号码、车辆识别代号、注册日期、发证日期等多个至关重要的字段信息。在实际应用中,该接口通过对行驶证照片进行全面而深入的智能分析,能够极为精准地提取出上述的这些信息。并......
  • 8、异常向量表的安装与调用
    1.回顾中断的发生、处理过程中断发生的硬件过程中断处理的软件处理流程CPU执行完当前指令,检查到发生了中断,跳到向量表保存现场、执行GIC提供的处理函数、恢复现场2.异常向量表的安装2.1复制向量表汇编代码//arch\arm\kernel\head.S1.bl __lookup_pr......
  • 【MATLAB代码】基于EKF的IMM,三个模型的交互,包括:CV,CA,CT,附源代码下载链接
    基于交互多模型(IMM)算法的目标跟踪,使用了三种运动模型:匀速运动(CV)、匀加速运动(CA)和匀转弯运动(CT)。滤波方法为EKF文章目录运行结果源代码运行结果详解代码详解概述主要功能代码详细介绍初始化与仿真参数设置定义模型参数状态转移矩阵定义生成真实数据IMM......
  • Golang超详细入门教程
    文章目录Golang超详细入门教程一、数据类型转换二、常量三、输入输出函数1.输出函数2.输入函数四、命令行参数1.go命令行操作指令2.通过os包获取命令行参数3.通过flag包获取命令行参数4.os包和flag包的对比五、流程控制1.选择语句(if..)2.选择结构(switch..case)3.循......
  • 二叉树Golang
    二叉树前言完全二叉树最底层节点按顺序从左到右排列。满二叉树一颗二叉树只有0度和2度的节点。二叉搜索树左子树上的所有节点的值均小于根节点的值。右子树上的所有节点的值均大于根节点的值。平衡二叉搜索树左右两个子树的高度差的绝对值不超过1。......
  • Openlayers的多边形高级交互
    概述本文主要介绍Openlayers中,两个(或多个)多边形的高级交互,包括:并集,交集和差集运算.概念理解并集(Union):并集指的是将两个几何对象的所有区域合并在一起。即,结果是包含了两个对象所有区域的集合。如果两个几何形状有重叠部分,合并时不会重复这些部分。几何......