Este script inyecta una versión de firmware basada en git en el firmware ESP32 de PlatformIO
Este es un script de Python que puedes usar en tu proceso de compilación de PlatformIO para inyectar una cadena de versión de firmware basada en la etiqueta y el commit actuales de Git en el binario del firmware de tu ESP32. Esto es útil para rastrear qué versión del firmware se está ejecutando en tu dispositivo.
Un ejemplo de una versión que podría inyectar es v1.0.0-123-gabc1234@2025-08-27T02:06:15.
inject_git_version.py
#!/usr/bin/env python3
import subprocess
from datetime import datetime
import argparse
import sys
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--environment", help="The build environment to use")
parser.add_argument("--chip", default="esp32", help="The chip to use (for esptool.py elf2image)")
parser.add_argument("--flash_freq", default="40m", help="The flash frequency (for esptool.py elf2image)")
parser.add_argument("--flash_mode", default="dio", help="The flash mode (for esptool.py elf2image)")
args = parser.parse_args()
# Determinar la versión de git y la fecha de compilación
version = subprocess.check_output("git describe --long --tags --dirty", shell=True).strip().decode("utf-8")
date = datetime.utcnow().isoformat()
# Unir versión y fecha
full_version_string = f"{version}@{date}".encode("utf-8")
firmware_version_template = b"================================================================================"
# Si no se especifica un entorno, solo imprimir la versión y salir
if not args.environment:
print(f"Version: {version}")
print("No --environment specified, exiting...")
sys.exit(1)
with open(f".pio/build/{args.environment}/firmware.elf", "rb") as infile:
firmware_binary = infile.read()
# ¡Las cadenas de reemplazo deben tener exactamente la longitud correcta!
version_replacement = full_version_string.ljust(len(firmware_version_template), b'\0')
# ¡Reemplazar!
firmware_binary = firmware_binary.replace(firmware_version_template, version_replacement, 1)
# Escribir de vuelta al archivo
with open(f".pio/build/{args.environment}/firmware-versioned.elf", "wb") as outfile:
outfile.write(firmware_binary)
# Escribir la versión en el archivo
with open(f".pio/build/{args.environment}/version.txt", "w", encoding="utf-8") as outfile:
outfile.write(version)
# Convertir a ELF
subprocess.check_output(f"esptool.py --chip {args.chip} elf2image --flash_freq {args.flash_freq} --flash_mode {args.flash_mode} .pio/build/{args.environment}/firmware-versioned.elf", shell=True)Si este artículo te ha ayudado, considera invitarme a un café o hacer una donación vía PayPal para apoyar la investigación y publicación de nuevos artículos en TechOverflow