针对 NVIDIA Jetson 和 Rockchip 平台分析系统的内核版本来提取相关硬件和平台信息

这段代码旨在通过分析系统的内核版本来提取相关硬件和平台信息,特别是针对 NVIDIA Jetson 和 Rockchip 平台。代码的主要功能如下:

(1)获取内核版本:调用 uname -r 命令来获取系统的内核版本。
(2)提取信息:根据不同的内核版本格式(针对 Tegra 和 Rockchip),提取版本、平台、芯片型号和序列号等信息。
(3)获取 Jetson 模型:通过 jtop 库获取 Jetson 设备的硬件信息。
(4)获取序列号:根据设备类型(Tegra 或 Rockchip)获取设备的序列号。
下面是代码的详细解释:

(1)函数 get_kernel_version

def get_kernel_version():
    try:
        kernel_version = subprocess.check_output(['uname', '-r']).decode().strip()
        return kernel_version
    except subprocess.CalledProcessError as e:
        print(f"Error executing uname: {str(e)}")
        return None

  调用 uname -r 命令获取内核版本。
  捕获任何执行错误并返回 None。
(2)函数 extract_info

def extract_info(kernel_version):
    tegra_match = re.search(r"(\d+\.\d+\.\d+)-(\w+)", kernel_version)
    rockchip_match = re.search(r"(\d+\.\d+\.\d+)-rockchip-rk(\d+)(\d?)", kernel_version)
    
    if tegra_match and tegra_match.group(2) == 'tegra':
        version = tegra_match.group(1)
        platform = tegra_match.group(2)
        chip_model = get_jetson_model()
        serial_number = get_tegra_serial()
        return version, platform, chip_model, serial_number
    elif rockchip_match:
        version = rockchip_match.group(1)
        platform = "rockchip"
        chip_main = rockchip_match.group(2)
        chip_suffix = rockchip_match.group(3)
        if chip_suffix.isdigit():
            chip_model = f"{chip_main}{chip_suffix}"
        else:
            chip_model = f"{chip_main}x"
        serial_number = get_rockchip_serial()
        return version, platform, chip_model, serial_number
    else:
        return None

  使用正则表达式匹配不同内核版本格式(Tegra 和 Rockchip)。
  根据匹配结果调用相应的函数获取详细信息。
  返回提取的信息或 None。
(3)函数 get_jetson_model

def get_jetson_model():
    from jtop import jtop, JtopException
    try:
        with jtop() as jetson:
            board = jetson.board
            if 'hardware' in board and 'Model' in board['hardware']:
                model_full = board['hardware']['Model']
                model_match = re.search(r"NVIDIA (.*?) Developer Kit", model_full)
                if model_match:
                    return model_match.group(1).strip()
                else:
                    return "Unknown Model"
            else:
                return "Unknown Model"
    except JtopException as e:
        print(f"Jtop error: {str(e)}")
        return "Unknown Model"

  使用 jtop 库获取 Jetson 设备的硬件信息。
  提取并返回设备的模型名称。
(4)函数 get_tegra_serial

def get_tegra_serial():
    try:
        with open('/sys/firmware/devicetree/base/serial-number', 'r') as file:
            serial_number = file.read().strip()
        return serial_number
    except Exception as e:
        print(f"Error reading serial number: {str(e)}")
        return "Unknown Serial"

  读取 NVIDIA 设备的序列号。
(5)函数 get_rockchip_serial

def get_rockchip_serial():
    try:
        serial_number_output = subprocess.check_output(['bash', 'cat_serial.sh']).decode().strip()
        serial_match = re.search(r"Serial\s*:\s*(\S+)", serial_number_output)
        if serial_match:
            return serial_match.group(1)
        else:
            return "Unknown Serial"
    except subprocess.CalledProcessError as e:
        print(f"Error executing cat_serial.sh: {str(e)}")
        return "Unknown Serial"

  通过执行 cat_serial.sh 脚本获取 Rockchip 设备的序列号。
(6)主程序

kernel_version = get_kernel_version()

