golang调用模组程序实现交互输入自动化,获取imei及iccid

news2025/1/19 23:16:39

应用场景:在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 ""
}

复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据分享】2022年我国10米分辨率茶树种植分布栅格数据

小麦、玉米、水稻、茶树等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到&#xff01; 本次给大家分享的是我国2022年10米分辨率茶树种植分布栅格数据&#xff01;数据格式为TIFF格式。数据坐标为GCS_WGS_1984。数据格式为TIFF格式。数据坐标为GCS_WGS_1984…

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…

vue实现展示并下载后端返回的图片流

// 点击下载 downLoadCode() {const image new Image();image.setAttribute("crossOrigin", "anonymous");image.onload () > {const canvas document.createElement("canvas");canvas.width image.width;canvas.height image.height;c…

STL关联式容器之平衡二叉搜索树

平衡二叉搜索树 在STL关联式容器介绍-CSDN博客中对二叉搜索树做了简要的描述&#xff1b;但是因为没有对二叉搜索树对数的深度及插入后树的结构进行调整&#xff0c;二叉搜索树可能失去平衡&#xff0c;造成搜寻效率低落的情况。如下所示&#xff1a; 所谓树形平衡与否&#xf…

Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录 ⭐注意⭐1. 配置项目全局设置&#xff1a;启用国际化2. 编写视图函数3. 配置路由4. 界面演示5、扩展自动识别并切换到当前语言设置语言并保存到Session设置语言并保存到 Cookie ⭐注意⭐ 以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能&am…

Java基础——继承和多态

目录 一、继承 继承的定义&#xff1a; 继承的基本用法&#xff1a; 如何调用父类的方法&#xff1f; 二、多态 多态性的好处 多态中的强制类型转换&#xff1a; 包的命名规则——域名倒叙 一、继承 继承的定义&#xff1a; 继承是面向对象编程中的一种机制&#xff0c…

2024-11-17 -MATLAB三维绘图简单实例

1. x -1:0.05:1; y x; [X, Y] meshgrid(x, y); f (X, Y) (sin(pi * X) .* sin(pi * Y)) .^ 2.*sin(2.*X2.*Y); mesh(X, Y, f(X, Y)); % 调用函数f并传递X和Y xlabel(X-axis); ylabel(Y-axis); zlabel(Z-axis); title(Surface Plot of (sin(pi * X) .* sin(pi * Y)) .^ 2.*…

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

Flink监控checkpoint

Flink的web界面提供了一个选项卡来监控作业的检查点。这些统计信息在任务终止后也可用。有四个选项卡可以显示关于检查点的信息:概述(Overview)、历史(History)、摘要(Summary)和配置(Configuration)。下面依次来看这几个选项。 Overview Tab Overview选项卡列出了以…

如何用Excel批量提取文件夹内所有文件名?两种简单方法推荐

在日常办公中&#xff0c;我们有时需要将文件夹中的所有文件名整理在Excel表格中&#xff0c;方便管理和查阅。手动复制文件名既费时又易出错&#xff0c;因此本文将介绍两种利用Excel自动提取文件夹中所有文件名的方法&#xff0c;帮助你快速整理文件信息。 方法一&#xff1…

微信小程序-prettier 格式化

一.安装prettier插件 二.配置开发者工具的设置 配置如下代码在setting.json里&#xff1a; "editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml"…

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之&#xff1a;Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…

前端页面自适应等比例缩放 Flexible+rem方案

在移动互联网时代&#xff0c;随着智能手机和平板电脑的普及&#xff0c;前端开发者面临的一个重要挑战是如何让网页在不同尺寸和分辨率的设备上都能良好地显示。为了应对这一挑战&#xff0c;阿里巴巴的前端团队开发了 flexible.js&#xff0c;旨在提供一种简单有效的解决方案…

Argo workflow 拉取git 并使用pvc共享文件

文章目录 拉取 Git 仓库并读取文件使用 Kubernetes Persistent Volumes&#xff08;通过 volumeClaimTemplates&#xff09;以及任务之间如何共享数据 拉取 Git 仓库并读取文件 在 Argo Workflows 中&#xff0c;如果你想要一个任务拉取 Git 仓库中的文件&#xff0c;另一个任…

AWTK VSCode 实时预览插件端口冲突的解决办法

AWTK XML UI 预览插件&#xff1a;在 vscode 中实时预览 AWTK XML UI 文件&#xff0c;在 Copilot 的帮助下&#xff0c;可以大幅提高界面的开发效率。 主要特色&#xff1a; 真实的 UI 效果。可以设置主题&#xff0c;方便查看在不同主题下界面的效果。可以设置语言&#xf…

x-cmd pkg | helix - 用 Rust 打造的文本编辑器,内置 LSP 和语法高亮,兼容 Vim 用户习惯

目录 简介快速上手安装使用 功能特点竞品和相关项目进一步阅读 简介 helix 是用 Rust 开发的文本编辑器&#xff0c;以 Modal editing&#xff08;模态编辑&#xff09;为核心特性&#xff0c;类似于 Vim。它结合了经典的 Vim 模式编辑和现代开发工具的特性&#xff08;如 LSP…

资源管理功能拆解——如何高效配置和管理项目资源?

在任何一个项目中&#xff0c;资源的合理配置和高效管理是决定项目成败的关键因素。无论是人力、物资还是时间&#xff0c;每一个资源的使用都直接关系到项目的执行效果和企业的成本控制。因此&#xff0c;如何在项目管理中实现资源的高效配置和监控&#xff0c;成为了企业管理…

SpringCloud OpenFeign负载均衡远程调用 跨服务调用 连接池优化

介绍 Spring Cloud OpenFeign 是 Spring Cloud 的一部分&#xff0c;提供了一种声明式的 HTTP 客户端方式来简化服务间的通信。通过 OpenFeign&#xff0c;开发者可以像调用本地方法一样&#xff0c;轻松地调用远程服务&#xff0c;而不需要手动处理 HTTP 请求、响应和连接等底…

Android Studio开发学习(五)———LinearLayout(线性布局)

一、布局 认识了解一下Android中的布局&#xff0c;分别是: LinearLayout(线性布局)&#xff0c;RelativeLayout(相对布局)&#xff0c;TableLayout(表格布局)&#xff0c; FrameLayout(帧布局)&#xff0c;AbsoluteLayout(绝对布局)&#xff0c;GridLayout(网格布局) 等。 二、…

Android WMS概览

WMS&#xff08;WindowManagerService&#xff09;是 Android 系统的核心服务&#xff0c;负责管理应用和系统的窗口&#xff0c;包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染&a…