国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

GitHub 自動(dòng)下載 Release 固件

這篇具有很好參考價(jià)值的文章主要介紹了GitHub 自動(dòng)下載 Release 固件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一般在 GitHub 上成熟的倉(cāng)庫(kù),都會(huì)在 Releases 頁(yè)面上發(fā)布最新穩(wěn)定的版本。

作為一名嵌入式程序員,就以 Espressif 下的 esp-idf 倉(cāng)庫(kù)為例,截至到作者寫這篇文檔前,最新發(fā)布的版本為 ESP-IDF Pre-release v5.0-beta1。
GitHub 自動(dòng)下載 Release 固件
同樣作為一名嵌入式程序員,與互聯(lián)網(wǎng)行業(yè)的程序員不同,要經(jīng)常和 release 的固件打交道。因?yàn)檫@些固件都是經(jīng)過(guò)嚴(yán)格測(cè)試的穩(wěn)定版本,修復(fù)了很多 bug 和增加了新的 feature,所以始終保持設(shè)備運(yùn)行最新的 release 固件是很有必要的。但是對(duì)于一些沒(méi)有訂閱功能的 release 固件,每次都要手動(dòng)去 check 下,如果有最新的 release 固件,則首先要通過(guò)瀏覽器下載到本地,在將本地的固件下載到開發(fā)板中。于是就萌生了寫一個(gè)自動(dòng)化的 Python 腳本來(lái)代替這些無(wú)意義的重復(fù)勞動(dòng)的想法。

本文就以 Espressif 下的 esp-at 倉(cāng)庫(kù)為例,利用 GitHub 的 rest API 寫一個(gè)自動(dòng)從 Releases 上下載最新的固件并下載到開發(fā)板中的自動(dòng)化 Python 腳本。省去自己通過(guò)瀏覽器下載固件到本地,在將本地固件下載到開發(fā)板中的過(guò)程。

源碼可以參考作者的 GitHub 倉(cāng)庫(kù)。

首先就是將所有與 GitHub 交互的操作封裝成 GitDownload 類。主要是用到了以下 rest API:

  1. Releases
"""github download class"""

import requests
import json
import string
import re

class GitDownload:
    """
    github download class
    """
    pass

    def __init__(self, owner, repository, user_name, token):
        self.owner = owner
        self.repository = repository
        self.rest_url = "https://api.github.com/repos"
        self.separator = "/"
        self.username = user_name
        self.token = token

        self.branch = {}
        self.release_info = {}
        self.release_ver = {}
        self.release_modules = {}
        self.release_module_download_url = {}

        self.session = requests.session()
        self.session.auth = (self.username, self.token)


    def get_branch(self):
        url = self.rest_url + self.separator + self.owner + self.separator + self.repository + self.separator + "branches"
        response = self.session.get(url)
        if response.status_code == 200:
            branch_info = json.loads(response.text)
            branch_num = len(branch_info)
            if branch_num:
                self.branch = {}
                for i in range(0, branch_num):
                    self.branch[i] = branch_info[i].get("name")
        return self.branch


    def get_release_info(self):
        self.release_info.clear()

        url = "{0}/{1}/{2}/releases".format(self.rest_url, self.owner, self.repository)
        response = self.session.get(url)

        status_code = response.status_code
        if status_code == 200:
            # convert JSON data to Python object, here is list
            release_info = json.loads(response.text)

            # get each firmware information corresponding to each release
            release_num = len(release_info)
            if release_num:
                for i in range(0, release_num):
                    firmware_info = re.findall(r'\[ESP.*?zip\)', release_info[i].get("body"))
                    self.release_info[release_info[i].get("name")] = firmware_info
        else:
            print(f"get release info failed, error:{status_code}")

        return self.release_info

    def get_release_version(self):
        self.release_ver.clear()

        # first check self.release_info
        if len(self.release_info):
            index = 0
            for key, value in self.release_info.items():    # key is release version here
                self.release_ver[index] = key
                index = index + 1
        else:
            url = "{0}/{1}/{2}/releases".format(self.rest_url, self.owner, self.repository)
            response = self.session.get(url)

            status_code = response.status_code
            if status_code == 200:
                # convert JSON data to Python list, here is list
                release_info = json.loads(response.text)
                release_num = len(release_info)
                if release_num:
                    for i in range(0, release_num):
                        # each element in the list is a dictionary
                        self.release_ver[i] = release_info[i].get("name")

            else:
                print(f"get release version failed, error:{status_code}")

        return self.release_ver

    def get_release_modules(self, version):
        self.release_modules.clear()

        for release_version in self.release_ver.values():
            if release_version == version:
                release_modules_info = self.release_info.get(version)
  
                # resolves supported modules from a list of specified version information
                # the content of the list are as follows:
                # ['[ESP32-C3-MINI-1_AT_Bin_V2.4.1.0.zip](https://github.com/espressif/esp-at/files/9289473/ESP32-C3-MINI-1_AT_Bin_V2.4.1.0.zip)']
                for i in range(0, len(release_modules_info)):
                    module = re.findall(r'(?<=\[).*?(?=_AT)', release_modules_info[i])
                    self.release_modules[i] = module[0]

        return self.release_modules

    def get_release_module_download_url(self, version):
        self.release_module_download_url.clear()

        for release_version in self.release_ver.values():
            if release_version == version:
                release_modules_info = self.release_info.get(version)

                # resolves supported modules from a list of specified version information
                # the content of the list are as follows:
                # ['[ESP32-C3-MINI-1_AT_Bin_V2.4.1.0.zip](https://github.com/espressif/esp-at/files/9289473/ESP32-C3-MINI-1_AT_Bin_V2.4.1.0.zip)']
                # in the dictionary, the key is module and the value is URL, the content of the dictionary are as follows:
                # {'ESP32-C3-MINI-1': 'https://github.com/espressif/esp-at/files/9289473/ESP32-C3-MINI-1_AT_Bin_V2.4.1.0.zip'}
                for i in range(0, len(release_modules_info)):
                    name = re.findall(r'(?<=\[).*?(?=_AT)', release_modules_info[i])
                    url = re.findall(r'https.*?(?=\))', release_modules_info[i])
                    self.release_module_download_url[name[0]] = url[0]

        return self.release_module_download_url

    def get_spec_release_module_download_url(self, version, module_name):
        self.get_release_module_download_url(version)
        return self.release_module_download_url.get(module_name)


