这段代码旨在通过分析系统的内核版本来提取相关硬件和平台信息,特别是针对 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.")