ESP32 - MicroPython을 사용하여 Discord-Webhooks에 요청

소개



ESP32 - MicroPython을 사용하여 Discord-Webhooks에 요청하는 방법을 설명합니다.
※Discord의 소개나 설정 순서는 할애합니다.



개발 환경



다음이 확인한 환경입니다.
  • 호스트 PC
  • windows10 64bit Home
  • VSCode - 1.48.0
  • Pymakr 1.1.5

  • NodeJS - 12.14.1 LTS

  • 타겟
  • MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32


  • ※MicroPython의 환경 구축은, 「 ESP32-VSCode-microPython으로 개발 환경 구축 」를 참조 바랍니다.

    장비




    품목
    형명
    비고


    ESP32-WROOM-32 개발 보드
    [NodeMCU-32S ESP32-WROOM-32]



    코드



    동작 확인한 코드는 다음과 같습니다.


    코드
    설명
    비고


    SSID
    액세스 포인트의 SSID
    -

    PASS
    액세스 포인트 비밀번호
    -

    URL
    Discord - webhook URL
    -



    discord.py
    import network
    import time
    import urequests as requests
    
    # AP
    SSID = "XXXXXXXXXXXXX"
    PASS = "YYYYYYYYYYYYY"
    
    # discord webhook url
    URL = "https://discord.com/api/webhooks/aaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    
    def do_connect():
    
        wlan = network.WLAN(network.STA_IF)
        wlan.active(True)
        if not wlan.isconnected():
            print('connecting to network...')
            wlan.connect(SSID, PASS)
            while not wlan.isconnected():
                time.sleep(1)
        print('network config:', wlan.ifconfig())
    
        return
    
    
    def main():
        do_connect()
        payload = """content=This message is sent by "ESP32"."""
        response = requests.post(URL, headers={"Content-Type": "application/x-www-form-urlencoded"}, data=payload)
        response.close()
    
    
    main()
    
    

    실행 방법


    >>> import discord
    

    결과





    메모리 문제



    위의 코드 자체는 작동하지만,
    다양한 기능을 넣으면 OS 오류 (MemoryError)가 발생합니다.

    HTTPS 통신이 필요하기 때문에 여기에 메모리를 많이 사용하는 것 같습니다.
    여러가지 시도해 보았습니다만, 이하의 방법으로 회피할 수 있을까 생각됩니다.
  • 단일 스레드로 만들기
  • 능동적으로 가비지 수집을 실시한다
  • C 언어로 구현
  • 장치 변경

  • 단일 스레드로 만들기



    각 처리를 스레드로 만드는 것만으로도 메모리를 상당히 소비합니다.
    또한 MicroPython에서는 Queue 등을 사용할 수 없습니다.
    만약, socket 통신으로 thread간의 통신을 실시하면 이것도 메모리를 사용합니다.
    전처리를 메인 루프로 실시하도록 만들어 주는 것이 좋을 것 같습니다.

    능동적으로 가비지 수집을 실시



    MicroPython의 가비리 콜렉션이 실행되는 조건은 메모리의 여유가 있는 일정값보다 작아진 경우입니다.
    ※빈 용량은 설정할 수 있습니다.

    HTTPS 통신으로 큰 메모리 취득이 발생하기 때문에 그 직전에 능동적으로 가베레지 컬렉션을 실시하는 것이 무난합니다.
    다음 코드로 구현할 수 있습니다.
    import gc
    
    gc.collect()
    

    C 언어로 구현



    MicroPython은 파일을 읽고 실행하기 때문에 고정 코드가 아닌 한 메모리에 불리합니다.
    C 언어라면, 조금 더 메모리를 줄일 수 있다고 생각합니다.
    이전에 같은 기기에서 FreeRTOS에서 이번과 같은 코드를 작성한 적이 있습니다.
    특히 문제는 일어나지 않았다고 기억합니다.

    기기 변경



    원래 512KByte에서 실행하는 데 문제가 있습니다.
    ESP32-WROVER 시리즈라면 4MByte RAM이 있습니다.
    간단하지만 가격이 오르기 때문에 괴로운 곳입니다.

    참고


  • micropython document
  • github - urequests
  • 좋은 웹페이지 즐겨찾기