if kernel_version:
    info = extract_info(kernel_version)
    if info:
        print(f"Kernel Version: {info[0]}, Platform: {info[1]}, Chip Model: {info[2]}, Serial Number: {info[3]}")
    else:
        print(f"Failed to extract info from kernel version: {kernel_version}")
else:
    print("Failed to get kernel version.")

  获取内核版本并提取相关信息。
  打印提取到的信息或错误消息。
  这个脚本在运行时会调用系统命令和读取文件来获取硬件和系统信息,并根据不同的内核版本格式提取相关数据。
  最终输出如下:

Kernel Version: 5.10.104, Platform: tegra, Chip Model: Orin Nano, Serial Number: xxxxxxxxxxx  #英伟达输出

Kernel Version: 5.10.160, Platform: rockchip, Chip Model: 3588x, Serial Number: xxxxxxxxxxx  #瑞芯微输出

下面是全部代码:

import re
import subprocess

def get_kernel_version():
    try:
        # 调用 uname -r 获取内核版本
        kernel_version = subprocess.check_output(['uname', '-r']).decode().strip()
        return kernel_version
    except subprocess.CalledProcessError as e:
        print(f"Error executing uname: {str(e)}")
        return None

def extract_info(kernel_version):
    # 使用正则表达式匹配不同部分
    tegra_match = re.search(r"(\d+\.\d+\.\d+)-(\w+)", kernel_version)
    rockchip_match = re.search(r"(\d+\.\d+\.\d+)-rockchip-rk(\d+)(\d?)", kernel_version)
    
    if tegra_match and tegra_match.group(2) == 'tegra':
        version = tegra_match.group(1)
        platform = tegra_match.group(2)
        chip_model = get_jetson_model()
        serial_number = get_tegra_serial()
        return version, platform, chip_model, serial_number
    elif rockchip_match:
        version = rockchip_match.group(1)
        platform = "rockchip"
        chip_main = rockchip_match.group(2)
        chip_suffix = rockchip_match.group(3)
        if chip_suffix.isdigit():
            chip_model = f"{chip_main}{chip_suffix}"
        else:
            chip_model = f"{chip_main}x"
        serial_number = get_rockchip_serial()
        return version, platform, chip_model, serial_number
    else:
        return None

def get_jetson_model():
    from jtop import jtop, JtopException
    try:
        with jtop() as jetson:
            board = jetson.board
            if 'hardware' in board and 'Model' in board['hardware']:
                model_full = board['hardware']['Model']
                # 提取NVIDIA 到 Developer Kit 中间的部分
                model_match = re.search(r"NVIDIA (.*?) Developer Kit", model_full)
                if model_match:
                    return model_match.group(1).strip()
                else:
                    return "Unknown Model"
            else:
                return "Unknown Model"
    except JtopException as e:
        print(f"Jtop error: {str(e)}")
        return "Unknown Model"

def get_tegra_serial():
    try:
        # 读取NVIDIA设备的序列号
        with open('/sys/firmware/devicetree/base/serial-number', 'r') as file:
            serial_number = file.read().strip()
        return serial_number
    except Exception as e:
        print(f"Error reading serial number: {str(e)}")
        return "Unknown Serial"

def get_rockchip_serial():
    try:
        # 读取Rockchip设备的序列号
        serial_number_output = subprocess.check_output(['bash', 'cat_serial.sh']).decode().strip()
        # 提取序列号部分
        serial_match = re.search(r"Serial\s*:\s*(\S+)", serial_number_output)
        if serial_match:
            return serial_match.group(1)
        else:
            return "Unknown Serial"
    except subprocess.CalledProcessError as e:
        print(f"Error executing cat_serial.sh: {str(e)}")
        return "Unknown Serial"

# 获取内核版本
kernel_version = get_kernel_version()

if kernel_version:
    # 提取信息并打印
    info = extract_info(kernel_version)
    if info:
        print(f"Kernel Version: {info[0]}, Platform: {info[1]}, Chip Model: {info[2]}, Serial Number: {info[3]}")
    else:
        print(f"Failed to extract info from kernel version: {kernel_version}")
else:
    print("Failed to get kernel version.")
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lindsayshuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值