Microsoft 파일의 간편한 통합 동기화

13316 단어 esp32MicroPythontech

개시하다


ESP32+Micropython저번을 계속 하면 PC에서 Micropython판으로 파일을 전송하는 ampy가 편리하지만 파일이 많으면 좀 불편하다.
그래서 이번 주제는 ampy를 편하게 해주고 싶다는 것이다.
다음과 같은 지침을 정했습니다.
  • PC와 Micropythhon 장치에 있는 파일을 계산하고 비교하는 SHA1
  • 비교 결과에 따라ampy의 명령열을 만듭니다
  • ampy의 명령열을sh에 부여하여 실제 전송
  • PC→장치(push)
  • 장비→PC(backup)
  • 이를 실현하는 pinot-mirror라는 스크립트를 만들었습니다.
    아래 설명과 관련된 코드는 GiitHub에 있습니다.
    주로scripts에서Makefile에 기술된 것과 관련이 있습니다

    pinot-mirror 스크립트


    이런 지령입니다.
    git clone https://github.com/yoshinari-nomura/pinot.git
    ./scripts/pinot-mirror
    Mirror local directory to MicroPython board and vice versa.
    
    Usage: pinot-mirror [-p PORT] [-d] SRC DEST
      -d        Show SHA1 digests for each file (for debug).
      -h        Show this message.
      -p PORT   Set name of serial PORT for connected board.
      SRC, DEST: Existing local directory or "ampy:"
    
    CAVEAT: pinot-mirror removes extraneous files from DEST.
    
    예를 들어 PC에 추가/변경/삭제된 src 디렉토리의 내용을 보드에 반영하려면 다음과 같이 하십시오.
    ./scripts/pinot-mirror -p /dev/ttyUSB0 src ampy:
    
    결과:
    ampy rm /fonts/shnmk16u.pfn
    ampy put src/lib/ili9341.py /lib/ili9341.py
    ampy put src/main.py /main.py
    
    이렇게 되면 무슨 일이 일어날지 확인했으니sh에게 파이프를 건네주자.
    ./scripts/pinot-mirror -p /dev/ttyUSB0 src ampy: | sh -v
    
    보드의 차등 백업을 수행하려면 다음과 같이 하십시오.
    창고의 Makefile에 상기 목표가 있습니다.

    pinot-mirror의 파일 동기화 방법


    그 전에


    pinot-mirror가ampy를 사용했기 때문에ampy에 대해 조금 설명할게요.
    ampy는 USB(UART)를 통해 Micropython판의 파일을 읽고 쓰는 도구입니다. 예를 들어 PC의 file입니다.py를 보드에 전송할 때 ampy put file.py /lib/file.py처럼 사용할 수 있어 편리합니다.
    다만, 개발 과정에서 여러 파일을 편집하면서 실험을 진행하면 손 옆에 변경된 파일이 있는지 확인하고 하나씩 전달하는 것은 번거롭다.
  • PC의 파일 중 업데이트된 파일이 전송되어야 하는지 모름
  • 너무 귀찮아서 폴더를 한꺼번에 덮어쓰는 경우가 많아요. 플래시 수명도 걱정돼요
  • 번거로운 백업
  • 마이크로파이톤 보드가 여러 장 있다면 어느 보드의 파일이 PC의 어느 폴더에 백업되었는지 알 수 없습니다.
  • 쌍방이 SHA1을 획득하다


    ESP32 보드 때문인지 MS에서 파일 그룹을 얻는 SHA1은 생각보다 간단해 아래 코드로 얻을 수 있다.
    digest-files.py
    mkdir backup
    ./scripts/pinot-mirror -p /dev/ttyUSB0 ampy: backup | sh -v
    
    실행 방법과 실행 결과는 예컨대 이렇다. 이후에 비교하기 쉽도록 미리 설명해라. (사실 CRLF → LF의 변경도 필요하다)
    #!/usr/bin/env python3
    
    import binascii
    import hashlib
    import re
    import os
    import sys
    
    class DigestDirtree:
        def isdir(self, path):
    	return os.stat(path)[0] & 0x4000 != 0
    
        def digest(self, path, echo = True):
    	hash = hashlib.sha1()
    
    	if self.isdir(path):
    	    path = re.sub('/$', '', path) + '/'
    	    for child in sorted(os.listdir(path)):
    		cpath = path + child
    		hash.update(self.digest(cpath))
    		hash.update(child.encode())
    	else:
    	    with open(path, 'rb') as file:
    		while True:
    		    s = file.read(512)
    		    if len(s) <= 0:
    			break
    		    hash.update(s)
    	sha1 = hash.digest()
    	if echo:
    	    print(str(binascii.hexlify(sha1), 'ascii'), path)
    	return sha1
    
    if __name__ == '__main__':
        dir = sys.argv[1] if len(sys.argv) > 1 else '/'
        DigestDirtree().digest(dir)
    
    digest-remote.log
    git clone https://github.com/yoshinari-nomura/pinot.git
    export AMPY_PORT=/dev/ttyUSB0
    ampy run ./scripts/digest-files.py | sort -k 2
    
    이 스크립트는 로컬 PC(Pythhon3)에서도 마찬가지로 실행됩니다. 예를 들어, src/아래에 검사기와 동기화된 파일이 있는 경우
    12596e1ee44ed14ff56a7706585b2f76209bf0bb /
    3947b36ed837906d45bee3e0d8a0befa17d9052c /boot.py
    a09cc03731adfdc9053523544d0538902be6f024 /fonts/
    87bebcaa5b7158a7f6193aa89a31f87f87b732cb /fonts/shnmk12u.pfn
    5135ca0fdf22092df3cfa4cbc31de5db9f93a11e /fonts/shnmk16u.pfn
    a0ce8d58b9fbbba0ced3516e825a6353da412145 /lib/
    d402b5efd76cabcee2b6753a37e6e902a716b43e /lib/configserver.py
    ea5aeccb7b4d8045ff504e190817b35883f76082 /lib/jsonconfig.py
    79d8bbc24e338b87385477ceecd8d710c76ee32b /lib/mqtt.py
    2899e94ec033003df7a0437a39e82eef92ba39d5 /lib/pnfont.py
    8e6ead2602c64ae571aeebbc5a95024aea4ffb1e /main.py
    
    sed조정을 통해 판의 출력과 동일하게/얻은 결과입니다.
    여기는 이런 느낌입니다.
    digest-local.log
    (cd src; ../scripts/digest-files.py .) | sort -k 2 | sed 's! [.]/! /!'
    
    이 두 개만 비교해.

    비교 SHA1


    SHA1 테이블이 두 개면 나머지는 간단합니다.
    집행 결과는 이렇다.
    digest-diff.log
    c2a2bd20281d333fafabd6a0ce94052a43a3cab9 /
    3947b36ed837906d45bee3e0d8a0befa17d9052c /boot.py
    cc54df5e7fe76ab95f71ae56d4be3a0ed50f0831 /fonts/
    87bebcaa5b7158a7f6193aa89a31f87f87b732cb /fonts/shnmk12u.pfn
    fdec0d3d3b74a0b6702c1c84e330ddabf2abb07a /lib/
    d402b5efd76cabcee2b6753a37e6e902a716b43e /lib/configserver.py
    b0c8fadf2463267c53f8c9f6ae8098f6ca84cd31 /lib/ili9341.py
    ea5aeccb7b4d8045ff504e190817b35883f76082 /lib/jsonconfig.py
    79d8bbc24e338b87385477ceecd8d710c76ee32b /lib/mqtt.py
    2899e94ec033003df7a0437a39e82eef92ba39d5 /lib/pnfont.py
    ef923b09e3d1dbd829f5ce1fafb0cc7562048f22 /main.py
    
    왼쪽은 보드의 한쪽, 오른쪽은 로컬 PC의 한쪽 SHA1입니다.
    좀 못생겼어요. 이 탁자에서 다음과 같은 차이를 볼 수 있어요.
  • /fonts/shnmk16u.pfn이 PC에 없음
  • /lib/ili9341.py가 보드에 없음
  • /main.py 쌍방이 다르다
  • 디렉토리의 SHA1은 부하의 파일에 따라 다릅니다.0000000000000000000000000000000000000000 이 정보를 바탕으로ampy의 명령열을 출력합니다.

    끝말


    오늘은 피곤하니 여기까지만 하자.
    아시다시피 pinot는 조개 스크립트입니다. 지령선에서 시행 오류가 발생하면 어느새 완성됩니다.
    제가 스크립트를 쓸 때 이번pinot-mirror처럼 조개껍질을 파이프로 먹게 하는 지령열을 출력하는 경우가 많아요. quote는 좀 번거롭지만 편하지 않아요?예를 들어 무시하고 싶은 파일이 있으면 pinot-mirror 조개에게 건네주면 된다.

    좋은 웹페이지 즐겨찾기