其次就是將剩余的一些操作(包括指定下載版本、指定下載模塊、下載固件并解壓、將固件下載到對(duì)應(yīng)開發(fā)板中),這部分操作放到了 download.py 中。

#!/usr/bin/env python3
#
# Copyright (C) 2021 alson <tx_danyang@163.com>
# This file is subject to the terms and conditions defined in
# file 'LICENSE', which is part of this source code package.

from distutils.log import debug
import sys
import os
import getopt
import logging
import requests
import zipfile
import serial
import serial.tools.list_ports
from tqdm import tqdm
from gitdownload import GitDownload

def get_bin_path(file_name):
    file_path = ""

    if not os.path.exists(file_name):
        logging.error(f"no specified file found")
        return file_path

    ret = zipfile.is_zipfile(file_name)
    if not ret:
        logging.error(f"no specified format (zip) found")
        return file_path
    else:
        if not os.path.exists(file_name[0:-4]):
            fz = zipfile.ZipFile(file_name, 'r')
            for file in fz.namelist():
                fz.extract(file, file_name[0:-4])

        for root, dirs, files in os.walk(file_name[0:-4]):
            if root.split('/')[-1] == "factory":
                for file in files:
                    if file.split('.')[-1] == "bin":
                        file_path = os.path.join(root, file)

    return file_path

def get_serial_ports_list():
    serial_ports_dict = {}

    serial_ports_list = list(serial.tools.list_ports.comports())
    index = 0
    if len(serial_ports_list):
        for port_name in list(serial_ports_list):
            serial_ports_dict[index] = port_name[0]
            index += 1

    return serial_ports_dict

def download_firmware(url):
    download = requests.head(url, allow_redirects=True)
    header = download.headers

    file_size = int(header.get('Content-Length'))
    logging.info(f"file_size is {file_size}")

    file_name = (header.get('Content-Disposition')).split('=')[-1]
    logging.info(f"file_name is {file_name}")
    if os.path.exists(file_name):
        logging.info(f"{file_name} already exists")
        return file_name

    pbar = tqdm(desc = "downloaded: ", total=file_size, unit='B', unit_scale=True)
    download = requests.get(url, stream=True)
    downloaded_size = 0
    with open(file_name, "wb") as fb:
        for size in download.iter_content(1024):
            if size:
                fb.write(size)
                downloaded_size += len(size)
                percent = int((downloaded_size / file_size) * 100)
                pbar.update(len(size))
    pbar.close()

    return file_name

if __name__ == '__main__':
    opts,args = getopt.getopt(sys.argv[1:], '-h -d:',['help', 'debug='])

    for arg_name, arg_value in opts:
        if arg_name in ('-d', '--debug'):
            if arg_value in ("debug", "info", "warning", "error", "critical"):
                if arg_value == "debug":
                    logging.basicConfig(level=logging.DEBUG)
                elif arg_value == "info":
                    logging.basicConfig(level=logging.INFO)
                elif arg_value == "warning":
                    logging.basicConfig(level=logging.WARNING)
                elif arg_value == "error":
                    logging.basicConfig(level=logging.ERROR)
                else:
                    logging.basicConfig(level=logging.CRITICAL)
            else:
                logging.error("debug arg must be in {\"debug\", \"info\", \"warning\", \"error\", \"critical\"}")
                sys.exit(-1)
        if arg_name in ('-h', '--help'):
            print(f"usage: download.py [-h][-d {{debug, info, warning, error, critical}}]")
            sys.exit(0)

    # get release information
    # token please refer to you GitHuh account Setting -> Developer settings -> Personal access tokens
    git_download = GitDownload("espressif", "esp-at", "Alson-tang", "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
    release_info = git_download.get_release_info()
    if not len(release_info):
        logging.error(f"no release info found")
        sys.exit(-1)
    logging.debug(f"{release_info}")

    # get release version
    release_ver = git_download.get_release_version()
    if len(release_ver):
        for key, value in release_ver.items():
            print(f"{key}: {value}")
        version_index = input("please enter the version index:")
        version = release_ver.get(int(version_index))
    else:
        logging.error(f"no release version found")
        sys.exit(-1)

    # get modules under the specified version
    release_modules = git_download.get_release_modules(version)
    if len(release_modules):
        for key, value in release_modules.items():
            print(f"{key}: {value}")

        module_index = input("please enter the module index: ")
        module = release_modules.get(int(module_index))
    else:
        logging.error(f"no release module found")
        sys.exit(-1)

    # get the firmware download address of the specified version and the specified module
    url = git_download.get_spec_release_module_download_url(version, module)
    logging.info(f"url is {url}")

    download_file_name = download_firmware(url)
    logging.info(f"download file name is {download_file_name}")

    # traverse the directory to find the bin file
    bin_file_path = get_bin_path(download_file_name)
    if bin_file_path == "":
        logging.error(f"no bin file found")
        sys.exit(-1)
    logging.info(f"bin path is {bin_file_path}")

    # get available serial ports
    serial_ports = get_serial_ports_list()
    if len(serial_ports):
        for key, value in serial_ports.items():
            print(f"{key}: {value}")

        serial_port_index = input("please enter the serial port index: ")
        serial_port = serial_ports.get(int(serial_port_index))
    else:
        logging.error(f"no available serial port")
        sys.exit(-1)

    # call esptool.py to download firmware
    if module.split('-')[1] == "C3":
        chip_module = "esp32c3"
    else:
        chip_module = "esp32"

    command = "esptool.py -p {0} -b 921600 --before default_reset --after hard_reset --chip {1} write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x0 {2}".format(serial_port, chip_module, bin_file_path)
    logging.info(f"{command}")
    os.system(command)

    sys.exit(0)

整個(gè)代碼的邏輯其實(shí)沒(méi)那么復(fù)雜,總結(jié)起來(lái)可以分為以下幾步:

  1. 獲取所有發(fā)布的版本
  2. 指定要下載的版本,獲取該版本支持的模塊
  3. 指定模塊后下載固件到當(dāng)前目錄(如果當(dāng)前目錄下已有對(duì)應(yīng)的固件版本,則跳過(guò))
  4. 獲取所有可用串口
  5. 指定串口后將下載的固件自動(dòng)下載到開發(fā)板中

可以先閱讀 README 了解更多詳細(xì)的信息。

以下是運(yùn)行腳本的 LOG

  1. 獲取所有發(fā)布的版本(esp-at 發(fā)布的所有版本都將在此處列出。 假設(shè)你輸入 0,你要下載的版本是 v2.4.1.0

    0: v2.4.1.0
    1: v2.4.0.0
    2: v2.3.0.0_esp32c3
    3: v2.2.1.0_esp8266
    4: v2.2.0.0_esp32
    5: v2.2.0.0_esp8266
    6: v2.2.0.0_esp32c3
    7: v2.1.0.0_esp32s2
    8: v2.1.0.0_esp8266
    9: v2.1.0.0_esp32
    10: v2.1.0.0-rc2_esp32
    11: v2.1.0.0-rc1_esp8266
    12: v2.1.0.0-rc1_esp32
    13: v2.0.0.0_esp32
    14: v2.0.0.0_esp8266
    15: v1.2.0.0
    16: v1.1.3.0
    17: v1.1.2.0
    18: v1.1.1.0
    19: v1.1.0.0
    20: v1.0.0.0
    21: v0.10.0.0
    please enter the version index:
    
  2. 指定要下載的版本,獲取該版本支持的模塊(v2.4.1.0 下的所有模塊都將在此處列出。 這個(gè)版本只對(duì)應(yīng)一個(gè)模塊,這里輸入 0

    0: ESP32-C3-MINI-1
    please enter the module index:
    
  3. 指定模塊后下載固件到當(dāng)前目錄(如果當(dāng)前目錄下已有對(duì)應(yīng)的固件版本,則跳過(guò))

  4. 獲取所有可用串口

    0: /dev/ttyS0
    1: /dev/ttyUSB1
    2: /dev/ttyUSB0
    please enter the serial port index:
    
  5. 指定串口后將下載的固件自動(dòng)下載到開發(fā)板文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-410027.html

    esptool.py v3.1-dev
    Serial port /dev/ttyUSB0
    Connecting....
    WARNING: This chip doesn't appear to be a ESP32-C3 (chip magic value 0x1b31506f). Probably it is unsupported by this version of esptool.
    Chip is unknown ESP32-C3 (revision 3)
    Features: Wi-Fi
    Crystal is 40MHz
    MAC: 84:f7:03:09:17:f4
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 921600
    Changed.
    Configuring flash size...
    Auto-detected Flash size: 4MB
    Compressed 4194304 bytes to 878431...
    Writing at 0x000fa2d8... (40 %)
    

到了這里,關(guān)于GitHub 自動(dòng)下載 Release 固件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 引入成熟的Pytest自動(dòng)化測(cè)試框架

    引入成熟的Pytest自動(dòng)化測(cè)試框架

    雖然我們能使用腳本編寫自動(dòng)化測(cè)試框架,但沒(méi)有必要重復(fù)找車輪子, 引入成熟的自動(dòng)化測(cè)試框架 即可, Pytest是目前最成熟、功能最全面的Python測(cè)試框架之一 ,簡(jiǎn)單靈活、易于上手,可完全兼容其他測(cè)試框架如unitest,支持參數(shù)化和測(cè)試編排功能,擴(kuò)展性強(qiáng)。 1、安裝Pytes

    2024年02月20日
    瀏覽(16)
  • github中fork其它項(xiàng)目過(guò)來(lái)后,想要自己打標(biāo)簽以及添加release

    github中fork其它項(xiàng)目過(guò)來(lái)后,如何打標(biāo)簽以及添加release。 (我一直以為github遠(yuǎn)程倉(cāng)庫(kù)中可以直接操作,沒(méi)想到進(jìn)入到循環(huán)中,new release需要tag,new tag需要release) 給出后續(xù)的操作步驟: 1. 在本地克隆 fork 過(guò)來(lái)的倉(cāng)庫(kù) 2. 切換到 master 分支 3. 添加標(biāo)簽 其中 1.0 是標(biāo)簽名稱,-m 是一份

    2024年02月07日
    瀏覽(22)
  • DSMM數(shù)據(jù)安全能力成熟度模型及配套實(shí)施指南筆記(附原文下載)

    DSMM數(shù)據(jù)安全能力成熟度模型及配套實(shí)施指南筆記(附原文下載)

    《GBT 37988-2019 信息安全技術(shù) 數(shù)據(jù)安全能力成熟度模型》和《數(shù)據(jù)安全能力建設(shè)實(shí)施指南》原文下載鏈接在文末 ???? 2020年3月1日《GBT 37988-2019 信息安全技術(shù) 數(shù)據(jù)安全能力成熟度模型》正式實(shí)施,該標(biāo)準(zhǔn)適用于對(duì)企業(yè)、組織對(duì)數(shù)據(jù)安全能力進(jìn)行評(píng)估和作為數(shù)據(jù)安全能力建設(shè)的

    2024年02月09日
    瀏覽(23)
  • 極路由怎么升級(jí)固件如何自己下載升級(jí)固件

    極路由作為一家純正的互聯(lián)網(wǎng)公司開發(fā)的硬件產(chǎn)品,不斷更新升級(jí)的固件是其一大特色,哪像TP等廠商的無(wú)線路由器固件壓根就不升級(jí)。極路由雖然會(huì)自動(dòng)檢測(cè)固件更新,但下載升級(jí)仍需要自己動(dòng)手。 路由器固件升級(jí)步驟 1.在電腦上用瀏覽器打開極路由后臺(tái)管理地址hiwifi.co

    2024年02月07日
    瀏覽(13)
  • GD32單片機(jī)遠(yuǎn)程升級(jí)下載,手機(jī)在線升級(jí)下載程序,GD32在線固件下載升級(jí),手機(jī)下載程序固件方法

    GD32單片機(jī)遠(yuǎn)程升級(jí)下載,手機(jī)在線升級(jí)下載程序,GD32在線固件下載升級(jí),手機(jī)下載程序固件方法

    ? ? ? ? GD32、STM32單片機(jī),是我們最常見的一種MCU。通常我們?cè)谑褂肧TM32單片機(jī)都會(huì)遇到程序在線升級(jí)下載的問(wèn)題。 ? ? ? ? GD32/STM32單片機(jī)的在線下載通常需要以下幾種方式完成: ? ? ? 1、使用ST/GD提供的串口下載工具,本地完成固件的升級(jí)下載。 ? ? ? ?2、自行完成系統(tǒng)

    2024年02月02日
    瀏覽(28)
  • OpenHarmony應(yīng)用簽名 - DevEco Studio 自動(dòng)簽名(4.0-Release)

    OpenHarmony應(yīng)用簽名 - DevEco Studio 自動(dòng)簽名(4.0-Release)

    開發(fā)環(huán)境:Windows 11 DevEco Studio 版本:DevEco Studio 4.0 Release(4.0.0.600) SDK 版本:4.0.10.13 開發(fā)板型號(hào):DAYU200(RK3568) 系統(tǒng)版本:OpenHarmony-4.0-Release 為了保證? OpenHarmony ?應(yīng)用的完整性和來(lái)源可靠,在應(yīng)用構(gòu)建時(shí)需要對(duì)應(yīng)用進(jìn)行簽名。經(jīng)過(guò)簽名的應(yīng)用才能在設(shè)備上安裝、運(yùn)行、和調(diào)

    2024年02月03日
    瀏覽(20)
  • 360安全路由無(wú)法升級(jí)固件?360安全路由器固件升級(jí)下載失敗解決辦法

    ? 360安全路由無(wú)法升級(jí)固件失敗怎么辦?才買的360路由器,想升級(jí)固件但每次都才升級(jí)了一點(diǎn)就顯示升級(jí)失敗了這可如何是好,其實(shí)這很正常新東西嘛,還是首批,沒(méi)關(guān)系下面小編就來(lái)為大家解決這一棘手的問(wèn)題。 360安全路由無(wú)法升級(jí)固件解決辦法 其實(shí)很簡(jiǎn)單,在上網(wǎng)設(shè)置

    2024年02月06日
    瀏覽(19)
  • STM32CubeMX——固件庫(kù)下載以及安裝

    STM32CubeMX——固件庫(kù)下載以及安裝

    為了方便自己,于是方便了大家。 1 ——打開下面的鏈接 ST官網(wǎng)鏈接 2——下載stm32標(biāo)準(zhǔn)外設(shè)庫(kù) 我要用STMCubeG413rbt6,所以我選擇STM32CubeG4系列 點(diǎn)擊 點(diǎn)擊 點(diǎn)擊【1.5.0】 后會(huì)彈出一個(gè)協(xié)議 點(diǎn)擊【接受】,下載成功 當(dāng)你接受后,如果你是第一次的話,看下面 注意 當(dāng)你接受后,如

    2023年04月10日
    瀏覽(24)
  • 第1章 openwrt代碼下載及固件編譯

    第1章 openwrt代碼下載及固件編譯

    第1章 OpenWrt代碼下載及固件編譯 1.1 代碼下載 源代碼可以如下兩種方式來(lái)獲取: ? 從openwrt官網(wǎng)提供的git倉(cāng)庫(kù)進(jìn)行下載 ? 從網(wǎng)上(例某寶)購(gòu)買了開發(fā)板后,客服會(huì)提供適配了開發(fā)板的代碼git鏈接 我們這里以第一種獲取方式來(lái)講解代碼的下載, 打開如下網(wǎng)址,獲取git倉(cāng)庫(kù):

    2024年02月10日
    瀏覽(16)
  • Rockchip官方開發(fā)板的Android固件下載地址匯總

    這里匯總Rockchip官方開發(fā)板的Android固件地址 注:開發(fā)板絲印一般在板子的正面或者背面有印硬件版本號(hào)和板型 Android版本開發(fā)板絲印 RK_EVB1_RK3588_LP4XD200P232SD10H1_V11_20211215YWQ_final Android12 鏈接:https://pan.baidu.com/s/1LXwnlsRjrioUo1YERyiF3g 提取碼:mn2v Android版本開發(fā)板絲印 RK_EVB1_RK3588

    2024年02月04日
    瀏覽(81)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包